【问题标题】:Hive over HBase for deep analytical queryHive over HBase 用于深度分析查询
【发布时间】:2018-05-24 10:30:09
【问题描述】:

我能够使用 Hive 连接和访问现有的 HBase 表(使用 Hive HBaseStorage Handler)。

我认为界面功能不是很强大。这个接口可以用于大型分析数据处理吗?

【问题讨论】:

  • 您可能对What is Hive 感兴趣? Hive 只是充当一种(工作)编译器。这意味着 Hive 会将类似 SQL 的语句(过滤或连接)转换为 Hadoop 框架的本机代码。为此,它会为集群编译一个作业,并将其发送到并执行。它非常适合将工作负载拆分为更小的部分并将工作分配到许多节点上。

标签: hadoop hive hbase hiveql phoenix


【解决方案1】:

不,它不能。任何 WHERE 子句最终都会作为 HBase 表中的完整 SCAN 并且扫描非常慢。请检查https://phoenix.apache.org/ 作为替代方案。

【讨论】:

  • 我也在使用 apache phoenix。但我将它用于 oltp 应用程序。但出于分析目的,我认为它的性能将基于 rowkey 并且它会影响 oltp 应用程序。
【解决方案2】:

Apache Phoenix 更适用于查询 HBase。 您也可以使用 Hive 查询 HBase,然后您的查询将在 Map Reduce Job 中转换,这将比 Phoenix 花费更多时间。

PS:即使您使用 Hbase,也可以使用 Hive 进行大数据分析。

【讨论】:

  • 仅适用于 oltp 应用程序,我也在使用 apache phoenix。我想要 oltp 和 olap。这就是为什么我要尝试在现有的 hbase 上配置 olap。
【解决方案3】:

通过HBase 更快地进行分析查询的一个好解决方案是将HBaseHiveImpala 结合起来。

以下场景就是一个例子:

我有一个Kafka producerjson 格式的套接字接收来自物联网设备的数千个信号。我正在与Spark 流中的消费者一起处理这些信号,并将这些信号放入HBase 表中。

HBase 表和数据示例

$ hbase shell
hbase> create_namespace 'device_iot'
hbase> create 'device_iot:device', 'data'
hbase> put 'device_iot:device', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23a-1509793235', 'data:deviceID', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23c'
hbase> put 'device_iot:device', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23a-1509793235', 'data:temperature', '12'
hbase> put 'device_iot:device', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23a-1509793235', 'data:latitude', '52.14691120000001'
hbase> put 'device_iot:device', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23a-1509793235', 'data:longitude', '11.658838699999933'
hbase> put 'device_iot:device', '11c1310e-c0c2-461b-a4eb-f6bf8da2d23a-1509793235', 'data:time', '2019-08-14T23:30:30000'

Hive 表在HBase 表之上

CREATE EXTERNAL TABLE t_iot_devices (
id string, deviceID string, temperature int, latitude double, longitude double, time string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,data:deviceID,data:temperature,data:latitude,data:longitude,data:time") 
TBLPROPERTIES("hbase.table.name" = "device_iot:device");

Impala中查询

impala> invalidate metadata;
SELECT deviceID, max(temperature) AS maxTemperature 
FROM t_iot_devices 
GROUP BY deviceID;

+--------------------------------------+----------------+
| deviceid                             | maxtemperature |
+--------------------------------------+----------------+
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23b | 39             |
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23a | 39             |
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23c | 39             |
+--------------------------------------+----------------+

SELECT deviceID, substr(time,1,10) AS day, max(temperature) AS highest 
FROM t_iot_devices 
WHERE  substr(time,1,10) = '2019-07-07' 
GROUP BY deviceID, substr(time,1,10);

+--------------------------------------+------------+---------+
| deviceid                             | day        | highest |
+--------------------------------------+------------+---------+
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23c | 2019-07-07 | 34      |
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23b | 2019-07-07 | 35      |
| 11c1310e-c0c2-461b-a4eb-f6bf8da2d23a | 2019-07-07 | 22      |
+--------------------------------------+------------+---------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2023-04-03
    • 2012-02-28
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多