Hadoop進階(hadoop streaming c++實現 & MapReduce參數調優)

目錄:

1,機器學習 & MR

Hadoop進階(hadoop streaming c++實現 & MapReduce參數調優)

hadoop streaming (shell執行 & combiner & 數據分割)

hadoop streaming python 處理 lzo 文件遇到的問題

spark安裝與調試

推薦算法之Jaccard相似度與Consine相似度

LibLinear使用總結

深度學習在推薦領域的應用 

2,tensorflow 安轉與使用

Tersorflow深度學習入門—— CIFAR-10 訓練示例報錯及解決方案

tensorflow 之 bazel安裝 & 使用

Python的庫sklearn安裝 & bazel安裝 & cmake

TF(tensorflow)安裝之python

GBDT 之 Boosting方法

GBDT安裝(xgboost LightGBM),

3,工具安裝

linux export 環境變量設置   

urlencode & quote & unquote (url 中帶中文參數)  

linux crontab -e報錯

configure --prefix=/ & yum install 路徑

rethat / CentOS環境配置

redis 值 hiredis (c/c++)

一、hadoop streaming c++實現 心得:

  1, Hadoop Streaming 實戰: c++編寫map&reduce程序,與python寫的map&reduce完全一致

  2,c/cpp需要事先編譯成可執行文件,-file的是-o文件,其它的例如run_hadoop.sh 的寫法完全和python一致  

  3,cat wc.data | ./mapper  | sort | ./reducer  

  4, 總之,hadoopstreaming 存在一致性, 核心是根據需求 如何書寫map&red的實現,以及選擇何種語言的問題  

  5, 例子:mapper 是c程序, reducer是python。。  

    ##time cat mid_2_vec.all | ./cc hotword_top_kw.vec   | sort | python hw_mids_reducer.py  

 6, 如何把下面的2-2進行M/R處理,由於map的對本地dic字典存在100M限制,所以wap_query_uv.bin的大小超過200M;無法執行  --- 但是,我們發現,真正有用的keywords、tags(10萬個),或者真正使>

用的名詞,不會超過100萬個吧,所以需要對wap_query_uv.bin進行過濾處理,僅僅保留10萬或者100萬個word_2_vec即可。。。(例如根據keywords/tags詞表進行過濾) 


二、MapReduce 調優

1,先上乾貨,完整shell腳本

### 2--- tasks 
HADOOP=/usr/bin/hadoop 
### /article/art_call_mids
## article
#article_dir="/search/odin/yapeng/_hadoop/code/W2V/base_data"
article_dir="../base_data"
arg_file="$article_dir/art_kw_vec.err"
local_file="$article_dir/query_app/*.vec"
#local_file="$article_dir/query_app/mid_profile_kwad.vec"
lzop -v $local_file
local_file_lzo="$article_dir/query_app/*.lzo"
input="yapeng/W2C/article/mids_vec/$DAY/"
output="yapeng/W2C/article/art_call_mids/$DAY/"
### ./cc 傳遞的參數,可不是$arg_file ../base_data/art_kw_vec.err, 而是./art_kw_vec.err job節點的本地目錄!!!!
$HADOOP fs -rm -r -skipTrash $input
$HADOOP fs -mkdir $input
$HADOOP fs -put $local_file_lzo $input
$HADOOP fs -rm -r -skipTrash $output
$HADOOP org.apache.hadoop.streaming.HadoopStreaming \
-D stream.map.input.ignoreKey='true' \
-D mapred.job.name="W2V_Call" \
-D mapred.compress.map.output=true \
-D mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
-D mapred.reduce.slowstart.completed.maps=0.6 \
-D mapred.reduce.tasks=4 \
-D mapred.output.compress=true \
-D mapred.output.compression.type=BLOCK \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
-input $input \
-output $output \
-file $arg_file \
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
-mapper "./cc ./art_kw_vec.err"  -file ./cc \
-combiner "python art_call_mids.py" -file ./art_call_mids.py \
-reducer "python art_mids_reducer.py" -file ./art_mids_reducer.py 

2,核心配置代碼講解:

(1)map的輸入爲lzo文件

