Результат запроса снимка Hive HBase не может быть вставлен в новую таблицу - PullRequest
0 голосов
/ 26 марта 2019

мы используем 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)

Кто-нибудь может мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...