2014-04-23 9 views
6

Tôi đang cố gắng chạy tập lệnh Spark thử nghiệm để kết nối Spark với hadoop. Các kịch bản là những sản phẩm sauVi phạm Hdfs từ Spark cung cấp lỗi TokenCache Không thể nhận hiệu trưởng Kerberos chính để sử dụng làm công cụ gia hạn

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() 

Khi tôi chạy nó với pyspark tôi nhận được

py4j.protocol.Py4JJavaError: An error occurred while calling o21.collect. : java.io.IOException: Can't get Master Kerberos principal for use as renewer at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:116) at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100) at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80) at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:187) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:251) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:140) at org.apache.spark.rdd.RDD$$anonfun$partitions$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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at org.apache.spark.rdd.MappedRDD.getPartitions(MappedRDD.scala:28) at org.apache.spark.rdd.RDD$$anonfun$partitions$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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at 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$partitions$2.apply(RDD.scala:205) at scala.Option.getOrElse(Option.scala:120) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at org.apache.spark.SparkContext.runJob(SparkContext.scala:898) at org.apache.spark.rdd.RDD.collect(RDD.scala:608) at org.apache.spark.api.java.JavaRDDLike$class.collect(JavaRDDLike.scala:243) at org.apache.spark.api.java.JavaRDD.collect(JavaRDD.scala:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379) at 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.run(Thread.java:744)

Điều này xảy ra bất chấp sự thật rằng

  • tôi đã thực hiện một kinit và một chương trình klist Tôi có các mã thông báo chính xác
  • khi tôi phát hành ./bin/hadoop fs -ls hdfs: //hadoop_node.place: 9000/errs.txt nó sho ws file
  • Cả client hadoop địa phương và tia lửa có tập tin cấu hình tương tự

Lõi-site.xml trong tia lửa/conf và thư mục hadoop/conf là sau (đã nhận nó từ một trong những các nút hadoop)

<configuration> 
    <property> 

     <name>hadoop.security.auth_to_local</name> 
     <value> 
      RULE:[1:$1](.*@place)s/@place// 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/ 
      RULE:[2:nobody] 
      DEFAULT 
     </value> 
    </property> 
    <property> 
     <name>net.topology.node.switch.mapping.impl</name> 
     <value>org.apache.hadoop.net.TableMapping</value> 
    </property> 
    <property> 
     <name>net.topology.table.file.name</name> 
     <value>/etc/hadoop/conf/topology.table.file</value> 
    </property> 
    <property> 
     <name>fs.defaultFS</name> 
     <value>hdfs://server.place:9000/</value> 
    </property> 
    <property> 
     <name>hadoop.security.authentication</name> 
     <value>kerberos</value> 
    </property> 

    <property> 
     <name>hadoop.security.authorization</name> 
     <value>true</value> 
    </property> 

    <property> 
     <name>hadoop.proxyuser.hive.hosts</name> 
     <value>*</value> 
    </property> 

    <property> 
     <name>hadoop.proxyuser.hive.groups</name> 
     <value>*</value> 
    </property> 

</configuration> 

Ai đó có thể chỉ ra những gì tôi bị thiếu?

+0

Mọi hoạt động của Spark cũng có cấu hình không? –

+0

Spark chạy ở chế độ phân phối giả để chỉ có một máy chủ/nút – ndp

+1

Bạn vẫn sẽ có một vài JVM đang chạy: ứng dụng của bạn, Spark master, Spark worker và executor. Tôi nghĩ rằng ứng dụng của bạn và người thực hiện sẽ là những người truy cập HDFS, vì vậy bạn cần phải chắc chắn rằng họ đã tải cấu hình đúng. Bạn có thể in 'Hệ thống.getProperties' trên trình kiểm tra để kiểm tra. –

Trả lời

5

Sau khi tạo cụm Hadoop của riêng tôi để hiểu rõ hơn cách hoạt động của hadoop. Tôi sửa nó rồi.

Bạn phải cung cấp Spark với tệp .keytab hợp lệ đã được tạo cho tài khoản có ít nhất quyền truy cập đọc vào cụm hadoop.

Ngoài ra, bạn phải cung cấp tia lửa với hdfs-site.xml của cụm hdfs của bạn.

Vì vậy, đối với trường hợp của tôi, tôi đã phải tạo ra một tập tin keytab mà khi bạn chạy

klist -k -e -t

vào nó bạn sẽ có được các mục như

sau

host/[email protected]

Trong trường hợp của tôi dẫn chương trình là từ đen lưu trữ và không phải là một biến. Cũng trong HDFS-site.xml của bạn, bạn phải cung cấp đường dẫn của tập tin keytab và nói rằng

host/[email protected]

sẽ là tài khoản của bạn.

Cloudera có một ghi chú khá chi tiết về cách thực hiện.

Chỉnh sửa sau khi phát một chút với các cấu hình khác nhau Tôi nghĩ điều sau cần lưu ý. Bạn phải cung cấp tia lửa với chính xác hdfs-site.xml và core-site.xml của cụm hadoop của bạn. Nếu không, nó sẽ không hoạt động

+2

Bạn có thể thêm liên kết vào Cloudera writeup không? –

+0

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_sg_kerberos_prin_keytab_deploy.html – mxm

+0

Tên thông số bạn sử dụng để kết nối fro Spark với HDFS với Kerberos –

Các vấn đề liên quan