有没有办法控制Hadoop Streaming作业的输出文件名? 具体来说,我希望我的作业的输出文件内容和名称由reducer输出组织 - 每个文件只包含一个键的值,其名称将是键。
更新: 刚刚找到答案 - 使用派生自MultipleOutputFormat的Java类作为作业输出格式,可以控制输出文件名。 http://hadoop.apache.org/core/docs/current/api/org/apache/hadoop/mapred/lib/MultipleOutputFormat.html
我还没有看到任何样品...... 任何人都可以指出使用自定义输出格式Java类的Hadoop Streaming示例吗?
答案 0 :(得分:8)
使用派生自MultipleOutputFormat的Java类作为作业输出格式,可以控制输出文件名。 http://hadoop.apache.org/core/docs/current/api/org/apache/hadoop/mapred/lib/MultipleOutputFormat.html
使用Hadoop Streaming时,由于只支持一个JAR,你实际上必须分叉流jar并将新的输出格式类放入其中以便流媒体作业能够引用它......
<强> 编辑: 强> 从hadoop版本0.20.2开始,此类已被弃用,您现在应该使用: http://hadoop.apache.org/docs/mapreduce/current/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html
答案 1 :(得分:-1)
通常,Hadoop会让您将整个目录视为输出,而不是单个文件。无论是使用Streaming还是常规Java作业,都无法直接控制文件名。
但是,在作业完成后,没有什么能阻止你自己进行拆分和重命名。您可以$ HADOOP dfs -cat path / to / your / output / directory / part- *,并将其传递给您的脚本,该脚本按键拆分内容并将其写入新文件。