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

标签 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中设置了一个 Action ,并使用包含上面生成的文件作为输入的目录(mapred.input.dir),并使用download.sh作为mapper命令,并使用“cat”作为reducer命令。我假设Hadoop将为上述每个输入文件生成一个不同的映射器。

有时这似乎可行,可以正确下载文件,但有时尝试执行时会卡住,但我不知道为什么。我注意到当我增加同时下载的次数时会发生这种情况(例如,代替每个txt文件的文件,我会执行20次,依此类推)。

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

最佳答案

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

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

关于hadoop - 编写MapReduce作业以同时下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574121/

相关文章:

hadoop - 用户首先提供的Oozie装载 jar

join - 连接表时 Hive 查询出错

hadoop - 安装hadoop-cdh后/etc/init.d/下缺少初始化脚本

hadoop eclipse插件安装目录

java - 使用 Mapreduce 进行递归计算

java - 包 org.apache.hadoop.hive.ql.exec.vector 不存在

java - SparkSQL 插入 Hive 表失败

hadoop - 并行运行 Oozie 操作

Oozie 外壳 Action : exec and file tags

hadoop - Oozie Job(Cloudera VM)在抛出错误时执行 shell 脚本——错误=2,没有这样的文件或目录