目錄:
1,機器學習 & MR
Hadoop進階(hadoop streaming c++實現 & MapReduce參數調優)
hadoop streaming (shell執行 & combiner & 數據分割)
hadoop
streaming python 處理 lzo 文件遇到的問題
2,tensorflow 安轉與使用
Tersorflow深度學習入門——
CIFAR-10 訓練示例報錯及解決方案
Python的庫sklearn安裝
& bazel安裝 & cmake
3,工具安裝
urlencode & quote & unquote (url 中帶中文參數)
configure
--prefix=/ & yum install 路徑
一、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。
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。
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。
mapred.job.reuse.jvm.num.tasks
一個jvm可連續啓動多個同類型任務,默認值1,若爲-1表示不受限制。
mapred.child.java.opts
任務啓動的jvm參數,默認值-Xmx200m,建議值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@[email protected]
11. map task調優
io.sort.record.percent
io.sort.spill.percent
12.reduce task調優
mapred.reduce.parallel.copies
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分析