调整使用底层 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 查询 的相关文章

  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • Mapreduce shuffle 阶段出现内存不足错误

    我在运行时遇到奇怪的错误类似字数统计映射缩减程序 我有一个包含 20 个从站的 hadoop 集群 每个从站都有 4 GB RAM 我将 Map 任务配置为 300MB 堆 Reduce 任务槽为 1GB 我每个节点有 2 个映射槽和 1
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 如何调试性能问题/优化您的流星应用程序

    我刚刚将 Meteor 应用程序部署到 Digital Ocean 上的生产服务器上 我注意到 对于大约 7500 个文档 完全获取对象 有选择地仅获取 3 个字段 并填充自动完成数据大约需要 3 5 秒 我相信对于如此数量的数据来说 它应
  • Java中精确的时间测量

    Java 提供了两种获取当前时间的方法 System nanoTime and System currentTimeMillis 第一个给出的结果以纳秒为单位 但实际精度比这要差得多 许多微秒 JVM 是否已经为每台特定机器提供了最佳的价值
  • 如何清除chrome性能条目或绕过其数量限制?

    我使用 Google Chrome 来分析一些使用 Javascript 动态加载脚本和其他资源的网页的性能 我用performance getEntries 方法 但我注意到 Chrome 只记录前 150 个资源 我找不到任何方法来获取
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 为什么我们需要将外部表移动到托管 Hive 表?

    我是 Hadoop 新手 正在学习 Hive 在 Hadoop 权威指南第 3 版中 第 12 页 第428章 最后一段 我不明白下面关于 HIVE 中外部表的段落 一种常见的模式是使用外部表访问存储在 HDFS 中的初始数据集 由另一个进
  • 我们是否需要使用 MappedByteBuffer.force() 将数据刷新到磁盘?

    我正在使用 MappedByteBuffer 来加速文件读 写操作 我的问题如下 我不确定是否需要使用 force 方法将内容刷新到磁盘 似乎没有 force getInt 仍然可以完美工作 好吧 因为这是一个内存映射缓冲区 我假设 get
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 无法在 Presto 中读取数据 - 在 Hive 中可以读取数据

    我有一个 Hive DB 我创建了一个与 Parquet 文件类型兼容的表 CREATE EXTERNAL TABLE default table date date udid string message token string PAR
  • 地图与星图的性能?

    我试图对两个序列进行纯Python 没有外部依赖 逐元素比较 我的第一个解决方案是 list map operator eq seq1 seq2 然后我发现starmap函数来自itertools 这看起来和我很相似 但事实证明 在最坏的情
  • numpy 数组最快的保存和加载选项

    我有一个生成二维的脚本numpy数组与dtype float和形状的顺序 1e3 1e6 现在我正在使用np save and np load对数组执行 IO 操作 然而 这些函数对于每个数组都需要几秒钟的时间 是否有更快的方法来保存和加载
  • Scala 中的模式匹配是如何在字节码级别实现的?

    Scala 中的模式匹配是如何在字节码级别实现的 是不是像一系列if x instanceof Foo 构造 还是其他什么 它对性能有何影响 例如 给出以下代码 来自Scala 示例 http www scala lang org docu
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该
  • 如何阻止 Eclipse 上的 JPA Facet 始终更新?

    我在 Eclipse 中有一个 EJB2 EJB3 Java 项目 我最近启用了 JPA Facet 现在安装了 Dali 并配置了对包含实际表和数据的 MySQL 数据库的访问 问题是 在 IDE Java 编辑器中编辑实体 bean 速
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • .NET 程序集大小会影响性能吗?

    net 程序集的大小是否会影响性能 您的 Windows 窗体 Web 窗体项目中的程序集数量如何 来自微软的模式和实践提高 NET 应用程序性能和可扩展性 http msdn microsoft com en us library ms9

随机推荐

  • 如何在 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