Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 优化使用基础HBase表的配置单元查询_Performance_Hadoop_Hive_Hbase_Integration - Fatal编程技术网

Performance 优化使用基础HBase表的配置单元查询

Performance 优化使用基础HBase表的配置单元查询,performance,hadoop,hive,hbase,integration,Performance,Hadoop,Hive,Hbase,Integration,我在Hbase中有一个表,比如说“tbl”,我想使用 蜂箱因此,我将一个表映射到配置单元,如下所示: 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:") TBLPROPE

我在Hbase中有一个表,比如说“tbl”,我想使用 蜂箱因此,我将一个表映射到配置单元,如下所示:

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 id from tbl where substr(id, 0, 5) = "12345"

select id from tbl where data["777"] IS NOT NULL 
你的速度太慢了

从Hbase外壳运行时,情况正好相反:

"scan 'tbl', {
COLUMNS=>'data', STARTROW='12345', ENDROW='12346'}" or
"scan 'tbl', { COLUMNS=>'data', "FILTER" =>
FilterList.new([qualifierFilter('777')])}"
它是闪电般的快

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

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

改进配置单元查询(映射到HBase表)性能的任何建议

我们可以在HBase表上创建辅助索引吗


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

很多问题!,我将尝试回答所有问题,并为您提供一些性能提示:

数据不会复制到HDFS,但HIVE生成的mapreduce作业将在HDFS中存储它们的中间数据

HBase()不支持辅助索引或替代查询路径

Hive会将所有内容转换为需要时间进行分发和初始化的MapReduce作业,如果您的行数非常少,则Hbase外壳中的简单扫描操作可能比Hive查询快,但在大型数据集上,必须在datanodes之间分发作业

当从查询中提取开始和停止行键时,配置单元HBase处理程序的工作不是很好,像
substr(id,0,5)=“12345”
这样的查询不会使用开始和停止行键

在执行查询之前,运行
EXPLAIN[your_query]
命令并检查过滤器expr:部分,如果找不到它,查询将执行完整表扫描。另请注意,
筛选器运算符:
中的所有表达式都将转换为相应的筛选器

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
                ....
解释从tbl中选择*,其中(id>='12345')和(id映射运算符树:
tbl
表扫描
别名:tbl
filterExpr:
表达式:((id>='12345')和(id<'12346'))
类型:布尔型
过滤算子
....

幸运的是,有一种简单的方法可以确保在查找行键前缀时使用开始和停止行键,只需将
substr(id,0,5)=“12345”
转换为更简单的查询:
id>=“12345”和id=x
键感谢您的简要解释。从HBase获取数据时,是否有方法在配置单元中应用提示(例如,在配置单元中按群集)。我不太确定您希望用它实现什么,但我很确定它不受支持。如果您关心减少网络I/O的数量,那么Hive和底层系统生成的MR作业将足够智能,可以沿每个区域数据所在的区域服务器分发扫描。请给它一个ry并让我知道;)您有任何针对Hive的文本、ORC和HBase集成的查询数据吗?Tpch查询与上述所有存储格式相比如何?对于HBASE表与HIVE表的联接,是否也可以进行上述操作?@thebluephantom是的,可以。关键是要确保每个查询的表都有一个filterExpr,以避免对整个表进行扫描。您是否有针对Hive的文本、ORC和HBase集成运行的查询的数据?Tpch查询与上述存储格式相比如何?谢谢和问候!嘿@Ram,你有没有为这个问题找到合适的解决方案/解决方法?
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
                ....