【问题标题】:Using Hadoop to run a jar file - Python使用 Hadoop 运行 jar 文件 - Python
【发布时间】:2013-11-17 01:40:51
【问题描述】:

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

  1. 连接到 MySQL DB 并将文件检索到本地 FS。
  2. 运行对这些文件进行操作的程序 X。类似于:java -jar X.jar <folder_name> 这将打开文件夹中的每个文件并对它们执行一些操作,并将相同数量的转换文件写入另一个文件夹。
  3. 然后,运行一个程序 Y,该程序对 这些 文件进行操作:java -jar Y.jar <folder_name> 这将创建一行的多个文件,然后使用合并函数将这些文件合并为一个文件。
  4. 然后,此合并文件是一些进一步操作和分析的输入,这些操作和分析对于这个问题并不重要。

我想使用 Hadoop 来加速操作 Y,因为如果有以下情况需要很长时间才能完成:a)更多数量的文件或 b)要操作的大型输入文件。

我想知道的是,首先使用 Hadoop 来做这种性质的事情是否是个好主意,以及线程在这种情况下是否更有意义。请记住,X 和 Y 是不能以任何方式替换或更改的东西。

我想出了这个主意:

  1. 在上面的第 2 步之后,在映射器中,将文件复制到 HDFS 并再次退出,运行 jar 文件,此时将结果写回 HDFS。我将结果复制回文件系统并将其发送以进行进一步处理。

我想知道这是否有意义,特别是考虑到映射器需要一个(键,值)对,在这种情况下我什至会有一个 k-v 对吗?

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

谢谢!

【问题讨论】:

    标签: python hadoop jar mapreduce hdfs


    【解决方案1】:

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

    请记住,hdfs 不太擅长处理小文件,如果您有大量(例如 1000 万)小文件(大小小于 1k 字节),这对名称节点来说可能是一场灾难。另一方面,如果尺寸太大但只需要几个文件即可继续,那么直接将步骤#2 包装在映射器中并不酷,因为该作业不会广泛且均匀地分布(在这种情况下我猜键值只能是“文件号 - 文件内容”或“文件名 - 文件内容”,因为你提到 X 不能以任何方式改变。实际上,“行号 - 行”会更合适)

    顺便说一句,使用 hadoop mapreduce 框架有两种方法,一种方法是在 java 中编写 mapper/reducer 并将它们编译到 jar 中,然后使用 hadoop jar you_job.jar 运行 mapreduce 作业。另一种方式是streaming,可以用python写mapper/reducer就是这样。

    【讨论】:

    • 我会说这些文件最大约为 1MB,最多需要处理大约 300-500 个文件。对这些文件中的每一个应用 Y 的过程很慢,即,虽然文件打开和关闭可能很快,但它对文件所做的操作完全取决于文件的大小。较小的文件需要更短的时间,而较大的文件需要更多的时间。但是,文件大小相对较小。Y执行的操作需要很长时间,这就是我们想要减少的。另外,如果您知道一篇文章/教程展示了如何在映射器中运行 jar 文件
    • 会很棒。另外,您能否澄清一下您的键值对以及它的确切含义?我只是有点迷茫和困惑。对不起!
    • 您是否打算为第 3 步创建映射器?我以为你想把第 2 步当作映射器,把第 3 步当作减速器,这对我来说更有意义。我想您可以通过调用 java 命令行轻松地在映射器中运行 jar。至于键值,我认为最好在映射器中传入文件的每一行,无论如何,根据您的文件大小,传入每个文件也可以工作。
    • 好吧,最终的计划是将第 2 步和第 3 步都放入他们自己的映射器和减速器中,但我会慢慢来,如果我可以让第 3 步在映射器中成功执行, / 或减速器,我也可以将其复制到第 2 步。逐行传递的问题是 Y.jar 需要整个文件而不是单独的行。它逐行读取文件,对其进行分析并为整个文件写出单行描述符。即使我们将第 2 步作为映射器,将第 3 步作为减速器,同样的问题仍然存在。如何运行依赖于操作系统和系统环境的jar文件
    • Hadoop内部,这几乎就像是操作系统和它自己的HDFS之间的隔离层?这是最不清楚的部分,特别是代码 - 在映射器内部会是什么样子?目前,它的执行方式是`os.system(cmd_line)`,其中cmd_line 表示类似:java -jar /path/to/jar/Y.jar -args folder_name。编写地图作业时,这将如何改变?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多