我正在尝试运行测试Spark脚本,以便将Spark连接到hadoop.该脚本如下
from pyspark import SparkContext sc = SparkContext("local", "Simple App") file = sc.textFile("hdfs://hadoop_node.place:9000/errs.txt") errors = file.filter(lambda line: "ERROR" in line) errors.count()
当我用pyspark运行时,我得到了
py4j.protocol.Py4JJavaError:调用o21.collect时发生错误.:java.io.IOException:无法将orber.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal (TokenCache.java:116)中的主Kerberos主体用作续订器,位于org.apache.hadoop.mapreduce.security.位于org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:187)的org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80)中的TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100) org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:251)org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:140)at org.apache.spark.rdd.RDD $$ anonfun $ partition $ 2.apply(RDD.scala:207)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:205)at scala.Option.getOrElse(Option.scala:120) )org.apache.spark.rdd.RDD.partitions(RDD.scala:205)atg.apache.spark.rdd.MappedRDD.getPartitions(MappedRDD.scala:28)at org.apache.spark.rdd.RDD $ $ anonfun $在org上划分$ 2.apply(RDD.scala:207).位于org.apache.spark.rdd.RDD.partitions的scala.Option.getOrElse(Option.scala:120)中的apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:205)(RDD. scala:205)org.apache.spark.api.python.PythonRDD.getPartitions(PythonRDD.scala:46)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:207) at org.apache.spark.rdd.RDD $$ anonfun $在org.apache.spark.rdd.RDD.partitions的scala.Option.getOrElse(Option.scala:120)处分区$ 2.apply(RDD.scala:205) (RDD.scala:205)org.apache.spark.SparkContext.runJob(SparkContext.scala:898)位于org.apache.spark的org.apache.spark.rdd.RDD.collect(RDD.scala:608). api.java.JavaRDDLike $ class.collect(JavaRDDLike.scala:243)atg.apache.spark.api.java.JavaRDD.collect(JavaRDD.scala:27)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke (Method.java:606)py4j.reflection.MetodInvoke.invoke(MethodInvoker.java:231)py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)py4j.Gateway.invoke(Gateway.java:259) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)at py4j.commands.CallCommand.execute(CallCommand.java:79)at py4j.GatewayConnection.run(GatewayConnection.java:207)at java.lang.Thread.运行(Thread.java:744)
尽管事实如此,但仍然会发生
我做了一个kinit和一个klist显示我有正确的令牌
当我发出./bin/hadoop fs -ls hdfs://hadoop_node.place:9000/errs.txt它显示文件
本地hadoop客户端和spark都具有相同的配置文件
spark/conf和hadoop/conf文件夹中的core-site.xml如下所示(从其中一个hadoop节点获取)
hadoop.security.auth_to_local RULE:[1:$1](.*@place)s/@place// RULE:[2:$1/$2@$0](.*/node1.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node2.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node3.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node4.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node5.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node6.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:$1/$2@$0](.*/node7.place@place)s/^([a-zA-Z]*).*/$1/ RULE:[2:nobody] DEFAULT net.topology.node.switch.mapping.impl org.apache.hadoop.net.TableMapping net.topology.table.file.name /etc/hadoop/conf/topology.table.file fs.defaultFS hdfs://server.place:9000/ hadoop.security.authentication kerberos hadoop.security.authorization true hadoop.proxyuser.hive.hosts * hadoop.proxyuser.hive.groups *
有人能指出我错过了什么吗?
在创建我自己的hadoop集群之后,为了更好地理解hadoop如何工作.我修好了它.
您必须为Spark提供一个有效的.keytab文件,该文件是为至少具有hadoop集群读取权限的帐户生成的.
此外,您必须使用hdfs集群的hdfs-site.xml提供spark.
所以对于我的情况,我必须创建一个keytab文件,当你运行时
klist -k -e -t
在它上面你会得到如下条目
host/fully.qualified.domain.name@REALM.COM
在我的情况下,主机是文字主机而不是变量.同样在你的hdfs-site.xml中,你必须提供keytab文件的路径并说出来
host/_HOST@REALM.COM
将是您的帐户.
Cloudera有一个关于如何做的非常详细的文章.
使用不同的配置播放后编辑我认为应该注意以下内容.您必须使用hadoop集群的确切hdfs-site.xml和core-site.xml提供spark.否则它不会工作