Impala - 使用Impala集成并操作HBase教程(附:使用Hive查询HBase数据)
作者:hangge | 2024-10-25 08:40
1,原理介绍
(1)为了解决 HBase 无法使用 SQL 实现数据分析的问题,可以通过 Hive 来实现,也可以通过 Impala 来实现。
(2)通过 Impala 操作 HBase 时,需要在 Hive 中建表,然后把表同步到 Impala 中,无法直接在 Impala 中基于 HBase 创建表,因为 Impala 的 CREATE TABLE 功能中有很多语法并不支持。
- 所以大致的流程是这样的:HBase -> Hive -> Impala
(3)Impala 不是直接读取 HBase 表的底层数据文件,而是通过 HBase 客户端 API 代码读取 HBase 表中的数据,只不过这些代码不需要我们开发了,我们直接写上层的 SQL 就可以了。
2,Impala 配置
首先我们需要在 Impala 中修改配置,以支持 HBase,否则 Impala 连不上 HBase。以 CDH 平台为例,进入 impala 的配置页面,选中 HBase,然后点击保存更改按钮,最后重启 Impala。
3,HBase 准备工作
(1)要操作 HBase 首先肯定是要准备好 HBase 集群环境。
(2)接着我们在 HBase 中创建一张存储用户信息的 video_user 表,其中 basic 列族中存储用户基础信息,extend 列族中存储用户扩展信息。
create 'video_user','basic','extend'
(3)然后向 HBase 表中初始化测试数据:
提示:为了避免 rowkey 出现热点,所以在向 HBase 中添加数据的时候,针对 rowkey 中的 id 字段的值进行了反转。
- 例如:900001,其实真正的 id 值是 100009。
put 'video_user','100001','basic:name','hangge001' put 'video_user','100001','basic:birthday','2006-07-21' put 'video_user','100001','basic:email','fx0i2724@yeah.net' put 'video_user','100001','basic:mobile','15208252251' put 'video_user','100001','basic:r_time','2024-01-17 01:10:10' put 'video_user','100001','extend:is_have_child','0' put 'video_user','100001','extend:phone_brand','huawei' put 'video_user','100001','extend:weight','67' put 'video_user','100001','extend:height','160' put 'video_user','200001','basic:name','hangge002' put 'video_user','200001','basic:birthday','2005-04-23' put 'video_user','200001','basic:email','emau0i5i@sina.com' put 'video_user','200001','basic:mobile','15105571420' put 'video_user','200001','basic:r_time','2024-01-17 01:21:13' put 'video_user','200001','extend:is_have_child','1' put 'video_user','200001','extend:phone_brand','huawei' put 'video_user','200001','extend:weight','63' put 'video_user','200001','extend:height','168' put 'video_user','300001','basic:name','hangge003' put 'video_user','300001','basic:birthday','2002-10-11' put 'video_user','300001','basic:email','824c1s@hotmail.com' put 'video_user','300001','basic:mobile','15701964301' put 'video_user','300001','basic:r_time','2024-01-17 01:25:10' put 'video_user','300001','extend:is_have_child','0' put 'video_user','300001','extend:phone_brand','oppo' put 'video_user','300001','extend:weight','53' put 'video_user','300001','extend:height','170' put 'video_user','400001','basic:name','hangge004' put 'video_user','400001','basic:birthday','2008-07-11' put 'video_user','400001','basic:email','mgq14kt@3721.net' put 'video_user','400001','basic:mobile','15802961143' put 'video_user','400001','basic:r_time','2024-01-17 01:30:10' put 'video_user','400001','extend:is_have_child','0' put 'video_user','400001','extend:phone_brand','iphone' put 'video_user','400001','extend:weight','68' put 'video_user','400001','extend:height','180' put 'video_user','500001','basic:name','hangge005' put 'video_user','500001','basic:birthday','2001-09-21' put 'video_user','500001','basic:email','i4dwzt54b@yahoo.com.cn' put 'video_user','500001','basic:mobile','13804117689' put 'video_user','500001','basic:r_time','2024-01-17 02:13:12' put 'video_user','500001','extend:is_have_child','1' put 'video_user','500001','extend:phone_brand','xiaomi' put 'video_user','500001','extend:weight','60' put 'video_user','500001','extend:height','165' put 'video_user','600001','basic:name','hangge006' put 'video_user','600001','basic:birthday','2002-11-11' put 'video_user','600001','basic:email','cc33o9ak@sina.com' put 'video_user','600001','basic:mobile','13206823730' put 'video_user','600001','basic:r_time','2024-01-17 02:15:10' put 'video_user','600001','extend:is_have_child','0' put 'video_user','600001','extend:phone_brand','iphone' put 'video_user','600001','extend:weight','69' put 'video_user','600001','extend:height','175' put 'video_user','700001','basic:name','hangge007' put 'video_user','700001','basic:birthday','2005-06-18' put 'video_user','700001','basic:email','56vptzo5x@yeah.net' put 'video_user','700001','basic:mobile','13307064763' put 'video_user','700001','basic:r_time','2024-01-17 02:20:10' put 'video_user','700001','extend:is_have_child','1' put 'video_user','700001','extend:phone_brand','xiaomi' put 'video_user','700001','extend:weight','55' put 'video_user','700001','extend:height','177' put 'video_user','800001','basic:name','hangge008' put 'video_user','800001','basic:birthday','2006-09-12' put 'video_user','800001','basic:email','t3929y3k4@163.com' put 'video_user','800001','basic:mobile','15200018067' put 'video_user','800001','basic:r_time','2024-01-17 02:30:10' put 'video_user','800001','extend:is_have_child','0' put 'video_user','800001','extend:phone_brand','huawei' put 'video_user','800001','extend:weight','57' put 'video_user','800001','extend:height','170' put 'video_user','900001','basic:name','hangge009' put 'video_user','900001','basic:birthday','2003-01-17' put 'video_user','900001','basic:email','9i07c7ix@msn.com' put 'video_user','900001','basic:mobile','15605340859' put 'video_user','900001','basic:r_time','2024-01-17 02:33:12' put 'video_user','900001','extend:is_have_child','1' put 'video_user','900001','extend:phone_brand','huawei' put 'video_user','900001','extend:weight','59' put 'video_user','900001','extend:height','167' put 'video_user','010001','basic:name','hangge010' put 'video_user','010001','basic:birthday','2004-05-12' put 'video_user','010001','basic:email','ftewcpcj@3721.net' put 'video_user','010001','basic:mobile','13105938235' put 'video_user','010001','basic:r_time','2024-01-17 03:10:10' put 'video_user','010001','extend:is_have_child','1' put 'video_user','010001','extend:phone_brand','samsung' put 'video_user','010001','extend:weight','64' put 'video_user','010001','extend:height','168'
4,在 Hive 中创建外部表
(1)我们在 Hive 中执行如下命令创建一张外部表 video_user:
注意:
- id 字段对应的是 hbase 中表的 rowkey 字段,这个字段类型建议指定为 string 类型,这样在 SQL 中对 id 进行过滤查询的时候可以将过滤条件翻译成针对 HBase 表中 rowkey 的条件查询,这样查询效率比较高。
- 由于 impala 不支持 date 字段,所以 birthday 字段需要设置为 string 类型,在使用层面其实是没有区别的。
create external table video_user( id string, name string, birthday string, email string, mobile string, r_time timestamp, is_have_child int, phone_brand string, weight int, height int ) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties( "hbase.columns.mapping"=":key,basic:name,basic:birthday,basic:email,basic:mobile,basic:r_time,extend:is_have_child,extend:phone_brand,extend:weight,extend:height" ) tblproperties("hbase.table.name" = "video_user");
(2)相关参数说明:
- stored by 后面指定的是表中数据存储的格式,这里表示使用 HBase 存储。
- with serdeproperties 里面指定的是序列化和反序列化相关的参数,通过 hbase.columns.mapping 指定 hive 表字段和 hbase 表字段之间的映射关系,其中第一个 :key 字段表示是 hbase 中的 rowkey 字段,后面的字段会按照顺序和 hive 表字段进行映射,hbase.columns.mapping 的值中间不能有空格和换行符。
- tblproperties 里面指定表相关的信息,通过 hbase.table.name 指定 hbase 中的表名。
5,将表同步到 Impala 中
(1)在 Impala 中执行如下命令,将上面 Hive 创建的表同步到 Impala 中。
invalidate metadata;
(2)然后执行如下命令确定表是否已经同步过来。这样可以在 Impala 中操作 video_user 这个表了,其实对应的就是操作 hbase 中的 video_user 表。
show tables;
6,在 Impala 中操作 HBase
(1)首先我们在 Impala 中执行如下查询语句,其相当于我们使用 Scan 对 HBase 中的表进行全表扫描。
select * from video_user;
(2)下面这个 SQL 语句相当于我们在使用 HBase 中的 Scan 扫描数据时传入了 RowFilter 这个基于 rowkey 的过滤器,这个操作的查询效率还是比较高的。
select * from video_user where name = 'hangge002';
(3)下面这个 SQL 语句相当于我们在使用 HBase 中的 Scan 扫描数据时传入了 SingleColumnFilter 过滤器,对普通列进行过滤查询,此时没有使用到 rowkey,所以依然是全表扫描,效率一般。
select is_have_child,count(*) from video_user group by is_have_child;
附:使用 Hive 查询 HBase 数据
提示:前面我们在 Hive 创建了外部表与 HBase 表进行映射后,我们在 Hive 中执行这些查询操作也是可以的,只是查询速度没有在 Impala 中快。
(1)首先我们在 Hive 中执行如下查询语句,其相当于我们使用 Scan 对 HBase 中的表进行全表扫描。
select * from video_user;
(2)下面这个 SQL 语句相当于我们在使用 HBase 中的 Scan 扫描数据时传入了 RowFilter 这个基于 rowkey 的过滤器,这个操作的查询效率还是比较高的。
select * from video_user where name = 'hangge002';
(3)下面这个 SQL 语句相当于我们在使用 HBase 中的 Scan 扫描数据时传入了 SingleColumnFilter 过滤器,对普通列进行过滤查询,此时没有使用到 rowkey,所以依然是全表扫描,效率一般。
select is_have_child,count(*) from video_user group by is_have_child;
全部评论(0)