バルクロードでHBaseにインポートしたデータをHiveの外部テーブルでselectするときに遭遇した現象に関するメモ
タイトル長い。。。
ちゃんと整理できてないですがとりあえずメモっときます。
環境はHBase 0.94.4, Hive 0.10.0です。
LoadIncrementalHFilesを使ってHBaseにデータをインポートしようとしたら下記のようなエラーが出ました。
Caused by: java.lang.IllegalStateException: The value of the hbase.metrics.showTableName conf option has not been specified in SchemaMetrics at org.apache.hadoop.hbase.regionserver.metrics.SchemaMetrics.getEffectiveTableName(SchemaMetrics.java:607) at org.apache.hadoop.hbase.regionserver.metrics.SchemaMetrics.getInstance(SchemaMetrics.java:333) at org.apache.hadoop.hbase.regionserver.metrics.SchemaConfigured.getSchemaMetrics(SchemaConfigured.java:185) at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.close(HFileReaderV2.java:441) at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.close(HFileReaderV2.java:419) at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.groupOrSplit(LoadIncrementalHFiles.java:410) at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$2.call(LoadIncrementalHFiles.java:323) at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$2.call(LoadIncrementalHFiles.java:321) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
https://issues.apache.org/jira/browse/HBASE-4802
を踏んだっぽいですが、とりあえず下記を呼んでおけばエラーは無くなりました。
SchemaMetrics.configureGlobally(conf);
そんなこんなでインポートしたデータをHiveから下記のように参照します。
CREATE EXTERNAL TABLE testtable(key string, a string, b int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:a,cf1:b") TBLPROPERTIES ("hbase.table.name" = "testtable");
データの型がstringの場合は良いのですがintなどstring型以外の場合はselectしてもNULLが返ってきます。
https://issues.apache.org/jira/browse/HIVE-1634
が該当のJIRAのようですが、
string型以外のものは以下のように#bをつけるようです。
cf1:b#b
いじょ。