1. 程式人生 > >2018.11.9左右 大資料學習個人這幾天的總結與回顧

2018.11.9左右 大資料學習個人這幾天的總結與回顧

檔案格式:SequenceFile

1.SequenceFile
         Key-Value對的方式儲存。

2.不是文字檔案,是二進位制檔案。

3.可切割
	因為有同步點。
	reader.sync(pos);	//定位到pos之後的第一個同步點。
	writer.sync();		//寫入同步點

4.壓縮方式
	不壓縮
	record壓縮			//只壓縮value
	塊壓縮				//按照多個record形成一個block.

檔案格式:MapFile

1.採用Key-value對的方式儲存
2.key按升序寫入(可重複)。
3.mapFile對應一個目錄,目錄下有index和data檔案,都是序列檔案。
4.index檔案劃分key區間,用於快速定位。

自定義分割槽函式

1.定義分割槽類
	public class MyPartitioner extends Partitioner<Text, IntWritable>{
		public int getPartition(Text text, IntWritable intWritable, int numPartitions) {
			return 0;
		}
	}
2.程式中配置使用分割槽類
	job.setPartitionerClass(MyPartitioner.class);

combinerd(合成) 繼承了Reducer 任何的Reducer類都能被他使用

Map端的Reducer 預先化簡 1,為了減少網路頻寬 將Map端發出的的資料進行聚合 並不是所有的都可以用combiner 2,combiner

**

資料傾斜

  1. 自定義分割槽函式

  2. 如果對分析的資料足夠了解的話可以自定義分割槽函式進行分割槽 使map所分的每個區裡需處理資料量相當這樣每個reduce所需處理的資料量也就差不多了

  3. 例 如 在 年份 : 不同時候記錄的溫度 資料中處理得到每個年的最高氣溫中假設1990年到2000年資料有1萬條 2000到2010有100萬條 2010到有一萬條 那我們取2003年和2006年為2個分割槽的點

  4.   public int getPartition(IntWritable key, IntWritable values, int i) {
            if(key.get()<2003)
             return 0;
            else if(key.get()<2006)
                 return 1;
             else
                 return 2;
         }
    
  5. 取樣分割槽

Hadoop預設的分割槽器是基於map輸出鍵的雜湊值分割槽。這僅在資料分佈比較均勻時比較好。在有資料傾斜時就很有問題。

用TotalOrderPartitioner中的取樣函式進行取樣 更加精準的得到分割槽臨界點剩下的和自定義分割槽差不多 只不過用採用方式來設定分割槽界限更加可靠

3.combiner 使用conbiner可以極大縮小資料在reduce中重複出現的次數可以很好的優化資料傾斜

MAP REDUCE map1 aaa 1 aaa (1+1+1+1+1+1) aaa 1 aaa 1 bbb 1 bbb(1+1)

map2 aaa 1 aaa 1 aaa 1 bbb 1

設定combiner後;

MAP REDUCE map1 aaa 1 aaa 3 aaa (3+3) aaa 1 combiner bbb 1 bbb 1 bbb(1+1) aaa 1

map2 aaa 1 aaa 3 aaa 1 combiner bbb 1 bbb 1 aaa 1

可見在reduce端重複出現的aaa 少了很多減少了資料傾斜的情況

MutltiInputs(多輸入);使用多個輸入作為job的輸入來源

也就是在InputFormat 前把新增各種不同的序列源 裡面的方法也就是 addInputPath等等。。。。 map也可以在這個流程中套進來

      //設定文字輸入    
      MultipleInputs.addInputPath(job,new Path("file:///d:/sisi/sujvtext"),TextInputFormat.class,TextMapper.class);
     //設定序列檔案輸入
    MultipleInputs.addInputPath(job,new Path("file:///d:/sisi/sujvseq"), SequenceFileInputFormat.class,SeqMapper.class);

全排序

1.定義1個reduce

2.自定義分割槽函式.
	自行設定分解區間。

3.使用hadoop取樣機制。
	通過取樣器生成分割槽檔案,結合hadoop的TotalOrderPartitioner進行分區劃分。
	TotalOrderPartitioner		//全排序分割槽類,讀取外部生成的分割槽檔案確定區間。

	使用時取樣程式碼在最後端,否則會出現錯誤。

	//分割槽檔案設定,設定的job的配置物件,不要是之前的conf.
	TotalOrderPartitioner.setPartitionFile(job.getConfiguration(),new Path("d:/mr/par.lst"));

倒排序

KV對調。

ObjectInputStream ObjectOutputStream

oos.write(); ois.read();

二次排序

Key是可以排序的。
需要對value排序。
1.自定義key