2012-10-17 33 views
7

Câu hỏi này không đề cập đến việc phân phối các lọ trong toàn bộ cụm để người lao động sử dụng chúng.Các vấn đề Hadoop HADOOP_CLASSPATH

Nó đề cập đến việc chỉ định một số thư viện bổ sung trên máy khách. Để cụ thể hơn: Tôi đang cố gắng để chạy lệnh sau để truy xuất nội dung của một SequenceFile:

/path/to/hadoop/script fs -text /path/in/HDFS/to/my/file 

Nó ném cho tôi lỗi này: text: java.io.IOException: WritableName can't load class: util.io.DoubleArrayWritable

Tôi có một lớp có thể ghi tên DoubleArrayWritable. Trong thực tế, trên một máy tính khác tất cả mọi thứ hoạt động tốt.

Tôi đã cố gắng đặt HADOOP_CLASSPATH để bao gồm lọ chứa lớp đó nhưng không có kết quả. Trên thực tế, khi chạy:

/path/to/hadoop/script classpath 

Kết quả không chứa bình mà tôi đã thêm vào HADOOP_CLASSPATH.

Câu hỏi đặt ra là: làm thế nào để bạn xác định thư viện thêm khi chạy Hadoop (theo nghĩa thêm các thư viện khác hơn so với những người mà kịch bản hadoop bao gồm tự động trong classpath)

Một số biết thêm mà có thể giúp:

  • tôi không thể thay đổi kịch bản hadoop.sh (hay bất kỳ kịch bản liên quan)
  • tôi không thể sao chép thư viện của tôi để thư mục/lib dưới thư mục cài đặt hadoop
  • Trong hadoop-env.sh mà là ru n từ hadoop.sh có dòng này: export HADOOP_CLASSPATH=$HADOOP_HOME/lib mà có lẽ giải thích tại sao vi sai HADOOP_CLASSPATH của tôi bị bỏ qua.

Trả lời

13

Nếu bạn được phép thiết lập HADOOP_CLASSPATH sau đó

export HADOOP_CLASSPATH=/path/to/jar/myjar.jar:$HADOOP_CLASSPATH; \ 
    hadoop fs -text /path/in/HDFS/to/my/file 

sẽ thực hiện công việc. Vì trong trường hợp của bạn biến này được ghi đè trong hadoop-env.sh do đó, hãy xem xét sử dụng tùy chọn -libjars thay vì:

hadoop fs -libjars /path/to/jar/myjar.jar -text /path/in/HDFS/to/my/file 

Ngoài ra gọi FsShell bằng tay:

java -cp $HADOOP_HOME/lib/*:/path/to/jar/myjar.jar:$CLASSPATH \ 
org.apache.hadoop.fs.FsShell -conf $HADOOP_HOME/conf/core-site.xml \ 
-text /path/in/HDFS/to/my/file 
+0

có nhưng kịch bản hadoop thực hiện điều này: xuất khẩu HADOOP_CLASSPATH = $ HADOOP_HOME/lib. Nó viết lại HADOOP_CLASSPATH của tôi – Razvan

+0

@Razvan xem câu trả lời cập nhật của tôi –

+0

như tôi đã nói, tôi không muốn đặt đường dẫn lớp "phân tán". Tôi chỉ muốn đặt classpath trên máy khách – Razvan

0

Cố gắng thêm file jar của bạn trong biến CLASSPATH mặc định và cũng gắn thêm HADOOP_CLASSPATH vào nó. Sau đó, thực hiện lệnh của bạn.

export CLASSPATH=/your/jar/file/myjar.jar:$CLASSPATH:$HADOOP_CLASSPATH /path/to/hadoop/script fs -text /path/in/HDFS/to/my/file

+3

đường dẫn lớp mặc định var bị bỏ qua bởi hadoop – Razvan