下面是超人学院吴超老师讲的hbase的查询过程以及hive和hbase的映射1. hbase如何查询出某一条记录 假设有一条查询请求 1.1. 从zookeeper中找到region server的地址代码在执行的时候,会通过HTable建立一个到zk server的连接(通过调用ZKUtil.connect(...)方法)。 读取zk目录/hbase/meta-region-server的值,拿到的是meta表的region server地址。 meta是hbase中的一张表。 根据客户端代码中查询条件的表名称和行键名称,就可以在meta表中按照行键定位到一条记录,根据列名称info:server,找到具体的存放wlan表的特定row key的region server的地址。 客户端代码只需要连接一次zk server即可,会把所有的region对应的region server的信息缓存在客户端。 1.2. 再从region server中查找某条记录 在每个region server中都有很多的region,通过上面的操作可以定位到某个region。根据查询条件中的列族名称定位到某个HStore。 从该HStore的MemStore中查询KeyValue。如果查找到,则返回客户端找到的记录。 如果没有在MemStore中找到KeyValue,那么会从缓存(当region server启动的时候,会加载每个HFile文件中的meta、fileinfo、data index、meta index到内存中)中查找。 首先从meta里面的bloom filter判断。如果有,那么直接到磁盘中去找该HFile的data block。找到后,返回客户端找到的记录。 如果表没有启动bloom filter或者从HFile中没有找到,会从data index的ROOT-LEVEL的索引中查找。如果找到的话,会加载HFile的data block,返回客户端找到的记录。 如果在ROOT-LEVEL中没有找到,从磁盘文件加载intermediate-level和leaf-level的索引,继续查找。找到的话,加载HFile的data block。如果没有找到,返回客户端说没有找到。 1,在hive的lib中执行
hive --auxpath /usr/local/hive-0.14.0/lib/hive-hbase-handler-0.14.0.jar,/usr/local/hive-0.14.0/lib/zookeeper-3.4.5.jar -hiveconf hbase.master=192.168.128:60000
-hiveconf hbase.zookeeper.quorum=192.168.2.128,192.168.2.129,192.168.2.130 2,建立hive和hbase的映射关系 CREATE EXTERNAL TABLE hbase_table_1(key string, value string)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:allinfo") TBLPROPERTIES("hbase.table.name" = "tablename");
2.1 hbase到hive;映射成功后可以查询映射表。首先hbase要存在被映射的表
2.2 hive到hbase插入数据 1,首先在hbase中存在被插入的表, 2,如果没有建立映射关系要建立映射,方法如上 3,创建一张中间表t1 4,将数据加载到中间表 load data local inpath '/root/1.txt' overwrite into table t1; 5,将数据插入映射表中 insert overwrite table hbase_table select * from t1;
这时候数据从数据文件加载到中间表t1,映射表hbase_table作为hive的表可以从其他表的加载进来数据(t1),
hbase_table表映射加载到hbase中的表了
|