我在设置我的spark环境以从kerberized HDFS文件位置读取时遇到问题。
目前我已经尝试做以下事情:
def ugiDoAs[T](ugi: Option[UserGroupInformation])(code: => T) = ugi match {
case None => code
case Some(u) => u.doAs(new PrivilegedExceptionAction[T] {
override def run(): T = code
})
}
val sparkConf = defaultSparkConf.setAppName("file-test").setMaster("yarn-client")
val sc = ugiDoAs(ugi) {new SparkContext(conf)}
val file = sc.textFile("path")
它在创建Spark上下文时失败,出现以下错误:
Exception in thread "main" org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
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:422)
at org.apache.hadoop.yarn.ipc.RPCUtil.instantiateException(RPCUtil.java:53)
at org.apache.hadoop.yarn.ipc.RPCUtil.unwrapAndThrowException(RPCUtil.java:104)
at org.apache.hadoop.yarn.api.impl.pb.client.ApplicationClientProtocolPBClientImpl.getClusterMetrics(ApplicationClientProtocolPBClientImpl.java:155)
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:497)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
有人有关于如何允许spark连接到路缘化HDFS位置的简单示例吗?
我知道spark需要处于Yarn模式才能使其工作,但登录方法似乎在这方面不起作用。尽管我知道User Group Information(ugi)对象是有效的,因为我已经使用它连接到同一对象和HBase中的ZK。
确认conf/spark-env.sh已配置或:
export HADOOP_CONF_DIR=/etc/hadoop/conf
这必须指向集群的客户端配置。
该错误意味着客户端试图在未经身份验证的情况下与HDFS对话,但被拒绝。通过记录UGI来确保它真正是安全的,并在启动之前执行一些基本的hadoop文件系统代码;这将使追踪变得更容易