Hadoop 配置单元选择查询性能差

Hadoop 配置单元选择查询性能差,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我有一个蜂巢表,每小时插入1000条记录。但是,当我执行select*from时,执行起来要花很多时间。这背后的原因是什么 蜂巢一开始并不快。。。不确定您期望的是什么,但它不会以毫秒为单位 如果您想提高性能,请使用Tez或Spark而不是MapReduce执行,也可以使用Hive 2 w/LLAP,并以ORC或拼花格式放置数据 如果您不能完成上述操作,那么至少将数据放在每小时一次的分区中。然后实际查询分区,而不是扫描所有行/列,因为配置单元执行分区修剪 此外,HDFS不喜欢小于HDFS块大小(1

我有一个蜂巢表,每小时插入1000条记录。但是,当我执行
select*from
时,执行起来要花很多时间。这背后的原因是什么

蜂巢一开始并不快。。。不确定您期望的是什么,但它不会以毫秒为单位

如果您想提高性能,请使用Tez或Spark而不是MapReduce执行,也可以使用Hive 2 w/LLAP,并以ORC或拼花格式放置数据

如果您不能完成上述操作,那么至少将数据放在每小时一次的分区中。然后实际查询分区,而不是扫描所有行/列,因为配置单元执行分区修剪


此外,HDFS不喜欢小于HDFS块大小(128MB)的文件。任何更小的任务都意味着在地图任务中浪费时间,而Hive一开始并不快。。。不确定您期望的是什么,但它不会以毫秒为单位

如果您想提高性能,请使用Tez或Spark而不是MapReduce执行,也可以使用Hive 2 w/LLAP,并以ORC或拼花格式放置数据

如果您不能完成上述操作,那么至少将数据放在每小时一次的分区中。然后实际查询分区,而不是扫描所有行/列,因为配置单元执行分区修剪


此外,HDFS不喜欢小于HDFS块大小(128MB)的文件。任何较小的查询都意味着在映射任务中浪费了时间

如果您查看一下,您会发现典型的查询会有一些开销。查询将被转换为分布式执行的代码,发送到集群后端,在那里执行,然后存储和收集结果以供显示。这将增加每个查询的延迟,即使输入数据和最终结果集很小

如果查看,您会发现典型的查询会有一些开销。查询将被转换为分布式执行的代码,发送到集群后端,在那里执行,然后存储和收集结果以供显示。这将增加每个查询的延迟,即使输入数据和最终结果集很小

我同意@cricket_007使用执行引擎tez/spark。为了在蜂巢中实现性能,您可以从自己的角度进行一些定制:

  • 使用一次批量执行1024行的矢量化

    设置hive.vectoried.execution.enabled=true;
    设置hive.vectoried.execution.reduce.enabled=true

  • 使用CBO

    设置hive.cbo.enable=true

    设置hive.compute.query.using.stats=true

    设置hive.stats.fetch.column.stats=true

    设置hive.stats.fetch.partition.stats=true


我同意@cricket\u 007使用执行引擎tez/spark。为了在蜂巢中实现性能,您可以从终端进行一些定制:

  • 使用一次批量执行1024行的矢量化

    设置hive.vectoried.execution.enabled=true;
    设置hive.vectoried.execution.reduce.enabled=true

  • 使用CBO

    设置hive.cbo.enable=true

    设置hive.compute.query.using.stats=true

    设置hive.stats.fetch.column.stats=true

    设置hive.stats.fetch.partition.stats=true


对数据进行分区以加快查询速度是最佳做法。分区将使配置单元在数据子集而不是整个数据集上运行查询。创建分区可以按如下方式进行:

文件夹结构应如下所示:

path/to/directory/partition=partition_name
然后在表本身上(假设它在一个外部表上),您要创建的表语句应该如下所示:

CREATE EXTERNAL TABLE table_name (
    ...
    fields
    ...
    )
PARTITIONED BY (partition)
LOCATION '/path/to/directory'

然后可以查询该表并将分区视为另一列。

最好将数据分区以加快查询速度。分区将使配置单元在数据子集而不是整个数据集上运行查询。创建分区可以按如下方式进行:

文件夹结构应如下所示:

path/to/directory/partition=partition_name
然后在表本身上(假设它在一个外部表上),您要创建的表语句应该如下所示:

CREATE EXTERNAL TABLE table_name (
    ...
    fields
    ...
    )
PARTITIONED BY (partition)
LOCATION '/path/to/directory'

然后,您可以查询表并将分区视为另一列。

性能问题可能与表或数据的结构有关。如果您添加这些信息,可能会有人对您的具体问题有更好的了解性能问题可能与表或数据的结构有关。如果你添加这些信息,可能会有人对你的具体问题有更好的了解