То, что я хочу построить, выглядит так:
- Время от времени запускайте кратковременный кластер для записи в HBase, запеченный на S3
- Запуск долго работающего кластера для той же базы данных S3, что и для реплики чтения
- Мое приложение живет в Kubernetes POD в EC2, и им нужно запросить реплику чтения HBase из Java API, что-то вроде сканирования. Не пишите здесь.
Я экспериментирую со следующим. Я написал тестовую программу и использую плагин для сборки maven для подготовки jar-файлов в папке:
val hbaseConfig = new Configuration()
hbaseConfig.clear()
hbaseConfig.set("hbase.zookeeper.quorum", "ip-10-0-xxx-xxx.ec2.internal")
dumpConfiguration(hbaseConfig)
HBaseAdmin.checkHBaseAvailable(hbaseConfig)
val connection = ConnectionFactory.createConnection(hbaseConfig)
val table = connection.getTable(TableName.valueOf("test-messages-01"))
val scan = new Scan()
scan.addColumn("msgs".getBytes(), "msg".getBytes)
val scanner = table.getScanner(scan)
println(s"scanner: $scanner")
import scala.collection.JavaConverters._
scanner.iterator().asScala.toStream.take(20).foreach(x => println(s"--> $x"))
scanner.close()
table.close()
connection.close()
Я запустил эту маленькую программу с той же машины EMR, и она работает.
Я также запустил эту маленькую программу из POD (где я, конечно, изменил группу безопасности), и она также отлично работает.
Теперь я запустил новый кластер EMR, где HBase является репликой чтения.
Я могу подключиться к машине EMR и запустить hbase shell
, затем count 'test-messages-01'
, и это также работает.
Я немного изменил программу, просто добавлю идентификатор кластера в качестве суффикса мета таблицы:
val hbaseConfig = new Configuration()
hbaseConfig.clear()
hbaseConfig.set("hbase.zookeeper.quorum", "ip-10-0-xxx-xxx.ec2.internal")
hbaseConfig.set("hbase.meta.table.suffix", "j-xxxxxxxx")
dumpConfiguration(hbaseConfig)
HBaseAdmin.checkHBaseAvailable(hbaseConfig)
val connection = ConnectionFactory.createConnection(hbaseConfig)
val table = connection.getTable(TableName.valueOf("test-messages-01"))
val scan = new Scan()
scan.addColumn("msgs".getBytes(), "msg".getBytes)
val scanner = table.getScanner(scan)
println(s"scanner: $scanner")
import scala.collection.JavaConverters._
scanner.iterator().asScala.toStream.take(20).foreach(x => println(s"--> $x"))
scanner.close()
table.close()
connection.close()
Затем я пытаюсь запустить его с главного компьютера EMR, но он больше не работает.
Из журнала я вижу, что он успешно подключен к zookeeper, а также установил соединение HBase, и сканер также создан. Но он зависает, повторяя сканер, где я получил много org.apache.hadoop.hbase.NotServingRegionException
исключений:
[main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=ip-10-0-104-68.ec2.internal:2181 sessionTimeout=90000 watcher=org.apache.hadoop.hbase.zookeeper.PendingWatcher@625732
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server ip-10-0-104-68.ec2.internal/10.0.104.68:2181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to ip-10-0-104-68.ec2.internal/10.0.104.68:2181, initiating session
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server ip-10-0-104-68.ec2.internal/10.0.104.68:2181, sessionid = 0x1000001ffb70011, negotiated timeout = 40000
[main] INFO org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation - Closing master protocol: MasterService
[main] INFO org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation - Closing zookeeper sessionid=0x1000001ffb70011
[main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x1000001ffb70011 closed
[main-EventThread] INFO org.apache.zookeeper.ClientCnxn - EventThread shut down for session: 0x1000001ffb70011
[main] INFO org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper - Process identifier=hconnection-0x52d239ba connecting to ZooKeeper ensemble=ip-10-0-104-68.ec2.internal:2181
[main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=ip-10-0-104-68.ec2.internal:2181 sessionTimeout=180000 watcher=org.apache.hadoop.hbase.zookeeper.PendingWatcher@315f43d5
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server ip-10-0-104-68.ec2.internal/10.0.104.68:2181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to ip-10-0-104-68.ec2.internal/10.0.104.68:2181, initiating session
[main-SendThread(ip-10-0-104-68.ec2.internal:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server ip-10-0-104-68.ec2.internal/10.0.104.68:2181, sessionid = 0x1000001ffb70012, negotiated timeout = 40000
scanner: org.apache.hadoop.hbase.client.ClientSimpleScanner@696f0212
[hconnection-0x52d239ba-metaLookup-shared--pool4-t1] INFO org.apache.hadoop.hbase.client.RpcRetryingCaller - Call exception, tries=10, retries=31, started=38396 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,,1 is not online on ip-10-0-122-64.ec2.internal,16020,1552648181048
at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:3086)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.getRegion(RSRpcServices.java:1275)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.newRegionScanner(RSRpcServices.java:2678)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3012)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:36613)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2380)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:297)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:277)
row 'test-messages-01,,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=ip-10-0-122-64.ec2.internal,16020,1552648181048, seqNum=0
[hconnection-0x52d239ba-metaLookup-shared--pool4-t1] INFO org.apache.hadoop.hbase.client.RpcRetryingCaller - Call exception, tries=11, retries=31, started=48452 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,,1 is not online on ip-10-0-122-64.ec2.internal,16020,1552648181048
at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:3086)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.getRegion(RSRpcServices.java:1275)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.newRegionScanner(RSRpcServices.java:2678)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3012)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:36613)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2380)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:297)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:277)
row 'test-messages-01,,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=ip-10-0-122-64.ec2.internal,16020,1552648181048, seqNum=0
Я даже пытался использовать библиотеку hbase на машине EMR /usr/lib/hbase/*
, но она все еще не работает.
Я немного растерялся и не смог найти решение по поиску.