Pig与Hive已经成为企业实现大规模数据交互的必要工具,其突出优势在于无需编写复杂的MapReduce代码。作为Hadoop生态系统中的重要力量,这两款组件都提供一套立足于核心执行程序的抽象层。Hive的初步设计思路在于提供与SQL类似的使用体验,同时简化了RDBMS的过渡流程。Pig则拥有更多规程化方案,旨在帮助使用者在无需编写MapReduce的前提下实现数据操作。
本篇文章将通过示例及代码对Pig与Hive进行一番全面比较。
Hive的固有优势
Apache Hive是一款极为强大的大数据组件,其主要长项在于数据整理与提取。在处理已经存在关联模式的数据时,Hive拥有极为出色的表现。另外,Hive metastore工具还能够根据用户指定的条件对全部数据进行划分,这将进一步提升数据的检索速度。然而,在利用大量分区进行单一查询时,大家需要当心Hive可能造成的以下问题:
1)查询当中分区数量的增加意味着与之相关的路径数量亦将同步增加。我们假设在某一用例当中,某条查询需要指向一套包含10000个顶级分区的表,且其中各个分区又包含更多嵌套分区。有些朋友可能已经意识到,Hive在这时会尝试在任务配置中为全部分区设置路径,同时将该查询转译为MapReduce任务。因此,分区数量会直接影响到任务的自身大小。由于默认jobconf的大小为5 MB,因此超出这一上限将引发运行时执行错误。举例来说,其可能显示“java.io.IOException: Exceeded max jobconf size: 14762369 limit: 5242880”。大家可以点击此处查看更多相关细节信息。
2)通过“MSCK REPAIR TABLE 表名称”实现的批量分区注册(例如10000 x 100000个分区)同样会受到Hadoop Heap大小以及GCOverheadlimit的限制。超出这一上限显然会导致错误或者如下所示的stackoverflow执行崩溃错误: