一个hadoop job 有很多失败的task
经查,该job依赖于很大的外部配置文件,大概有200MB左右的分词词典及其他配置文件。该job的启动方式为:
/home/work/software/hadoop/bin/hadoop jar /home/work/software/hadoop/contrib/streaming/hadoop-streaming.jar -D mapred.reduce.tasks=0 -D mapred.job.priority=VERY_HIGH -D mapred.job.name='user:description' -input
/home/user/input -output /home/user/output -mapper 'sh run.sh' -file /home/user/run.sh -file /home/user/bin.tar.gz -file /home/user/Conf.tar.gz -file /home/user/data.tar.gz
run.sh脚本里面负责对/home/user/Conf.tar.gz 和 /home/user/data.tar.gz 进行解压缩
红线标识的文件为该job依赖的大数据配置文件。使用这种方式启动job存在的问题如下:
比如1台机器上有N个map槽,如果是-file的话,那么每个map槽都会下载/home/user/Conf.tar.gz 和 /home/user/data.tar.gz ,会造成1台机器多次下载相同的数据,效率低下。
而cacheArchive方式是1台机器只下载一次,然后每个map槽用软链接 链接到/home/user/Conf.tar.gz 和 /home/user/data.tar.gz ,因此,就可以避免多次重复下载数据,提高了效率,而且,如果是tgz之类的文件,上传到hdfs后,-cacheArchive方式框架会自动解压数据。
因此,上面的job启动方式可以优化为如下方式:
第一步,上传大文件到HDFS
hadoop fs -put /home/user/data.tar.gz hdfs://host:fs_port/user/data.tar.gz
hadoop fs -put /home/user/Conf.tar.gz hdfs://host:fs_port/user/Conf.tar.gz
第二步,修改启动shell命令
/home/work/software/hadoop/bin/hadoop jar /home/work/software/hadoop/contrib/streaming/hadoop-streaming.jar -D mapred.reduce.tasks=0 -D mapred.job.priority=VERY_HIGH -D mapred.job.name='user:description' -input /home/user/input
-output /home/user/output -mapper 'sh run.sh' -file /home/user/run.sh -file /home/user/bin.tar.gz -cacheArchive hdfs://host:fs_port/user/Conf.tar.gz#Conf -cacheArchive hdfs://host:fs_port/user/data.tar.gz#data
第三步:修改解压缩脚本:
搞定!