编写MapReduce作业以同时下载文件?

时间:2014-05-09 21:16:24

标签: hadoop oozie cloudera-cdh

不确定这是否是MapReduce的合适用例:我试图实现的部分OOZIE工作流程是下载一系列以序列号命名的文件(例如1到20)。我希望同时下载这些文件(一次5个文件),所以我创建了一个python脚本,创建了5个文本文件,如下所示:

1.txt: 1,2,3,4
2.txt: 5,6,7,8
3.txt: 9,10,11,12
4.txt: 13,14,15,16
5.txt: 17,18,19,20

然后,对于工作流的下一步,我创建了一个download.sh shell脚本,该脚本使用逗号分隔的数字列表并下载所请求的文件。在工作流程中,我在Oozie中设置了流式操作,并使用包含上面生成的文件作为输入(mapred.input.dir)的目录,并使用download.sh作为mapper命令和"猫"作为reducer命令。我假设Hadoop将为上面的每个输入文件生成一个不同的映射器。

这似乎有时会起作用,它会正确下载文件,但有时它只会被卡住尝试执行而我不知道为什么。我注意到当我增加同时下载的次数时会发生这种情况(例如,不是每个txt文件的文件,我会做20次等等。)

所以我的问题是:这是使用MapReduce和OOZIE实现文件并行检索的正确方法吗?如果没有,这通常是如何使用OOZIE完成的?我在运行Hive脚本之前尝试将我的CSV文件放入HDFS中,并且我不确定实现该目标的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

在深入研究之后,似乎创造了一个Oozie" Fork"节点将是最好的方法。所以我创建了一个fork节点,在该节点下我创建了6个执行download.sh的shell动作,并将文件号列表作为参数。所以我最终修改了python脚本,因此它输出了需要下载到STDOUT的文件号(而不是将它们保存在HDFS上)。我有oozie捕获输出,然后将它们作为参数传递给download.sh分支。

Cloudera Hue接口没有提供创建fork节点的方法(至少不是我能找到的)所以我下载了workflow.xml文件并自己添加了fork节点,然后重新导入它作为新的工作流程。