hive与hbase整合过程及遇到的错误锦集

这个整合其实就是第一次你在hive创建与hbase的表相映射的表 这样就就在hive查看到hbase的表的信息
我们在hive中可以直接查询hbase中的数据
hbase中添加会删除一条数据,在hive中立刻就能体现!!!
在hive中插入一条记录,也能立刻在hbase中体现

就是create表 只不过跟平常创建表不同
你就直接在hive建表(先建个库吧)

create external table if not exists hive2hbase(
id int,
age int,
name string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES (
"hbase.columns.mapping"=":key,base_info:age,base_info:name"
)
TBLPROPERTIES(
"hbase.table.name"="user_info"
);

然后就出现错误了

现在先看错误

1.首先清楚 版本依赖错误:

我的hive是1.2.1 hbase也是1.2.1,然后,hive下面的lib目录有个hive-hbase-handler-1.2.1.jar 包,在你第一次在hive上建与hbase表时,会产生

Cannot find class 'org.apache.hadoop.hive.hbase.struct.HBaseStorageHandler'

既要协调使用hive中的jar,也要使用hbase中的jar包。但是hive的hive-hbase-handler-1.2.1.jar中引用的关于hbase的jar包版本过低(0.9x),所以导致hbase的版本不支持。

  • 解决方案
修改hive-hbase-handler-1.2.1.jar的hbase相关的jar依赖
  • 修改源码的方式–eclipse
1. 打开一个eclipse
2. 在eclipse中随便创建已给java工程
3. 将我们之前下载好的源码导入到eclipse的src目录下,这个时候一会发现一堆错误提示
file ---> import ---> filesystem--->选择你的源码--->finish
4. 创建一个lib目录,把准备好的jar包都拷贝到lib目录中
5. 选中所有的jar包---鼠标右键--->build path
你就会发现不报错
6. 导出
file--->export--->jar file --->
7. 将这个jar包拷贝回hive的lib目目录中,把原来的那个jar包给干掉!!!

我一步一步截图,顺便说下我遇到的问题
1… 打开一个eclipse
2… 在eclipse中随便创建已给java工程
在这里插入图片描述

错误2:注意创建工程时选的jdk版本

我的服务器安装jdk1.7,但第一次创建使用的是jdk1.8,完成后,运行导致的错误是

Exception in thread “main” java.lang.UnsupportedClassVersionError: org/apache/hadoop/hive/hbase/HBaseStorageHandler : Unsupported major.minor version 52.0

就是使用的jar包版本过高,所以要注意选择的jdk版本与你服务器上的jdk版本一致

如果出现上述错误需要重新创建工程选择版本重新打包

  1. 将我们之前下载好的源码导入到eclipse的src目录下,这个时候一会发现一堆错误提示
    file —> import —> filesystem—>选择你的源码—>finish
    右击工程名 选择FileSystem
    在这里插入图片描述
    注意选择 选择org的上一个文件夹
    在这里插入图片描述
    然后勾选 导入 finish
    在这里插入图片描述

你上面选择了org的上一个文件夹 这里导入的才是org文件夹 不然就是org下面的一个文件夹了
在这里插入图片描述

然后 鼠标拖着这个org拖进src下
会发现很多错误提示 都红了

因为没有jar包依赖 它也需要依赖别的包

所以导入你服务器上hbase和hive的两个lib的所有jar包 (这个不用说吧 就从服务器找到下载下来即可)
先新建一个lib放进去 记得build path 这个不用多说吧

当然这是最笨的办法 这会导致你打的jar包过大 几百兆
因为不是需要所有的包
所以就把需要的放进创建的lib即可
下面就是需要的jar包 从hive和hbase扒下来的jar包找即可
在这里插入图片描述

  1. 导出
    file—>export—>jar file —>

  2. 将这个jar包拷贝回hive的lib目目录中,把原来的那个jar包给干掉!!!

右击项目名 export
在这里插入图片描述

勾选好多
然后名字和你要修改的jar包名字一样 即hive-hbase-handler-1.2.1.jar
在这里插入图片描述

这样就行了

然后将jar包到服务器hive的lib下替换!!!

然后重新建表

在这里又遇到错误

错误3 jar包替换后 没有重启hive 导致重新建表出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hive/hbase/ColumnMappings$ColumnMapping

然后重启hive
建表 成功

注意 这是创建hive的外部表 此时hbase存在user_info表

create external table if not exists hive2hbase(
id int,
age int,
name string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES (
"hbase.columns.mapping"=":key,base_info:age,base_info:name"
)
TBLPROPERTIES(
"hbase.table.name"="user_info"
);

注意 冒号:key 可以不写 那就默认使用第一个id作为行键映射

还有TBLPROPERTIES(“hbase.table.name”=“t2”);

指定表明这句话也可以不写 那么默认与hive的表名一致的相映射

然后我就可以查了 就是从hive查hbase的数据
记得要启动hbase的服务才能查看貌似
不然会遇到RetriesExhaustedException异常

Failed with exception java.io.IOException:org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:
Tue Aug 20 13:18:35 CST 2019, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=68851: row 'user_info,,00000000000000' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=hadoop03,16020,1566260253079, seqNum=0

启动hbase后重新在hive查看 得到结果
记得自己建一个库 然后在里面建表 然后再查看 这样比较规范 哈…

hive> select * from hive2hbase;
OK
1	18	lixi
2	19	lixi
3	33	rock
4	100	zhangsanfeng
7	20	shishuai
8	18	qingqing
Time taken: 0.915 seconds, Fetched: 6 row(s)

我再建一个表

此时hbase没有t2这个表 所以我创建的内部表

如果创建内部表 但hbase内部t1已经存在

create table if not exists hive2hbase2(
id int,
age int,
name string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES (
"hbase.columns.mapping"=":key,base_info:age,base_info:name"
)
TBLPROPERTIES(
"hbase.table.name"="t1"
);

就告诉你已经存在 Table t1 already exists within HBase

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:Table t1 already exists within HBase; use CREATE EXTERNAL TABLE instead to register it in Hive.)

在这里插入图片描述
那就创建一个hbase没有的t2
通过hive添加数据 这样hbase也能体现到

create table if not exists hive2hbase2(
id int,
age int,
name string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES (
"hbase.columns.mapping"=":key,base_info:age,base_info:name"
)
TBLPROPERTIES(
"hbase.table.name"="t2"
);

然后导入数据

导入数据方式
  • 创建普通临时表 加载数据 然后插入到 hive的hbase表
create table temp(
id int,
age int,
name string
)
row format delimited
fields terminated by ','
stored as textfile;

load data local inpath '/home/stu.txt' into table temp;

insert into hive2hbase2 select * from temp;

最重要的是这句话

insert into hive2hbase2 select * from temp;

注意数据和临时表 要与hive的hbase表的类型顺序一样 你名字可以不通 但类型要一样
在这里插入图片描述
插入成功
在这里插入图片描述
查看数据
在这里插入图片描述

hbase刚开始的情况
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第二次创建内部表时就会有t2表 在hbase中
在这里插入图片描述
通过hive插入数据后
hbase的t2也有数据了
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值