hive访问不在同一集群的hbase表数据

网友投稿 648 2022-11-10

hive访问不在同一集群的hbase表数据

hive访问不在同一集群的hbase表数据

文章目录

​​背景​​​​开启白名单限制​​​​打通hive集群与hbase集群的连接​​​​创建hbase映射表​​

背景

最近有个需求,有一些数据会实时写入到 ​​hbase​​​,但是又需要在 ​​hive​​​ 中计算这些数据,最后把结果同步到 ​​mysql​​​。如果对于 ​​hbase​​​ 与​​hive​​​ 在同一个集群,是很简单的操作,直接在 ​​hive​​​ 中创建一个 ​​hbase​​​ 的外部映射表就好了。但是我这边有些不一致,我们这边 ​​hbase​​​ 和 ​​hive​​ 在两个不同的集群,需要了一些额外的操作

开启白名单限制

由于 ​​hbase​​​ 集群与 ​​hive​​​ 集群的网络被限制,所以需要把 ​​hive​​​ 集群的节点全部加入到 ​​regionServer​​​ 以及 ​​zk​​​ 节点的白名单列表,或者修改安全组,使得 ​​hive​​​ 能够访问 ​​hbase​​ 的每个节点。

打通hive集群与hbase集群的连接

对于不在同一集群的 ​​hive​​​ 与 ​​hbase​​​,需要在 ​​hive​​​ 中设置 ​​hbase​​​ 的 ​​zk​​ 集群地址。

set hbase.zookeeper.quorum=zk001:2181,zk002:2181,zk003:2181

Tip:首先要使用 hive 命令进入 hive shell

创建hbase映射表

然后创建 ​​hbase​​ 映射表

hive> set hbase.zookeeper.quorum=zk001:2181,zk002:2181,zk003:2181;hive> create external table bi_ods.sucx_test (id string,name string,age string) > stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' > with serdeproperties ("hbase.columns.mapping" = ":key,cf1:name,cf1:age") > tblproperties ("hbase.table.name" = "sucx_test");

进行简单查询

hive> select * from bi_ods.sucx_test;OK1 sucx 102 sucx1 15Time taken: 4.631 seconds, Fetched: 2 row(s)

绝大部分到这一步就结束了,但是我这边还是有点问题。首先解释下,我们这边的所有数据都是存储在oss和s3上,然后我们使用的是emr集群,emr集群只做计算,同一时间可能会启动多个emr集群来进行计算。假设我有A、B两个emr集群,刚刚我执行的所有操作都是在A集群之上,当我用B集群访问bi_ods.sucx_test数据的时候发现,竟然连接到了A集群的hdfs,由于网络隔离,查询失败。

> select * from bi_ods.sucx_test;FAILED: SemanticException Unable to determine if hdfs://emr-header-1.cluster-75160:9000/user/hive/warehouse/bi_ods.db/sucx_test is encrypted: java.lang.IllegalArgumentException: java-.UnknownHostException: emr-header-1.cluster-75160

这个时候怀疑映射表的 ​​location​​​ 是不是落到A集群的​​hdfs​​ 上了。于是查看了下元数据信息

果然是在A集群的本地,然后看了看建表语句也确实是外部表

查看该表在A集群的hdfs信息

[hadoop@emr-worker-1 ~]$ hadoop fs -ls /user/hive/warehouse/bi_ods.db/ | grep sucx_testdrwxr-x--x - hadoop hadoop 0 2019-09-25 11:31 /user/hive/warehouse/bi_ods.db/sucx_test[hadoop@emr-worker-1 ~]$ hadoop fs -ls /user/hive/warehouse/bi_ods.db/sucx_test[hadoop@emr-worker-1 ~]$

只是个空文件夹,说明数据还是存在外部的。 于是先删除表,尝试着建表时增加 location 配置

hive> create external table bi_ods.sucx_test (id string,name string,age string) > stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' > with serdeproperties ("hbase.columns.mapping" = ":key,cf1:name,cf1:age") > tblproperties ("hbase.table.name" = "sucx_test") > location 'oss://bigdata/bi/bi_ods.db/sucx_test';FAILED: ParseException line 5:0 missing EOF at 'location' near ')'

无法解析。。

​​hive-site.xml​​​ 有个选项 ​​hive.metastore.warehouse.dir​​​ 配置,表示数据的存放位置,默认是 ​​/user/hive/warehouse​​​ ,如果把这个配置修改为oss路径就好了,可是如果修改这个配置,需要重启集群,放弃了。想到 ​​hive database​​​ 也有个 ​​location​​​ 配置,会不会是这个 ​​bi_ods​​​ 库默认创建的 ​​location​​ 是在本地

hive> show create database bi_ods;OKCREATE DATABASE `bi_ods`LOCATION 'hdfs://emr-header-1.cluster-75160:9000/user/hive/warehouse/bi_ods.db'Time taken: 0.282 seconds, Fetched: 3 row(s)hive>

果然,于是修改了这个 ​​bi_ods​​​ 的 ​​location​​,重新创建映射表,A、B集群都能访问数据了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:syntax error near unexpected token `(‘ 异常解决
下一篇:如何在不使用spring框架中使用aop的功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~