Impala如何加载HBase数据?本文将为大家进行详细介绍Impala加载HBase数据的步骤。
第一步:HBase创建表(或选择已有表)
HBase shell命令行执行命令:
create 'impala_hbase_test_table', {NAME => 'f', VERSION => 3, COMPRESSION => 'SNAPPY'}如图所示:
第二步:HBase表存入数据
利用Java API往HBase写入数据,示例代码如下:
int j = 0; for (int i = 0; i < 10000; i++) { Random random = new Random(); Hashtable<String, String> pColumns = new Hashtable<String, String>(); pColumns.put("dn", "dn" + random.nextInt(100)); pColumns.put("fn", "fn" + random.nextInt(100)); try { HBaseUtil.postBasic("impala_hbase_test_table", this.getName() + j++, "f", pColumns, null); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } }其中HBaseUtil的postBasic()方法为HBase Java API入库操作,写入的表为impala_hbase_test_table,rowkey为线程名加递增数,列簇为f,写入的列为dn、fn,值分别为列名加随机数。
第三步:Hive创建Database,并使用
在Hive Shell命令行,执行Database创建及使用命令,如下图所示:
第四步:将HBase数据加载到Hive
在Hive Shell命令行执行如下命令:
CREATE EXTERNAL TABLE impala_hbase( rk string, un tinyint, dn string, fn string) ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, f:un, f:dn, f:fn") TBLPROPERTIES("hbase.table.name" = "impala_hbase_test_table");如下图所示:
其中,在WITH SERDEPROPERTIES选项中指定Hive外部表字段到HBase列的映射,其中“:key”对应于HBase中的rowkey,其余的就是列簇f中的列名。最后在TBLPROPERTIES中指定了HBase中要进行映射的表名。
第五步:Impala与Hive进行元数据同步
在Impala Shell命令行,执行操作INVALIDATE METADATA;
如下图所示:
第六步:Impala切换到与Hive相同的DataBase,进行数据验证
相关命令如下图所示:
1、Impala切换DataBase
2、Impala验证数据
3、Hive验证数据
最终,10000条数据在Hive与Impala中均能被查询到,证明Impala加载HBase数据成功!
但是,这里有个问题,我们发现,即便是仅有1万条数据,Impala的count也比Hive的count耗时小的多,前者为1.28s,后者为81.055s,那么是不是意味着Impala性能远远好于Hive呢?后续我会通过实际测试来探究这个疑问。