【.com速译】Pig和Hive已经成为企业实现大规模数据交互的必备工具,其突出优势是无需编写复杂的MapReduce代码.作为Hadoop生态系统中的重要力量,这两个组件都提供了一套基于核心执行程序的抽象层。Hive的初步设计思路是提供类似SQL的体验,同时简化RDBMS的转换过程。Pig有更多的程序化解决方案,旨在帮助用户在不编写MapReduce的情况下实现数据操作。 本文将通过实例和代码对Pig和Hive进行全面的对比。 Hive的先天优势 ApacheHive是一个极其强大的大数据组件,其主要优势在于数据的整理和抽取。在处理已经具有关联模式的数据时,Hive表现得非常好。此外,Hivemetastore工具还可以根据用户指定的条件对所有数据进行划分,这将进一步提高数据检索的速度。但是,在单个查询使用大量分区时,需要注意Hive可能导致的以下问题: 1)查询中分区数量的增加意味着相关路径的数量对他们来说也会同步增加。我们假设在某个用例中,一个查询需要指向一个包含10,000个***分区的表,并且每个分区包含更多的嵌套分区。可能有些朋友已经意识到,此时Hive会尝试在任务配置中为所有分区设置路径,同时将查询转化为MapReduce任务。因此,分区的数量将直接影响任务本身的大小。由于默认的jobconf大小为5MB,超过此限制将引发运行时执行错误。例如,它可能会显示“java.io.IOException:超出最大作业配置大小:14762369限制:5242880”。您可以点击此处了解更多详情。 2)通过“MSCKREPAIRTABLE表名”实现的批量分区注册(例如10000x100000分区)也会受到HadoopHeapsize和GCOverheadlimit的限制。超过这个限制显然会导致错误或stackoverflow执行崩溃错误,如下所示:java:819) atorg.datanucleus.query.expression.ExpressionCompiler.compileOrAndExpression(ExpressionCompiler.java:190) atorg.datanucleus.query.expression.ExpressionCompiler.compileExpression(ExpressionCompiler.java:179) atorg.datanucleus.query.expression.ExpressionCompiler.compileOrAndExpression(ExpressionCompiler.java:192) atorg.datanucleus.query.expression.ExpressionCompiler.compileExpression(ExpressionCompiler.java:179) 3)使用更复杂的多层操作,例如加入多个分区,也有其局限性。Hive编译器使用Metastore进行语义验证时可能会出错,导致大规模查询。这是因为Hivemetastore本质上是一种SQLschema存储,所以大规模查询可能会导致如下错误:“com.mysql.jbdc.PacketTooBigException:Packetforqueryistoolarge”。 各种属性,包括jobconf大小,HadoopHeap大小,数据包大小显然不能配置。为了避免这些问题,我们应该设计更好的语义而不是频繁更改配置。 Hive的优势在于它是基于HDFS上的数据系统模型设计的。它能够在可接受的分区中保存大量数据,但不适合使用大量分区每个保存少量数据。毕竟,分区的意义是在不对整体数据集进行操作的情况下,加速特定数据的查询。分区数量的减少意味着我们可以实现最大负载和最大化集群资源利用率。 何时使用Pig ApachePig的胃口可谓“不挑食”,可以消费各种数据类型,包括结构化、半结构化和非结构化。与Hive不同,Pig不使用任何相关的Metastore,但可以利用Hive中的Hcatalog。事实上,Pig的设计初衷是为了对大型数据集执行复杂的、可扩展的操作,因为它可以随时随地进行自我优化。Pig虽然表面上使用了多级脚本结构,但其内部操作在执行时进行了优化,显着减少了实际扫描数据的次数。 下面我们仍然以10000个分区为例,考虑其在Pig中的处理效果。在这种情况下,由于不涉及元存储,分区概念根本不会限制Pig的执行。要在Hive中使用Hcatalog,我们可以在Pig中使用以下脚本(这里我们使用的是Pig0.15版本): /*myscript.pig*/ A=LOAD'tablename'USINGorg.apache。hive.hcatalog.pig.HCatLoader(); --日期为分区列;ageisnot B=filterAbydate=='20100819'andage<30; --date和country都是分区列 C=filterAbydate=='20100819'andcountry=='美国';如果一个请求全部查询,那么Pig也会出现和Hive类似的问题。在这种情况下,使用glob和通配符来表达可能会更方便。 例如: Partition-1,Partition-2,Partition-3,....Partition-n存在于位置/user/inputLocation/ 使用globs我们可以将输入提供给Pig作为: /user/inputLocation/{Partition-1,Partition-2,Partition-3,....Partition-n} 如果使用通配符,则为: /user/inputLocation/* 在嵌套分区的情况下,我们可以使用glob和通配符的组合,例如: /user/inputLocation/{Partition-1,Partition-2,Partition-3,....Partition-n}/* Pig可以成功从对应位置读取数据,并在运行执行过程中进行优化。因此,Pig面临的唯一障碍是集群资源不可用。另外,ApachePig在对数据进行大量转换的情况下,性能可以说是最好的。 Hive与Pig的较量 以下信息可以帮助您理解Hive与Pig的设计思路和工作原理。 Hive: ApacheHive本质上是一个数据存储平台,用于与存储在HDFS或HBase中的大规模结构化数据集进行交互。Hive查询语言在这方面类似于SQL,都可以很好地与Hadoop集成。猪不一样。它的执行过程是纯声明式的,适合数据科学家实现数据的展示和分析。 与Hive交互时,用户可以直接通过Hive命令行界面访问,也可以与Hiveserver进行交互。任何提交的查询首先由驱动程序使用,然后由编译器进行语法和语义验证。另外,Hivemetastore负责保存所有Hive相关数据的schema/mapping关系,对查询信息的语义校验有重要作用。驱动程序基于语义进行优化,负责准备执行计划并提交给HQL查询引擎。这个引擎依赖于实际的执行引擎(比如MapReduce和Spark等)。对架构的任何成功修改都将通过HQL处理引擎更新到Metastore。 更多详情可以参考: https://en.wikipedia.org/wiki/Apache_Hive Pig: ApachePIG提供了结构化和Manipulate分析非结构化的高级语言平台数据集。这种语言叫做PigLatin,它是一种脚本形式,可以直接在PIGshell上执行,也可以由PigServer触发。用户创建的脚本在初始阶段会被PigLatin处理引擎解析语义有效性,然后转换为包含整体执行初始逻辑的有向无环图(简称DAG)。此外,该处理引擎还可以接受DAG,并在内部进行计划优化——具体优化方式包括PIG编程方式和惰性计算方式。 为了理解这个优化机制的原理,我们假设用户写了一组脚本,对两组数据集进行join操作,后面跟着一个过滤条件。PIG优化器可以验证过滤操作是否可以在连接之前进行,从而确保连接负载最小化。如果是这样,它将在逻辑上进行相应的规划和设计。通过这种方式,用户可以专注于最终结果,而不是将精力分散在性能保证上。 编译只有在完全优化的逻辑方案准备就绪后才会生效。它负责生成物理计划,即分配执行引擎与最终驻留在HDFS中的数据进行交互。 总结: Pig和Hive无疑已经成为大数据世界的重要组成部分。两者都为实现各种自定义功能提供了出色的灵活性和可扩展性。另外两者也有自己明确的角色定位,所以具体优劣完全取决于你在项目中的实际需求。【翻译稿件,合作网站转载请注明原译者和出处.com】
