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
**
資料傾斜
-
自定義分割槽函式
-
如果對分析的資料足夠了解的話可以自定義分割槽函式進行分割槽 使map所分的每個區裡需處理資料量相當這樣每個reduce所需處理的資料量也就差不多了
-
例 如 在 年份 : 不同時候記錄的溫度 資料中處理得到每個年的最高氣溫中假設1990年到2000年資料有1萬條 2000到2010有100萬條 2010到有一萬條 那我們取2003年和2006年為2個分割槽的點
-
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; }
-
取樣分割槽
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