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

2023-12-29

我在 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')])}"

快如闪电!

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

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

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

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

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


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

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

HBase 不支持二级索引或替代查询路径(更多信息 https://hbase.apache.org/book.html#secondary.indexes).

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",它将被处理程序检测到,并且开始和停止行键将提供给 SCAN (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>=x and key<y表达式(不要使用 BETWEEN 运算符)

  • Always EXPLAIN SELECT在执行查询之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整使用底层 HBase 表的 Hive 查询 的相关文章

  • 如何使用hbase协处理器实现groupby?

    最近学习了hbase协处理器 我使用endpoint来累加hbase表的一列 例如 名为 pendings 的hbase表 它的家族是 asset 我累加了 asset amount 的所有值 该表还有其他列 例如 asset custom
  • 如何修复“任务尝试_201104251139_0295_r_000006_0 未能报告状态 600 秒”。

    我编写了一个 MapReduce 作业来从数据集中提取一些信息 该数据集是用户对电影的评分 用户数量约25万 电影数量约30万 地图的输出是
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • 这个 cProfile 结果告诉我需要修复什么?

    我想提高Python脚本的性能并且一直在使用cProfile生成性能报告 python m cProfile o chrX prof bgchr py args 我打开这个chrX prof使用 Python 的文件pstats并打印出统计
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 如何在hadoop mapreduce/yarn中设置VCORES?

    以下是我的配置 mapred site xml map mb 4096 opts Xmx3072m reduce mb 8192 opts Xmx6144m yarn site xml resource memory mb 40GB min
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Hadoop 减速器数量配置选项优先级

    以下3个设置reduce数量的选项的优先级是什么 换句话说 如果三者都设置了 会考虑哪一个呢 Option1 setNumReduceTasks 2 within the application code Option2 D mapredu
  • 与保留模式 GUI 相比,使用立即模式 GUI 对性能有何影响?

    我目前正在开发一个标准的 Windows 桌面应用程序 标准意味着没有花哨的东西 只是按钮 文本 滑块等 在研究了一些 GUI 框架并被拒绝后 我决定自己编写一个 GUI 框架他们全部 由于这是一个业余爱好项目 我也愿意尝试 并决定将 GU
  • 通过 Java 连接 Apache Drill

    在 Apache Drill 的 Wiki 中 我只能看到通过 SqlLine 客户端运行的查询 除了 REST API 之外 是否有任何编程方式可以在 Drill 中运行查询 有任何示例或指示吗 或者它与使用 JDBC 驱动程序运行 SQ
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 到 ToList() 还是不到 ToList()?

    给定一个在记忆中 不是 LINQ to SQL 类列表 List
  • 谷歌的Dremel是什么?它与 MapReduce 有什么不同?

    谷歌的 Dremel 是此处描述 http research google com pubs pub36632 html Dremel 和 Mapreduce 有什么区别 Dremel http research google com pu
  • 缺少依赖项 hive-builtins 会导致 Oozie 构建失败,错误代码为 410

    我尝试从源代码构建 oozie 但安装失败 我想安装 oozie 并热切地等待使用它 我在这个阶段失败了 当我从 oozie 3 3 3 目录给出 cmd 时 bin mkdistro sh DskipTests 我收到这个错误 INFO
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存

随机推荐

  • 如何在 Flutter 中“设置”“WidgetTester”进行多个测试

    1 问题 The testWidgets函数显然只是test功能 我现在试图解决的一个用例是为多个泵送相同的小部件testWidgets a setUp对于多个testWidgets 但是 如果它在每个测试中创建一个新实例 我该如何做到这一
  • ANSI C 中的动态列表?

    我是否正确地认为创建在 C 中运行时增长的列表的唯一方法是使用链表 您可以结合使用 malloc 和 realloc 首先初始化一个 C 数组 malloc 并增长它 realloc 但是 如果您进行大量插入 您不会希望一次将其增加 1 个
  • 提交签名如何工作?

    我目前想知道 git commit 签名到底是如何工作的 试图找出这一点 但找不到任何确切的技术文档 我知道如何进行 git 提交签名 但我想知道 git 到底做了什么来签署提交 签署的具体内容是什么 它是给定提交时存储库内的完整数据 即提
  • 找出内存泄漏吗?

    我是 iphone 应用程序的新手 现在这是我的第一个应用程序 应用程序已安装但未运行 我写的这段代码显示内存泄漏 请找出来 提前致谢 ABRecordRef ref CFArrayGetValueAtIndex all i CFStrin
  • 如何在 HTA 文件上播放声音

    我已经在互联网上搜索了一段时间 但没有教程解释如何播放声音
  • 当重新创建布局包含视图的活动时,视图的“标签”是否会恢复?

    The docs http developer android com training basics activity lifecycle recreating html关于Activity休闲状态 默认情况下 系统使用Bundle实例状
  • Node js 中连接 ECONNREFUSED 127.0.0.1:21 错误

    我正在用 Node js 编写一个简单的应用程序 但遇到了这个问题 Error connect ECONNREFUSED 127 0 0 1 21 at Object exports errnoException util js 1034
  • 在Python2上运行jupyter笔记本时遇到困难

    我有Python 2 2 7 14 和 Python 3 3 6 4 安装在我的电脑上 Linux rajarshi x550cc 4 15 10 300 fc27 x86 64 1 SMP Thu Mar 15 17 13 04 UTC
  • 使用 libgdx 缩放 scene2d 按钮

    I don t know if it is just me but drawables http libgdx badlogicgames com nightlies docs api com badlogic gdx scenes sce
  • 如何关闭 MKMapView 中 MKAnnotation 的标注

    我有一个带有许多注释的 MKMapView 选择引脚会显示标注 按下附件会将新的视图控制器弹出到堆栈上 然而 当我从新的 VC 中按回时 标注仍然打开 我该如何关闭它 我努力了 if myMapView selectedAnnotation
  • 如何在java中使用enumMap

    java中如何使用enumMap 我想使用 enumMap 来获取从 0 到 n 的常量命名值 其中 n 是大小 但我不明白oracle网站上的描述 gt EnumMap http docs oracle com javase 8 docs
  • 字符串转换器获取标准值集合

    我正在尝试使用属性网格来显示数据 我必须为预定义的字符串常量编写 StringConverters 以便它们可以显示在组合框中 考虑一个颜色列表和另一个角度 0 90 180 270 列表 我想在网格上显示很多这样的列表 我正在编写从 St
  • d3.js 中的可折叠/分层和力导向图

    有很多强制导向图 即节点和链接 和可折叠树 即父子节点 的示例 但我找不到这些组合的示例 除了像这样的一些 1 级集群网络 http static cybercommons org js d3 examples force force cl
  • 在 SwiftUI 中向按钮添加文本和图像

    我正在尝试添加两者Text and Image on Button like Button action Image gift Text Send padding horizontal padding foregroundColor whi
  • 如何以编程方式向解决方案添加/删除现有项目?

    此处发布了类似 不重复 的问题 如何以编程方式列出解决方案中的所有项目 https stackoverflow com questions 3802027 reading the list of all csproj projects of
  • 在选择 Ticker 时,time.After 不起作用

    我在尝试时遇到了这个问题time Ticker 如下面的代码 case lt time After time Millisecond 5500 从不执行 程序会重复打印 ticker 和 chan 谁能解释一下吗 package main
  • 在 C++ 中对于非常大的数字使用哪种数据类型?

    我必须存储号码600851475143在我的程序中 我尝试将其存储在long long int变量和long double也一样 但是编译时显示错误 integer constant is too large for long type 我
  • Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?

    我正在这里阅读教程 https symfony com doc current form csrf protection html https symfony com doc current form csrf protection htm
  • 将对象数组插入 MongoDB

    我想知道如何使用自己预定义的 id 值将对象数组插入到 Mongodb 集合 根级文档 中 我努力了db MyCollection insert array 但它会在 MongoDB 中的一个生成的 id 下创建嵌套文档 var array
  • 调整使用底层 HBase 表的 Hive 查询

    我在 Hbase 中有一个表 比如说 tbl 我想使用它来查询它 蜂巢 因此我将一个表映射到 hive 如下所示 CREATE EXTERNAL TABLE tbl id string data map