自定义 Mapper 和 Reducer 与 HiveQL
Posted
技术标签:
【中文标题】自定义 Mapper 和 Reducer 与 HiveQL【英文标题】:Custom Mapper and Reducer vs HiveQL 【发布时间】:2012-07-09 22:32:30 【问题描述】:问题陈述:-
我需要比较两个表Table1
和Table2
,它们都存储相同的东西。所以我需要将Table2
与Table1
进行比较,因为Table1
是需要进行比较的主表。因此,在比较之后,我需要报告Table2
存在某种差异。这两张表有很多数据,大约 TB 的数据。所以目前我已经写了HiveQL
来进行比较并取回数据。
所以我的问题是,就PERFORMANCE
而言,哪个更好,写一个CUSTOM MAPPER and REDUCER
来做这种工作,或者我写的HiveQL
会很好,因为我将加入这两个表在数百万记录。据我所知,HiveQL
在内部(在幕后)生成优化的自定义 map-reducer 并提交执行并取回结果。
【问题讨论】:
这对于 Hive 查询来说似乎很简单。我建议先这样做。 是的,我会这样做,但总的来说,在性能方面哪个会更好,因为我的队友中很少有人说 Custom Mapper 和 Reducer 与 HiveQL 相比会稍快一些? 总的来说,我们发现 Hive 生成了相当不错的 Map/Reduce 作业。有时甚至可以准确地向 Hive 暗示您希望它如何生成这些工作。我可以想象,在某些条件下,定制的书面 MR 作业可以胜过 Hive,但如果没有认真的成本/收益分析,我不会这样做。 嗯,让我再研究一下。我还有一个问题,我已经在 SO http://***.com/questions/11405446/find-10-latest-record-for-each-buyer-id-for-yesterdays-date 上发布了,如果你可以看一下,这对我会有很大帮助。由于我是 HiveQL 的新手,所以遇到了很多问题。 好吧,如果您不能用 SQL 的 Hive 方言表达您的请求,那么您除了编写自定义 MR 作业之外别无选择,对吗?顺便说一句,Hive 没有内置的 DATETIME 数据类型,但是您的数据格式化方式应该没问题(我假设您的示例中的日期是 7 月 9 日,而不是 9 月 7 日)。 【参考方案1】:您的问题有两个答案。
首先,如果有一些处理可以用 Hive QL 语法表达,我认为 Hive 的性能与编写自定义 map-reduce 的性能相当。这里唯一的问题是当您有一些关于您在 map-reduce 代码中使用但不是通过 Hive 的数据的额外信息时。例如,如果您的数据已排序,则您可以在映射器中处理文件拆分时使用此信息,而除非 Hive 知道此排序顺序,否则它将无法将这些信息用于其优势。通常,有一种方法可以指定此类额外信息(通过元数据或配置属性),但有时甚至可能无法指定这些信息以供 Hive 使用。
其次,有时处理可能非常复杂,以至于无法在类似 SQL 的语句中轻松表达。这些情况通常涉及在处理期间必须存储间歇性状态。 Hive UDAFs 一定程度上缓解了这个问题。但是,如果您需要更自定义的东西,我总是更喜欢使用 Hive Transform functionality 插入自定义映射器和/或减速器。它允许您在 Hive 查询的上下文中利用 map-reduce,允许您在同一个查询中混合搭配 Hive SQL 类功能与自定义 map-reduce 脚本。
长话短说:如果您的处理可以通过 Hive QL 查询轻松表达,我认为没有太多理由编写 map-reduce 代码来实现相同的目的。创建 Hive 的主要原因之一是允许像我们这样的人编写类似 SQL 的查询,而不是编写 map-reduce。如果我们最终编写 map-reduce 而不是典型的 Hive 查询(出于性能原因或其他原因),人们可能会争辩说 Hive 在其主要目标方面做得不好。另一方面,如果您有一些 Hive 无法利用的有关数据的信息,您最好编写使用该信息的自定义 map-reduce 实现。但是,话又说回来,如果您可以使用前面提到的 Hive 转换功能简单地插入映射器和化简器,则无需编写整个 map-reduce 程序。
【讨论】:
所以基本上你是在说,考虑到我需要比较两个表并且它们中有数百万个数据的场景。因此,与为我的案例编写自定义 Map Reduce 作业相比,使用 HiveQL 会更好吗? 是的,你是;如果您的查询在 HQL 中很容易表达。以上是关于自定义 Mapper 和 Reducer 与 HiveQL的主要内容,如果未能解决你的问题,请参考以下文章