-D stream.map.input.ignoreKey='true' \
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
### 這個是對於map的輸入時.lzo是必須的(lzo可以是自己本地lzop -v,並put到HDFS上的文件,也可是是某一個map/red輸出的lzo文件)
### 若是把ignoreKey 錯寫爲ignorekey 系統不會提示錯誤,但是block_id值也不會忽略
(2)對map的輸出進行壓縮lzo
-D mapred.compress.map.output=true \
-D mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
### map --》 combiner/reducer 時採用lzo壓縮格式,這對於map的輸出結果文件過大,7G數據上傳HDFS需要8分鐘,要是壓縮lzo(60%)-->5分鐘
    是非常有效的;但是既然已經存在combiner的本地歸併,輸出應該不會太大時,由於lzo解壓佔用內存需要時間(正比於壓縮時間),因此需要綜合考慮
(3) reduce的輸出進行壓縮lzo
-D mapred.output.compress=true \
-D mapred.output.compression.type=BLOCK \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
### reduce 的輸出結果進行加密,同理map的輸出,需要綜合考慮文件大小和壓縮時間

壓縮Map的輸出,這樣做有兩個好處:
a)壓縮是在內存中進行,所以寫入map本地磁盤的數據就會變小,大大減少了本地IO次數
b) Reduce從每個map節點copy數據,也會明顯降低網絡傳輸的時間
注:數據序列化其實效果會更好,無論是磁盤IO還是數據大小,都會明顯的降低。 
(4) 其它
-D mapred.reduce.slowstart.completed.maps=1 \   ## 0.6 / 0.8
-D mapred.reduce.tasks=4 \
### 當map運行慢,reduce運行很快時,如果不設置mapred.reduce.slowstart.completed.maps會使job的shuffle時間變的很長,
map運行完很早就開始了reduce,導致reduce的slot一直處於被佔用狀態。mapred.reduce.slowstart.completed.maps 這個值是
和“運行完的map數除以總map數”做判斷的,當後者大於等於設定的值時,開始reduce的shuffle。所以當map比reduce的執行
時間多很多時,可以調整這個值(0.75,0.80,0.85及以上)
(5) 本地上傳HDFS、各個任務節點的字典文件

-file $arg_file \

-mapper "./cc ./art_kw_vec.err"  -file ./cc \

-file 可以是任意的local目錄下的文件;但是mapper.py、mapper.cpp中,參數是已經分發到各個job節點的本地同一目錄文件  可以直接 ./dict_file_name

3,參考其它的更多調優

1.設置合理solt數

mapred.tasktracker.map.tasks.maximum 

每個tasktracker可同時運行的最大map task數,默認值2。

mapred.tasktracker.reduce.tasks.maximum

每個tasktracker可同時運行的最大reduce task數,默認值1。

2.配置磁盤塊

mapred.local.dir

map task中間結果寫本地磁盤路徑,默認值${hadoop.tmp.dir}/mapred/local。

可配置多塊磁盤緩解寫壓力。當存在多個可以磁盤時,Hadoop將採用輪詢方式將不同的map task中間結果寫到磁盤上。

3.配置RPC Handler數

mapred.job.tracker.handler.count

jobtracker可併發處理來自tasktracker的RPC請求數,默認值10。


4.配置HTTP線程數

tasktracker.http.threads

HTTP服務器的工作線程數,用於獲取map task的輸出結果,默認值40。

5.啓用批調度

6.選擇合適的壓縮算法

Job輸出結果是否壓縮

mapred.output.compress 

是否壓縮,默認值false。

mapred.output.compression.type

壓縮類型,有NONE, RECORD和BLOCK,默認值RECORD。

mapred.output.compression.codec

壓縮算法,默認值org.apache.hadoop.io.compress.DefaultCodec。

map task輸出是否壓縮

mapred.compress.map.output

是否壓縮,默認值false

mapred.map.output.compression.codec

壓縮算法,默認值org.apache.hadoop.io.compress.DefaultCodec。

7.設置失敗容忍度

mapred.max.map.failures.percent

作業最多允許失敗的map task比例,默認值0。

mapred.max.reduce.failures.percent

作業最多允許失敗的reduce task比例,默認值0。

mapred.map.max.attempts

一個map task的最多重試次數,默認值4。

mapred.reduce.max.attempts

一個reduce task的最多重試次數,默認值4。

