Hadoop进阶(hadoop streaming c++实现 & MapReduce参数调优)

来源:互联网 发布:淘宝一周可以买多少次 编辑:程序博客网 时间:2024/06/05 15:19

目录:

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_filelocal_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/@taskid@.gc

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分析






原创粉丝点击