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

soat7uwm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(314)

不确定这是否是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作为Map器命令,“cat”作为reducer命令。我假设hadoop将为上面的每个输入文件生成不同的Map器。
这似乎有时工作,它会下载正确的文件,但有时它只是陷入尝试执行,我不知道为什么。我注意到当我增加同时下载的次数时会发生这种情况(例如,不是每个txt文件下载20个文件,而是20个文件,以此类推)。
所以我的问题是:使用mapreduce和oozie实现文件并行检索的方法正确吗?如果不是,通常如何使用oozie来完成?我正在尝试在运行配置单元脚本之前将我的csv文件放入hdfs,我不确定实现这一点的最佳方法是什么。

afdcj2ne

afdcj2ne1#

在深入研究之后,创建一个oozie“fork”节点似乎是最好的方法。因此,我创建了一个fork节点,在该节点下创建了6个shell操作,执行download.sh并将文件号列表作为参数。因此,我最终修改了python脚本,以便它输出需要下载到stdout的文件号(而不是将它们保存在hdfs上)。我让oozie捕获输出,然后将它们作为参数传递给download.sh forks。
cloudera hue接口没有提供创建fork节点的方法(至少我找不到),所以我下载了workflow.xml文件,自己添加了fork节点,然后将其作为新工作流重新导入。

相关问题