8.設置跳過壞記錄

mapred.skip.attempts.to.start.skipping

當任務失敗次數達到該值時,啓用跳過壞記錄功能,默認值2。

mapred.skip.out.dir

檢測出的壞記錄存放目錄,默認值爲輸出目錄的_logs/skip,設置爲none表示不輸出。

mapred.skip.map.max.skip.records

map task最多允許的跳過記錄數,默認值0。

mapred.skip.reduce.max.skip.groups

reduce task最多允許的跳過記錄數,默認值0。

9.配置jvm重用

mapred.job.reuse.jvm.num.tasks 

一個jvm可連續啓動多個同類型任務,默認值1,若爲-1表示不受限制。

10.配置jvm參數

mapred.child.java.opts

任務啓動的jvm參數,默認值-Xmx200m,建議值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@[email protected]

11. map task調優

io.sort.mb
默認值100M

io.sort.record.percent

默認值0.05

io.sort.spill.percent

默認值0.80

12.reduce task調優

io.sort.factor
默認值10

mapred.reduce.parallel.copies

默認值5
1 -- lzop 壓縮的文件hadoop能直接用嗎
在Hadoop中使用lzo的壓縮算法可以減小數據的大小和數據的磁盤讀寫時間,不僅如此,lzo是基於block分塊的,這樣他就允許數據被分解成chunk,並行的被hadoop處理。
這樣的特點,就可以讓lzo在hadoop上成爲一種非常好用的壓縮格式。

2--				<p>.tar 解包 tar xvf filename.tar<br>
.tar 打包 tar cvf filename.tar dirname<br>
.gz 解壓1 gunzip filename.gz<br>
.gz 解壓2 gzip -d filename.gz<br>
.gz 壓縮 gzip filename<br>
.tar.gz 和 .tgz 解壓 tar zxvf filename.tar.gz<br>
.tar.gz 和 .tgz 壓縮 tar zcvf filename.tar.gz dirname<br>
.bz2 解壓1 bzip2 -d filename.bz2<br>
.bz2 解壓2 bunzip2 filename.bz2<br>
.bz2 壓縮 bzip2 -z filename<br>
.tar.bz2 解壓 tar jxvf filename.tar.bz2<br>
.tar.bz2 壓縮 tar jcvf filename.tar.bz2 dirname<br>
.bz 解壓1 bzip2 -d filename.bz<br>
.bz 解壓2 bunzip2 filename.bz<br>
.tar.bz 解壓 tar jxvf filename.tar.bz<br>
.z 解壓 uncompress filename.z<br>
.z 壓縮 compress filename<br>
.tar.z 解壓 tar zxvf filename.tar.z<br>
.tar.z 壓縮 tar zcvf filename.tar.z dirname<br>
.zip 解壓 unzip filename.zip<br>
.zip 壓縮 zip filename.zip dirname<br>
.rar 解壓 rar x filename.rar<br>
.rar 壓縮 rar a filename.rar dirname</p>
<p>lzop工具最適合在注重壓縮速度的場合,壓縮文件時會新建.lzo文件,而原文件保持不變(使用-U選項除外)</p>
<p>lzop -v test 創建test.lzo壓縮文件,輸出詳細信息,保留test文件不變</p>
<p>lzop -Uv test 創建test.lzo壓縮文件,輸出詳細信息,刪除test文件</p>
<p>lzop -t test.lzo 測試test.lzo壓縮文件的完整性</p>
<p>lzop –info test.lzo 列出test.lzo中各個文件的文件頭</p>
<p>lzop -l test.lzo 列出test.lzo中各個文件的壓縮信息</p>
<p>lzop –ls test.lzo 列出test.lzo文件的內容,同ls -l功能</p>
<p>cat test | lzop > t.lzo 壓縮標準輸入並定向到標準輸出</p>
<p>lzop -dv test.lzo 解壓test.lzo得到test文件,輸出詳細信息,保留test.lzo不變</p>
<p>注:lzop沒有unlzop命令,只能加上-d選項解壓,向lzop傳入一組文件和目錄名時,lzop會壓縮所有文件但是會忽略目錄,壓縮文件保留原來文件的權限設置和時間戳。</p>
三、任務log分析






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章