到目前为止,我一直使用 Pig 或 Java 进行 MapReduce,专门针对 Hadoop 集群运行作业。我最近尝试通过 Hadoop 流使用 Python Map Reduce,这也很酷。所有这些对我来说都有意义,但我对何时想要使用一种实现与另一种实现有点模糊。其他。 Java map reduce,我基本上只在需要速度时使用,但是什么时候我会想要使用 Python 流之类的东西,而不是在 PIG/Hive 中用更少、更容易理解的行写出相同的东西?简而言之,各自的优点和缺点是什么?
我将分别涉及 Java 与 Python,然后分别涉及 MR 与 Hive / Pig - 因为我将其视为两个不同的问题
Hadoop 是围绕 Java 构建的,其许多功能可通过 Java API 获得,并且 Hadoop 大部分可以使用 Java 类进行扩展。
Hadoop 确实有能力处理用其他语言创建的 MR 作业 - 这称为流式处理。这个模型只允许我们定义mapper和reducer,但有一些java中不存在的限制。同时 - 输入/输出格式和其他插件必须编写为 java 类
所以我将决策定义如下:
a) 使用 Java,除非您有重要的代码库,需要在 MR 工作中继续。
b) 当您需要创建一些简单的临时作业时,请考虑使用 python。
关于 Pig / Hive - 它也是更高级别的以 java 为中心的系统。 Hive 无需任何编程即可使用,但可以使用 java 进行扩展。 Pig从一开始就需要java。我认为,在可以应用的情况下,该系统几乎总是比 MR 工作更可取。通常这些是处理类似于 SQL 的情况。
流式传输与本机 Java 之间的性能注意事项。
流式传输通过其输入流将输入提供给映射器。在 java 的情况下,进程间通信本质上比记录读取器和映射器之间的进程内数据传递效率低。
从上面我可以得出以下结论:
a) 如果进行一些轻处理(例如查找子字符串、计数...),此开销可能会很大,并且 java 解决方案将更加高效。
b) 在一些繁重的处理的情况下,可以更有效地用一些非java语言实现——基于流的解决方案可以有一些优势。
Pig/Hive 性能考虑因素。
Pig / Hive 都实现了 SQL 处理的原语。换句话说,它们在 RDBMS 世界中实现执行计划的元素。这些实现都很好并且经过精心调整。同时 Hive(我更了解的东西)是解释器。它不进行代码生成 - 它在预构建的 MR 作业中解释执行计划。这意味着,如果您有一些复杂的条件并且会专门为它们编写代码 - 它有机会比 Hive 做得更好 - 代表编译器与解释器的性能优势。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)