使用Hadoop运行jar文件 - Python

时间:2013-11-17 01:40:52

标签: python hadoop jar mapreduce hdfs

我有一个现有的Python程序,它有一系列操作,如下所示:

  1. 连接MySQL DB并将文件检索到本地FS。
  2. 运行对这些文件进行操作的程序X.类似于:java -jar X.jar <folder_name>这将打开文件夹中的每个文件并对它们执行一些操作,并将相同数量的转换文件写入另一个文件夹。
  3. 然后,运行一个对这些文件进行操作的程序Y:java -jar Y.jar <folder_name>这将创建多个文件,每行一行,然后使用合并功能合并为一个文件。 / LI>
  4. 这个合并的文件是一些对这个问题不重要的进一步操作和分析的输入。
  5. 我想使用Hadoop来加速操作Y,因为如果有以下情况需要很长时间才能完成:a)更多文件或b)要操作的大输入文件。

    我想知道的是,如果最好首先使用Hadoop来做这种性质的事情,并且在这种情况下线程会更有意义。请记住,X和Y是不能以任何方式替换或更改的内容。

    我提出了这个想法:

    1. 在上面的第2步之后,在映射器中,将文件复制到HDFS并再次退出,运行jar文件,此时将结果写回HDFS。我将结果复制回文件系统并发送给它进行进一步处理。
    2. 我想知道这是否有意义,特别是考虑到映射器需要一个(键,值)对,在这种情况下我甚至会有一个k-v对吗?

      我知道这听起来像是一个项目,那是因为它是,但我不是在寻找代码,只是关于这是否会起作用的一些指导,如果确实如此,那么正确的做法是什么如果我提出的解决方案不准确(足够)。

      谢谢!

1 个答案:

答案 0 :(得分:2)

你绝对可以使用hadoop mapreduce框架来完成你的工作,但如果它是一个好主意的答案可能是&#34;它取决于&#34;。这取决于您要继续的文件的数量和大小。

请记住,hdfs在处理小文件方面不是很好,如果你有一个很好的数字(比方说1000万)的小文件(大小小于1k字节),它可能是namenode的灾难。另一方面,如果尺寸太大但只需要几个文件来进行,将步骤#2直接包装在映射器中并不是很酷,因为这项工作不会被广泛均匀地分布(在这种情况我想键值只能是&#34;文件号 - 文件内容&#34;或&#34;文件名 - 文件内容&#34;鉴于你提到X不能以任何方式改变实际上,&#34;行号 - 行&#34;会更加适合)

BTW,有两种方法可以利用hadoop mapreduce框架,一种方法是在java中编写mapper / reducer并在jar中编译它们然后用hadoop jar you_job.jar运行mapreduce job。另一种方式是streaming,你可以用这种方式编写mapper / reducer。