мы используем CDH 5.16.1, hbase-1.2.0, улей 1.1.0
Цель - увеличить скорость сохранения некоторых данных из базы hb в улей.
По умолчанию я использовал HbaseStorageHandler, но он очень медленный, потому что он использовал полное сканирование по запросу сервера региона hbase. Поэтому я попытался сделать запрос об обходе сервера региона и получить прямой доступ к данным из файла подчеркивания.
Это было как минимум в 6 раз быстрее, чем раньше, когда я запрашивал hbase со снимком. Но я не могу записать данные в таблицу улья, все поля были нулевыми, кроме ключа строки.
drop table if exists test;
create table test as select * from default.hbase_user_data_snapshot1_table;
Однако, если я не использую снимок, HbaseStorageHandler может успешно загрузить данные в новую таблицу улья.
Вот шаги, которые я предпринял:
Сначала я создал таблицу Hbase:
create 'user_data_table','personal_data','professional_data';
Затем я вставил несколько записей в таблицу как
put 'user_data_table','user1','personal_data:Location','IL'
put 'user_data_table','user1','personal_data:FName','Deb'
put 'user_data_table','user1','personal_data:LName','D'
put 'user_data_table','user1','professional_data:dept','IT'
put 'user_data_table','user1','professional_data:salary','2000'
put 'user_data_table','user2','personal_data:FName','CH'
put 'user_data_table','user2','personal_data:LName','AK'
put 'user_data_table','user2','professional_data:dept','IT'
put 'user_data_table','user2','professional_data:salary','80000'
Затем я указываю snapshot.name, чтобы запрос Hive Hbase обходил сервер Hbase и напрямую обращался к базовым файлам.
set hive.hbase.snapshot.name=snapshot-day-1;
set hive.hbase.snapshot.restoredir=/tmp;
CREATE EXTERNAL TABLE if not exists default.hbase_user_data_snapshot1_table1(key string, Location string,FName string,LName string, dept string, salary string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,personal_data:Location,personal_data:FName,personal_data:LName,professional_data:dept,professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "user_data_table");
Наконец, когда я пытаюсь загрузить результат запроса в таблицу улья, как показано ниже, результат странный, все значения полей были NULL, кроме ключа строки.
#show hbase table data
hive> select * from default.hbase_user_data_snapshot1_table;
OK
user1 IL Deb D IT 2000
user2 NULL CH AK IT 80000
Time taken: 0.199 seconds, Fetched: 2 row(s)
#load the query result into new table
hive> create table test as select * from default.hbase_user_data_snapshot1_table;
.... OK
#but all the value of fields are NULL ,expect the row key.
hive> select * from test;
OK
user1 NULL NULL NULL NULL
user2 NULL NULL NULL NULL
И я также пытаюсь загрузить данные без параметра "set hive.hbase.snapshot.name", теперь он вставляет результат запроса в таблицу, как я и ожидал. (но, таким образом, это было очень медленно, потому что HBaseStorageHandler запрашивает hbase с полным сканированием с помощью API-интерфейса сервера hbase)
CREATE EXTERNAL TABLE if not exists default.hbase_user_data_snapshot1_table1(key string, Location string,FName string,LName string, dept string,salary string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,personal_data:Location,personal_data:FName,personal_data:LName,professional_data:dept,professional_data:salary")
TBLPROPERTIES ("hbase.table.name" = "user_data_table");
create table test1 as select * from default.hbase_user_data_snapshot1_table;
select * from test1;
OK
user1 IL Deb D IT 2000
user2 NULL CH AK IT 80000
the snapshot feature link:
я также пытался указать hive.hbase.snapshot.name в TBLPROPERTIES, но
запрос куста запрашивает API сервера региона Hbase вместо прямого доступа к файлу подчеркивания.
Я посмотрел исходный код HbaseStorageHandler, он решает, использовать ли HbaseSnapshot или нет, исходя из свойства hive conf (HiveConf.ConfVars.HIVE_HBASE_SNAPSHOT_NAME)
Таким образом, если вы укажете hive.hbase.snapshot.name в любом другом месте, улей не сможет запросить hbase со снимком. И я также изменил все разрешения hdfs dir на 777, но он все еще не мог вставлять данные в таблицу кустов, за исключением того, что я не использовал снимок.
Было странно, что я проверил журнал DEBUG, но в нем нет ошибок.
Я брожу, может быть, это ошибка этой функции.
(ссылка на функцию снимка:
https://issues.apache.org/jira/browse/HBASE-8369)
Кто-нибудь может мне помочь?