gpt4 book ai didi

performance - 调整使用底层 HBase 表的 Hive 查询

转载 作者:可可西里 更新时间:2023-11-01 14:14:41 24 4
gpt4 key购买 nike

我在 Hbase 中有一个表,让我们说“tbl”,我想使用 hive 。因此,我将表映射到配置单元如下:

CREATE EXTERNAL TABLE tbl(id string, data map<string,string>)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:")
TBLPROPERTIES("hbase.table.name" = "tbl");

查询如:

select * from tbl", "select id from tbl", "select id, data
from tbl

真的很快。

但是像这样的查询

select id from tbl where substr(id, 0, 5) = "12345"

select id from tbl where data["777"] IS NOT NULL

非常慢。

相反,从 Hbase shell 运行时:

"scan 'tbl', {
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or
"scan 'tbl', { COLUMNS=>'data', "FILTER" =>
FilterList.new([qualifierFilter('777')])}"

快如闪电!

当我查看 hive 在 jobtracker 上生成的 mapred 作业时,我发现“map.input.records”计算了 Hbase 表中的所有项目,这意味着该作业甚至在启动任何映射器之前都会进行全表扫描!!此外,我怀疑它将所有数据从 Hbase 表复制到 hdfs 到执行前映射器 tmp 输入文件夹。

所以,我的问题是 - 为什么 hive 的 hbase 存储处理程序不翻译配置单元查询到适当的 hbase 函数?为什么它扫描所有记录然后使用“where”子句将它们切片?如何改进?

提高 Hive 查询性能的任何建议(映射到 HBase 表)。

我们可以在 HBase 表上创建二级索引吗?

我们正在使用 HBase 和 Hive 集成并尝试调整 Hive 查询的性能。

最佳答案

很多问题!我会尽力回答所有问题并给你一些性能提示:

数据并没有复制到HDFS,但是HIVE生成的mapreduce job会把它们的中间数据存储到HDFS。

HBase 不支持二级索引或替代查询路径 (more info)。

Hive 会将所有内容转换为需要时间分发和初始化的 MapReduce 作业,如果您的行数非常少,则 Hbase shell 中的简单 SCAN 操作可能比 Hive 查询更快,但在大数据集上,在数据节点之间分发作业是必须的。

Hive HBase 处理程序在从查询中提取开始和停止行键时做得不是很好,查询如 substr(id, 0, 5) = "12345"不会使用开始和停止行键。

在执行查询之前,运行 EXPLAIN [your_query];命令并检查 filterExpr: 部分,如果你没有找到它,你的查询将执行全表扫描。附带说明, Filter Operator: 中的所有表达式 将转换为适当的过滤器。

EXPLAIN SELECT * FROM tbl WHERE (id>='12345') AND (id<'12346')
STAGE PLANS:
Stage: Stage-1
Map Reduce
Alias -> Map Operator Tree:
tbl
TableScan
alias: tbl
filterExpr:
expr: ((id>= '12345') and (id < '12346'))
type: boolean
Filter Operator
....

幸运的是,有一种简单的方法可以确保在查找行键前缀时使用开始和停止行键,只需转换 substr(id, 0, 5) = "12345"更简单的查询:id>="12345" AND id<"12346" ,它将被处理程序检测到,并将开始和停止行键提供给扫描(12345、12346)


现在,这里有一些技巧可以加快您的查询速度(大大加快):

  • 确保设置以下属性以利用批处理减少 RPC 调用的数量(数量取决于列的大小)

    SET hbase.scan.cache=10000;

    SET hbase.client.scanner.cache=10000;

  • 确保设置以下属性以在任务跟踪器中运行分布式作业而不是运行本地作业。

    SET mapred.job.tracker=[YOUR_JOB_TRACKER]:8021;

    SET hbase.zookeeper.quorum=[ZOOKEEPER_NODE_1],[ZOOKEEPER_NODE_2],[ZOOKEEPER_NODE_3];

  • 将 SELECT 语句的列数减少到最少。尽量不要SELECT *

  • 每当您想使用开始和停止行键来防止全表扫描时,始终提供 key>=xkey<y表达式(不要使用 BETWEEN 运算符)

  • 始终 EXPLAIN SELECT执行查询之前的查询。

关于performance - 调整使用底层 HBase 表的 Hive 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com