- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 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>=x
和 key<y
表达式(不要使用 BETWEEN 运算符)
始终 EXPLAIN SELECT
执行查询之前的查询。
关于performance - 调整使用底层 HBase 表的 Hive 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074734/
我有以下功能: function addChange(result, bill) { for (var i=0;i
这是网站: www.wearethefirehouse.com/phasetest 如果您慢慢滚动,您会注意到一旦菜单栏完全不透明,nav li 元素就会全部从 Enzo 300 跳起来(如在没有导航
美好的一天。对于当前的项目,我需要知道数据类型如何表示为字节。例如,如果我使用: long three = 500;var bytes = BitConverter.GetBytes(three);
请解释 JVM 是如何在底层收集 ThreadDump 的。 我不明白它如何收集脱离 CPU 的线程的堆栈跟踪(等待磁盘 IO、网络、非自愿上下文切换)。 例如,linux perf 仅收集有关 on
开始学习 R,如果能帮助我理解 R 如何决定不同向量的类别,我将不胜感激。我初始化 vec <- c(1:6)当我执行 class(vec)我得到“整数”。为什么它不是“数字”,因为我认为 R 中的整
我有一个透明的 UIView,几乎覆盖了整个屏幕。我在顶部留下了 50 像素。它是 View Controller View 的 subview 。 在UIView下面有一个继承自UIView的MyV
我很好奇对象是如何在 Nodejs 中显示的,在本例中是 Promise。使用 console.log(promiseObject) 时,输出的类型为 {状态:待处理} 这对我来说似乎很奇怪,因为在该
当您在 Windows Azure 中使用表服务 API 时,幕后到底在做什么?我想我在某处读到这没有使用 SQL Server。它是否执行哈希表,然后过滤器真的像映射/减少操作一样运行?我对这些东西
如何查看函数 concat 中的代码?它是如何做的?有没有人有代码的副本或在浏览器控制台中查看它的方法? console.dir 不给我访问权限 console.dir(Array.prototype
我是 C++ 的新手,所以如果这个问题的答案显而易见,我深表歉意。 我一直在编写 STL 样式的自定义数据结构,以此来提高我的技能。 (我实际上也确实需要这种结构,但出于学习目的,我有点过分了。) 此
我正在尝试使用 log4j appender 将日志发送到 GrayLog2 (log4j2-gelf)。所以我将我的依赖项添加到我的 pom.xml 配置 log4j2.xml 来配置我的 appe
我正在使用带有 vector 的 priority_queue 作为底层容器。但是我希望堆的大小非常大。我知道动态 vector 容量调整大小的问题。所以我正在寻找方法来为我的priority_que
我有一个 SqlDataAdapter,它填充了 21 行数据(4 列)。驱动它的 sproc 在几秒钟内在 SQL Mgmt Studio 中返回,但 .Fill() 需要 5 分钟。 Ar
我想实现一个屏幕控制按钮,按下它可以作为 GUI 交互的修饰符。 这对于 MouseArea 是不可能的,因为该 API 只能处理一个鼠标区域中的一个触摸点。 该限制不适用于 MultiPointTo
我试图将图像和 div 层置于包含 div 的中心,但到目前为止我无法让它从列的左侧移动。我尝试了几种不同的方法,但就是无法让它移动。即使 margin auto 技巧也不起作用,我怀疑这是因为 bo
需要明确的是,我不是在询问 HDFS 中的权限设置,而是在 ext3 中或在 HDFS 运行于其上的各个数据节点机器上使用的任何文件系统中。 p> 我知道我们设置了 sudo chown hduser
我在服务器上创建了一个枚举,其中手动设置了整数值,而不是默认从 0 开始递增 public enum UserType { Anonymous = 0, Customer = 10,
如果显示框架图像,我们能否使以下 Google map 具有交互性。 Vie
我有一个顶部有自定义状态栏的布局 [在 Apple 的状态栏下方],然后是 UIScrollview 在中间部分从左到右分页,然后我有一个 UIView 底部有一些自定义按钮。一个简单的三 Pane
事情是这样的。我有一个 MVC 操作,在该操作上,我应用了自定义 ActionFilterAttribute 来使反序列化工作。现在,我想要做的是根据在此 View 中设置的 ViewBag.Titl
我是一名优秀的程序员,十分优秀!