在Kerberos environement失败时Spark连接到Hbase [英] Spark connection to Hbase in Kerberos environement failing
问题描述
我正在使用
- Spark 1.6.0(
spark-1.2.0-cdh5.10.2 code $)
- cloudera vm(
spark-1.2.0-cdh5.10.2
)
- Hbase(1.2.0来自cloudera)
- cloudera vm(
- Scala 2.10
- 启用Kerberos
我正在运行的步骤是:
-
kinit
-
spark-shell - 主线 - 执行程序内存256m --jars /opt/cloudera/parcels/CDH/lib/hbase/lib/hbase-spark-1.2.0-cdh5 .10.2.jar
<3>
```
import org.apache.hadoop.hbase.spark.HBaseContext
import org.apache.spark.SparkContext
import org.apache.hadoop.hbase。{CellUtil,TableName,HBaseConfiguration}
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.client.Get
导入org.apache.hadoop.hbase.client.Result
导入org.apach e.spark.SparkConf
import org.apache.hadoop.hbase.client.Scan
$ b val tableName =web-table
val scan = new Scan()
scan.setCaching(100)
//sc.setLogLevel(\"DEBUG)
val conf = HBaseConfiguration .create()
conf.set(hbase.zookeeper.quorum,quickstart.cloudera);
conf.set(hbase.client.retries.number,Integer.toString(1));
conf.set(zookeeper.session.timeout,Integer.toString(60000));
conf.set(zookeeper.recovery.retry,Integer.toString(20))
val hbaseContext = new HBaseContext(sc,conf)$ b $ val getRdd = hbaseContext。 hbaseRDD(TableName.valueOf(tableName),scan)
getRdd.take(1)
$`b
上面的代码失败,出现以下堆栈跟踪
```
org.apache.hadoop.hbase.client.RetriesExhaustedException:尝试失败后失败= 1,异常:
Wed Feb 07 20:30:27 PST 2018,RpcRetryingCaller {globalStartTime = 1518064227140,pause = 100,retries = 1},java.io.IOException:在管道org.apache.hadoop处破坏
。 hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:147)
at org.apache.hadoop.hbase.client.ResultBoundedCompletionService $ QueueingFuture.run(ResultBoundedCompletionService.java:80)
at java.util。 concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
在java.util.concurrent.ThreadPool Executor $ Worker.run(ThreadPoolExecutor.java:615)
在java.lang.Thread.run(Thread.java:745)
导致:java.io.IOException:损坏的管道
在sun.nio.ch.FileDispatcherImpl.write0(本地方法)
在sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
在sun.nio.ch.IOUtil.writeFromNativeBuffer( IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487)
at org.apache.hadoop.net.SocketOutputStream $ Writer.performIO(SocketOutputStream.java:63)
at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:142)
at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:159)
at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:117)
at java.io .BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
在java.io.BufferedOutputStream.flush(BufferedOutputStream.java:14 0)
at java.io.DataOutputStream.flush(DataOutputStream.java:123)
at org.apache.hadoop.hbase.ipc.IPCUtil.write(IPCUtil.java:278)
在org.apache.hadoop.hbase.ipc.IPCUtil.write(IPCUtil.java:266)
在org.apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.writeRequest(RpcClientImpl.java:921)
at org.apache.hadoop.hbase.ipc.RpcClientImpl $ Connection.tracedWriteRequest(RpcClientImpl.java:874)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1243)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:227)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient $ BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java: 336)
在org.apache.hadoop.hbase.protobuf.generated.ClientProtos $ ClientService $ BlockingStub.scan(ClientProtos.java:34094)
位于org.apache.hadoop.hbase.client.ScannerCallable。 openScanner(ScannerCallable.java:400)
在org.apache.h adoop.hbase.client.ScannerCallable.call(ScannerCallable.java:204)
位于org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:65)
位于org.apache。在org处理
。 apache.hadoop.hbase.client.ScannerCallableWithReplicas $ RetryingRPC.call(ScannerCallableWithReplicas.java:355)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126)
```
如果有人看到这个错误,这个解决方案请让我知道。
另外值得一提的是
- 尝试为spark应用程序提供--principal和--keytab
- 我在HBase配置中提供了更多配置,例如jaas。
在d ebug模式,但是这个错误看起来真的很可疑,这让我怀疑动物园管理员是否通过火花与Hbase进行交互是错误的。
18/02/07 20 :51:05信息zookeeper.ClientCnxn:打开套接字连接到服务器localhost / 127.0.0.1:2181。不会尝试使用SASL进行身份验证(未知错误)
以下是重现相同问题的另一种方法
kinit ...
```
spark-submit --master yarn --executor -memory 256m --class org.apache.hadoop.hbase.spark.example.hbasecontext.HBaseDistributedScanExample / opt / cloudera / parcels / CDH / lib / hbase / lib / hbase -spark-1.2.0-cdh5.10.2.jar web-table
```
在失败
$ b $之前,代码在扫描区域阶段停留了一段时间b断管错误
一些更多zookeeper相关的消息。这可能对那里的专家很有意思。
```
18/02/07 20:51:05信息zookeeper.ZooKeeper:客户端环境:user.dir = / home / cloudera / Desktop
18/02/07 20:51:05信息zookeeper.ZooKeeper:启动客户端connection,connectString = localhost:2181 sessionTimeout = 90000 watcher = hconnection-0x1c053d8a0x0,quorum = localhost:2181,baseZNode = / hbase
18/02/07 20:51:05 INFO zookeeper.ClientCnxn:打开套接字连接到服务器本地主机/ 127.0.0.1:2181。不会尝试使用SASL进行身份验证(未知错误)
18/02/07 20:51:05 INFO zookeeper.ClientCnxn:建立套接字连接,启动会话,客户端:/127.0.0.1:49815,服务器:localhost / 127.0.0.1:2181
18/02/07 20:51:05信息zookeeper.ClientCnxn:会话建立在服务器localhost / 127.0.0.1上完成:2181,sessionid = 0x161735f4d4700d4,协商超时= 60000
18 / 02/07 20:51:05 INFO util.RegionSizeCalculator:计算表web-table的区域大小。
18/02/07 20:51:53 INFO client.ConnectionManager $ HConnectionImplementation:关闭zookeeper sessionid = 0x161735f4d4700d4
18/02/07 20:51:53 INFO zookeeper.ZooKeeper:Session:0x161735f4d4700d4 closed
18/02/07 20:51:53 INFO zookeeper.ClientCnxn:EventThread关闭
```
解决方案这个问题很简单,因为Cloudera VM
启用kerberos
(b
所以解决方案(简单的方法)是
Spark-> Configruation - > HBase服务 - > HBase(默认值为None)
这一步最后添加了一堆配置,可以通过Yarn激发对HBase的讨论。 b $ b
I am using
- Spark 1.6.0(
spark-1.2.0-cdh5.10.2
) - cloudera vm (
spark-1.2.0-cdh5.10.2
) - Hbase (1.2.0 from cloudera)
- Scala 2.10
- Kerberos enabled
The steps I am running are:
kinit
(So that my user will be in place)
2.
spark-shell --master yarn --executor-memory 256m --jars /opt/cloudera/parcels/CDH/lib/hbase/lib/hbase-spark-1.2.0-cdh5.10.2.jar
3.
```
import org.apache.hadoop.hbase.spark.HBaseContext import org.apache.spark.SparkContext import org.apache.hadoop.hbase.{ CellUtil, TableName, HBaseConfiguration } import org.apache.hadoop.hbase.util.Bytes import org.apache.hadoop.hbase.client.Get import org.apache.hadoop.hbase.client.Result import org.apache.spark.SparkConf import org.apache.hadoop.hbase.client.Scan val tableName = "web-table" val scan = new Scan() scan.setCaching(100) //sc.setLogLevel("DEBUG") val conf = HBaseConfiguration.create() conf.set("hbase.zookeeper.quorum", "quickstart.cloudera"); conf.set("hbase.client.retries.number", Integer.toString(1)); conf.set("zookeeper.session.timeout", Integer.toString(60000)); conf.set("zookeeper.recovery.retry", Integer.toString(20)) val hbaseContext = new HBaseContext(sc, conf) val getRdd = hbaseContext.hbaseRDD(TableName.valueOf(tableName), scan) getRdd.take(1)
```
The above code fails with the following stack trace
```
org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=1, exceptions: Wed Feb 07 20:30:27 PST 2018, RpcRetryingCaller{globalStartTime=1518064227140, pause=100, retries=1}, java.io.IOException: Broken pipe at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:147) at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:80) 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: java.io.IOException: Broken pipe at sun.nio.ch.FileDispatcherImpl.write0(Native Method) at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) at sun.nio.ch.IOUtil.write(IOUtil.java:65) at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487) at org.apache.hadoop.net.SocketOutputStream$Writer.performIO(SocketOutputStream.java:63) at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:142) at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:159) at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:117) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) at java.io.DataOutputStream.flush(DataOutputStream.java:123) at org.apache.hadoop.hbase.ipc.IPCUtil.write(IPCUtil.java:278) at org.apache.hadoop.hbase.ipc.IPCUtil.write(IPCUtil.java:266) at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl.java:921) at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl.java:874) at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1243) at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:227) at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:336) at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:34094) at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:400) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:204) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:65) at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:381) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:355) at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126)
```
If anyone has seen this error and knows the solution please let me know.
Also worth mentioning are
- I have tried providing --principal and --keytab to the spark application
- I have provided more configs like jaas in HBase configs.
In debug mode however this error looks really suspicious which makes me wonder if zookeeper interaction to Hbase via spark is something wrong.
18/02/07 20:51:05 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
Here is another way to reproduce the same issue
kinit...
```
spark-submit --master yarn --executor-memory 256m --class org.apache.hadoop.hbase.spark.example.hbasecontext.HBaseDistributedScanExample /opt/cloudera/parcels/CDH/lib/hbase/lib/hbase-spark-1.2.0-cdh5.10.2.jar web-table
```
The code gets stuck at the scan region phase for some time before failing with
broken pipe error
Some more zookeeper related messages. Which may be interesting to experts out there.
```
18/02/07 20:51:05 INFO zookeeper.ZooKeeper: Client environment:user.dir=/home/cloudera/Desktop 18/02/07 20:51:05 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=90000 watcher=hconnection-0x1c053d8a0x0, quorum=localhost:2181, baseZNode=/hbase 18/02/07 20:51:05 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 18/02/07 20:51:05 INFO zookeeper.ClientCnxn: Socket connection established, initiating session, client: /127.0.0.1:49815, server: localhost/127.0.0.1:2181 18/02/07 20:51:05 INFO zookeeper.ClientCnxn: Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x161735f4d4700d4, negotiated timeout = 60000 18/02/07 20:51:05 INFO util.RegionSizeCalculator: Calculating region sizes for table "web-table". 18/02/07 20:51:53 INFO client.ConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x161735f4d4700d4 18/02/07 20:51:53 INFO zookeeper.ZooKeeper: Session: 0x161735f4d4700d4 closed 18/02/07 20:51:53 INFO zookeeper.ClientCnxn: EventThread shut down
```
解决方案This problem is simply because Cloudera VM
enable kerberos
does not go all the way to make the system ready.So the solution(easy way) is to
Spark-> Configruation -> HBase Service -> HBase(Default is None)
This step ends up adding bunch of configuration that lets spark talk to HBase via Yarn.
这篇关于在Kerberos environement失败时Spark连接到Hbase的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- 尝试为spark应用程序提供--principal和--keytab