Phoenix создает исключение для индекса

Когда я хочу создать индекс для большой таблицы hbase с более чем сто миллионов строк в командной строке sqlline, я получил исключение после несколько минут. Я не знаю, как решить эту проблему. Моя среда:

  • hbase(main):001:0> version
    1.0.0-cdh5.4.2, rUnknown, Вт, 19 мая, 17:07:29 PDT 2015
  • Phoenix
    Подключено к: Phoenix (версия 4.6)
    Драйвер: PhoenixEmbeddedDriver (версия 4.6)
    Состояние автоматической фиксации: true

И информация об исключении выглядит так:

15/12/11 14:20:08 WARN client.ScannerCallable: Ignore, probably already closed
org.apache.hadoop.hbase.UnknownScannerException: org.apache.hadoop.hbase.UnknownScannerException: Name: 37, already closed?
at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:2092)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:31443)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2035)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
at java.lang.Thread.run(Thread.java:745)
at sun.reflect.GeneratedConstructorAccessor13.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106)
at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:95)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRemoteException(ProtobufUtil.java:313)
at org.apache.hadoop.hbase.client.ScannerCallable.close(ScannerCallable.java:329)
at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:184)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:136)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:56)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:288)
at org.apache.hadoop.hbase.client.ClientScanner.close(ClientScanner.java:507)
at org.apache.phoenix.iterate.ScanningResultIterator.close(ScanningResultIterator.java:49)
at org.apache.phoenix.iterate.TableResultIterator.close(TableResultIterator.java:95)
at org.apache.phoenix.jdbc.PhoenixResultSet.close(PhoenixResultSet.java:162)
at org.apache.phoenix.compile.UpsertCompiler.upsertSelect(UpsertCompiler.java:199)
at org.apache.phoenix.compile.UpsertCompiler.access$000(UpsertCompiler.java:114)
at org.apache.phoenix.compile.UpsertCompiler$UpsertingParallelIteratorFactory.mutate(UpsertCompiler.java:229)
at org.apache.phoenix.compile.MutatingParallelIteratorFactory.newIterator(MutatingParallelIteratorFactory.java:62)
at org.apache.phoenix.iterate.ParallelIterators$1.call(ParallelIterators.java:109)
at org.apache.phoenix.iterate.ParallelIterators$1.call(ParallelIterators.java:100)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at org.apache.phoenix.job.JobManager$InstrumentedJobFutureTask.run(JobManager.java:183)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.UnknownScannerException): org.apache.hadoop.hbase.UnknownScannerException: Name: 37, already closed?
at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:2092)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:31443)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2035)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
at java.lang.Thread.run(Thread.java:745)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1199)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:216)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:300)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:31889)
at org.apache.hadoop.hbase.client.ScannerCallable.close(ScannerCallable.java:327)
... 20 more

person CrazyPig    schedule 11.12.2015    source источник
comment
Вы создаете индекс удаленно или в кластере. По моему опыту, когда вы создаете индексы удаленно (или за vpn), это занимает гораздо больше времени, чем когда вы запускаете команду на кластере   -  person Afshin Moazami    schedule 11.12.2015
comment
Я создаю индекс в кластере. Когда я создаю индекс для таблицы примерно с 1000 строками, он работает хорошо. Но я встречаю исключение выше, когда таблица больше. Встречались ли вы с этой проблемой раньше?   -  person CrazyPig    schedule 12.12.2015
comment
Не совсем, я предлагаю также опубликовать ваш вопрос в списке адресов электронной почты phoenix. Вы можете получить некоторые ответы.   -  person Afshin Moazami    schedule 13.12.2015


Ответы (2)


Эта ошибка возникает из-за истечения времени ожидания сканера HBase. Установите для параметра hbase.client.scanner.timeout.period в hbase-site.xml достаточно большое значение и перезапустите кластер.

Однако лучше использовать асинхронные индексы при работе с большими таблицами, содержащими миллионы строк.

person Nithin Vommi    schedule 20.08.2016

Хорошо, мне помог официальный сайт phoenix:

https://phoenix.apache.org/secondary_indexing.html

для введения раздела «Наполнение индекса» мы можем использовать асинхронное создание индекса, включив ключевое слово ASYNC в оператор DDL создания индекса, когда исходная таблица большая.

пример :

CREATE INDEX async_index ON my_schema.my_table (v) ASYNC

Затем мы можем использовать инструмент mapreduce «IndexTool», чтобы обновить нашу индексную таблицу для синхронизации с исходной таблицей, а затем автоматически установить индексную таблицу в активное состояние после успешного завершения задания mapreduce.

пример :

${HBASE_HOME}/bin/hbase org.apache.phoenix.mapreduce.index.IndexTool
  --schema MY_SCHEMA --data-table MY_TABLE --index-table ASYNC_IDX
  --output-path ASYNC_IDX_HFILES

Таким образом можно избежать возникновения исключения выше.

person CrazyPig    schedule 08.05.2016