Не удается подключиться к Bigtable для сканирования данных HTable из-за жестко запрограммированного управляемого =true в jar-клиенте hbase
Я работаю над пользовательской функцией загрузки для загрузки данных из Bigtable с помощью Pig на Dataproc. Я компилирую свой код Java, используя следующий список файлов JAR, которые я взял из Dataproc. Когда я запускаю следующий скрипт Pig, он терпит неудачу, когда пытается установить соединение с Bigtable.
Сообщение об ошибке:
Bigtable does not support managed connections.
Вопросы:
- Есть ли решение этой проблемы?
- Это известная проблема, и есть ли план для ее устранения или корректировки?
- Есть ли другой способ реализации мультисканирования как функции загрузки для Pig, который будет работать с Bigtable?
Подробности:
Jar файлы:
hadoop-common-2.7.3.jar
hbase-client-1.2.2.jar
hbase-common-1.2.2.jar
hbase-protocol-1.2.2.jar
hbase-server-1.2.2.jar
pig-0.16.0-core-h2.jar
Вот простой скрипт Pig, использующий мою пользовательскую функцию загрузки:
%default gte '2017-03-23T18:00Z'
%default lt '2017-03-23T18:05Z'
%default SHARD_FIRST '00'
%default SHARD_LAST '25'
%default GTE_SHARD '$gte\_$SHARD_FIRST'
%default LT_SHARD '$lt\_$SHARD_LAST'
raw = LOAD 'hbase://events_sessions'
USING com.eduboom.pig.load.HBaseMultiScanLoader('$GTE_SHARD', '$LT_SHARD', 'event:*')
AS (es_key:chararray, event_array);
DUMP raw;
Моя пользовательская функция загрузки HBaseMultiScanLoader создает список объектов Scan для выполнения нескольких сканирований на разных диапазонах данных в таблице events_sessions, определяемой временным диапазоном между gte и lt и sharded с SHARD_FIRST до SHARD_LAST.
HBaseMultiScanLoader расширяет org.apache.pig.LoadFunc, поэтому его можно использовать в сценарии Pig в качестве функции загрузки. Когда Pig запускает мой скрипт, он вызывает LoadFunc.getInputFormat(). Моя реализация getInputFormat () возвращает экземпляр моего пользовательского класса MultiScanTableInputFormat, который расширяет org.apache.hadoop.mapreduce.InputFormat. MultiScanTableInputFormat инициализирует объект org.apache.hadoop.hbase.client.HTable для инициализации соединения с таблицей.
Копаясь в исходном коде клиента hbase, я вижу, что org.apache.hadoop.hbase.client.ConnectionManager.getConnectionInternal() вызывает org.apache.hadoop.hbase.client.ConnectionManager.createConnection() с атрибутом "managed" на "правда". Вы можете видеть из дорожки стека ниже, что мой код (MultiScanTableInputFormat) пытается инициализировать объект HTable, который вызывает getConnectionInternal (), который не предоставляет опцию для установки для управляемого значения false. Спускаясь по трассировке стека, вы попадете в AbstractBigtableConnection, который не примет управляемый = истина и, следовательно, приведет к сбою соединения с Bigtable.
Вот трассировка стека, показывающая ошибку:
2017-03-24 23:06:44,890 [JobControl] ERROR com.turner.hbase.mapreduce.MultiScanTableInputFormat - java.io.IOException: java.lang.reflect.InvocationTargetException
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:240)
at org.apache.hadoop.hbase.client.ConnectionManager.createConnection(ConnectionManager.java:431)
at org.apache.hadoop.hbase.client.ConnectionManager.createConnection(ConnectionManager.java:424)
at org.apache.hadoop.hbase.client.ConnectionManager.getConnectionInternal(ConnectionManager.java:302)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:185)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:151)
at com.eduboom.hbase.mapreduce.MultiScanTableInputFormat.setConf(Unknown Source)
at com.eduboom.pig.load.HBaseMultiScanLoader.getInputFormat(Unknown Source)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:264)
at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:301)
at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:318)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:196)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
at org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob.submit(ControlledJob.java:335)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.pig.backend.hadoop23.PigJobControl.submit(PigJobControl.java:128)
at org.apache.pig.backend.hadoop23.PigJobControl.run(PigJobControl.java:194)
at java.lang.Thread.run(Thread.java:745)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher$1.run(MapReduceLauncher.java:276)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238)
... 26 more
Caused by: java.lang.IllegalArgumentException: Bigtable does not support managed connections.
at org.apache.hadoop.hbase.client.AbstractBigtableConnection.<init>(AbstractBigtableConnection.java:123)
at com.google.cloud.bigtable.hbase1_2.BigtableConnection.<init>(BigtableConnection.java:55)
... 31 more
1 ответ
Первоначальная проблема была вызвана использованием устаревших и устаревших клиентских jar-файлов и классов hbase.
Я обновил свой код для использования новейших jar-клиентов hbase, предоставленных Google, и первоначальная проблема была исправлена.
Я все еще застреваю с некоторой проблемой ZK, которую я все еще не выяснил, но это разговор для другого вопроса.
На это ответили!
Я столкнулся с тем же сообщением об ошибке:
Bigtable не поддерживает управляемые соединения.
Однако, согласно моим исследованиям, основная причина заключается в том, что класс HTable
не может быть построено явно. После того, как изменили способ построения HTable
от connection.getTable
, Проблема решена.