0

不确定这是否是 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.shshell 脚本,它使用逗号分隔的数字列表并下载请求的文件。在工作流程中,我在 Oozie 中设置了一个流式操作,并使用包含上面生成的文件的目录作为输入 ( mapred.input.dir),并使用 download.sh 作为映射器命令,使用“cat”作为减速器命令。我假设 Hadoop 将为上面的每个输入文件生成一个不同的映射器。

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

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

4

1 回答 1

0

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

Cloudera Hue 界面不提供创建分叉节点的方法(至少我无法找到),因此我下载了 workflow.xml 文件并自己添加了分叉节点,然后将其作为新工作流重新导入。

于 2014-05-15T17:59:53.293 回答