hive 优化

原文地址

    Apache Hive是一个类似SQL的软件,与Hadoop一起使用,使用户能够快速高效地使用自己的语言HiveQL执行类似SQL的查询。它还为用户提供了传统SQL结构所不具备的其他查询和分析功能。
    使用Apache Hive,用户可以根据个人需求和偏好使用HiveQL或传统的Mapreduce系统。Hive特别适用于分析大型数据集(PB),还包括各种存储选项。
    Hive充满了独特的工具,允许用户快速有效地执行数据查询和分析。为了充分利用所有这些工具,用户必须使用Hive实施的最佳实践。如果您想知道如何扩展Apache Hive,这里有10种方法可以充分利用Hive性能。

  1. 分区表
    Hive分区是提高较大表的查询性能的有效方法推文。分区允许您将数据存储在表位置下的单独子目录中。它极大地帮助了在分区键上查询的查询。虽然分区键的选择始终是一个敏感的决定,但它应该始终是一个低基数属性,例如,如果您的数据与时间维度相关联,那么date可能是一个好的分区键。同样,如果数据与位置(如国家或州)相关联,则最好使用国家/州等分层分区。

  2. 使数据去标准化
    规范化是一个标准流程,用于使用某些规则对数据表建模,以处理数据和异常的冗余。简单来说,如果规范化数据集,最终会创建多个关系表,这些表可以在运行时连接以生成结果。连接是昂贵且难以执行的操作,并且是性能问题的常见原因之一推文。因此,避免高度规范化的表结构是一个好主意,因为它们需要连接查询来获得所需的指标。

  3. Compress map/reduce output
    压缩技术显着减少了中间数据量,从而减少了映射器和缩减器之间的数据传输量。所有这些通常都发生在网络上。压缩可以单独应用于mapper和reducer输出。请记住,gzip压缩文件不可拆分。这意味着应该谨慎应用。压缩文件大小不应大于几百兆字节推文。否则可能导致工作失衡。压缩编解码器的其他选项可能是snappy,lzo,bzip等。

对于mapper输出压缩,将mapred.compress.map.output设置为true
对于job输出压缩,将mapred.output.compress设置为true

有关更多功能,请查看Hive Cheat Sheet。

  1. map join
    如果连接另一侧的表足够小以适应内存,则映射连接非常有效推文。Hive支持一个参数hive.auto.convert.join,当它设置为“true”时,Hive会尝试自动映射连接。使用此参数时,请确保在Hive环境中启用了自动转换。
  1. Bucketing
    如果bucket key 和 join keys是公共的,则Bucketing改进了连接性能。推特上在Hive中设置根据bucket键上的散列结果将数据分布在不同的bucket中。如果进程在相同的键(列)上发生,它还可以减少连接过程中的I/O扫描。
    另外,确保每次在将数据写入bucketed表之前设置bucketing标志(set hive. enforcement .bucketing=true;),这一点很重要。为了在连接操作中利用buckemapjoin操作,我们应该设置hive.optimize.bucketmapjoin=true。这个设置提示Hive在map stage join期间执行bucket level join。它还减少了寻找特定密钥的扫描周期,因为套筒确保了密钥存在于特定的桶中。

  2. 输入格式的选择
    输入格式在Hive性能中起着关键作用。例如,对于数据量非常高的大型生产系统,文本类型的输入格式JSON不是一个好的选择。这些类型的可读格式实际上占用了很多空间,并且有一些解析开销(比如 JSON解析)。为了解决这些问题,Hive提供了诸如RCFile、ORC等列式存储格式。列存储格式允许您通过单独访问每一列来减少分析查询中的读操作。还有一些其他的二进制格式,如Avro、sequence files、Thrift和ProtoBuf,这些在各种用例中也很有用。

  3. 并行执行
    Hadoop可以并行执行MapReduce任务,而在Hive上执行的几个查询会自动使用这种并行性。然而,单个复杂的Hive查询通常被转换为许多MapReduce任务,这些任务在默认顺序下执行。但是,查询的一些MapReduce阶段通常不是相互依赖的,可以并行执行。然后,它们可以利用集群上的空闲容量,提高集群利用率,同时减少整个查询执行时间。在Hive中改变这种行为的配置仅仅是切换一个单独的标志设置Hive .exec.parallel=true。

  4. 向量化
    向量化允许Hive处理一批行,而不是一次处理一行。每个批处理由列向量组成,列向量通常是原始类型的数组。对整个列向量执行操作,从而改进了指令管道和缓存的使用。要启用向量化,请设置此配置参数set hivee .vectorized.execution.enabled=true。

  5. 单元测试
    简单来说,单元测试可以确定代码中最小的可测试部分是否与您期望的完全一致。单元测试提供了一些好处,即尽早检测问题,更容易更改和重构代码,作为一种解释代码如何工作的文档形式,仅举几例。
    在Hive中,您可以对UDF,SerDes,流式脚本,Hive查询等进行单元测试。在很大程度上,可以通过运行快速本地单元测试来验证整个HiveQL查询的正确性,而无需触及Hadoop集群。因为在本地模式下执行HiveQL查询需要几秒钟,相比之下,如果它在Hadoop模式下运行,则分钟,小时或天数肯定会节省大量的开发时间。
    有几种工具可以帮助您测试Hive查询。其中一些你可能想看看HiveRunner,Hive_test和Beetest。

  6. 抽样
    采样允许用户获取数据集的子集并对其进行分析,而无需分析整个数据集。如果使用代表性样本,则查询可以返回有意义的结果,并且可以更快地完成并消耗更少的计算资源。
    Hive提供了一个内置的TABLESAMPLE子句,允许您对表进行采样。TABLESAMPLE可以在不同的粒度级别进行采样 - 它只能返回桶的子集(桶采样)或HDFS块(块采样),或者只返回每个输入拆分的前N个记录。或者,您可以实现自己的UDF,根据您的采样算法过滤掉记录。

你可能感兴趣的:(hive 优化)