我已经通过Google控制台中的Deployments界面部署了一个hadoop集群。 (Hadoop 2.x)
我的任务是过滤存储在一个Google存储(GS)存储桶中的数据,并将结果存储到另一个存储空间。所以,这是一个只有简单python脚本的地图作业。请注意,群集和输出存储桶位于同一区域(EU)。
利用Google云端存储连接器,我运行以下流媒体工作:
hadoop jar /home/hadoop/hadoop-install/share/hadoop/tools/lib/hadoop-streaming-2.4.1.jar \
-D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec \
-D mapreduce.job.reduces=0 \
-file file_1 \
-file mymapper.py \
-input gs://inputbucket/somedir/somedir2/*-us-* \
-output gs://outputbucket/somedir3/somedir2 \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-mapper mymapper.py
所有映射器处理数据并将结果存储在GS的临时目录中会发生什么,如下所示:
gs://outputbucket/somedir3/somedir2/_temporary/1/mapper-0000/part-0000.gz
在完成所有映射器之后,作业进度将挂起100%映射,0%降低。使用gsutil查看输出存储区,我看到结果文件正被复制到目标目录:
gs://outputbucket/somedir3/somedir2
这个过程需要很长时间,并且使用hadoop会带来全部好处。 我的问题是:
1)这是一个已知问题还是我做错了什么?我找不到任何相关信息。
2)我是否正确说通常hdfs会将这些文件移动到目标目录,但GS无法执行移动,因此会复制文件?
3)我该怎么做才能避免这种模式?
答案 0 :(得分:0)
你几乎肯定会遇到影响Hadoop 2.0到2.6的"Slow FileOutputCommitter" issue,并在2.7中修复。
如果您正在Google Cloud Platform上寻找一个不错的托管Hadoop选项,您应该考虑Google Cloud Dataproc(文档here),我们维护发行版以确保我们选择与Google相关的补丁云平台快速。 Dataproc确实配置了 [i['URL'] for item in items for i in item]
,以便最终的commitJob很快。
对于更多“自己动手”的内容,您可以使用我们的命令行bdutil
tool ,该命令行还有use the fast FileOutputCommitter的最新更新。