2014-10-31 15 views
18

Tôi có thiết lập cụm Spark với một chủ và 3 công nhân. Tôi cũng đã cài đặt Spark trên máy ảo CentOS. Tôi đang cố gắng để chạy một vỏ Spark từ máy ảo địa phương của tôi mà sẽ kết nối với chủ, và cho phép tôi thực thi mã Scala đơn giản. Vì vậy, đây là lệnh tôi chạy trên máy ảo cục bộ của mình:Làm cách nào tôi có thể chạy vỏ Apache Spark từ xa?

bin/spark-shell --master spark://spark01:7077 

Shell chạy đến điểm tôi có thể nhập mã Scala. Nó nói rằng các nhà điều hành đã được cấp (x3 - một cho mỗi công nhân). Nếu tôi nhìn vào giao diện người dùng của Chủ nhân, tôi có thể thấy một ứng dụng đang chạy, Vỏ tia lửa. Tất cả các công nhân là ALIVE, có 2/2 lõi được sử dụng, và đã phân bổ 512 MB (trong số 5 GB) cho ứng dụng. Vì vậy, tôi cố gắng thực thi mã Scala sau:

sc.parallelize(1 to 100).count  

Thật không may, lệnh này không hoạt động. Vỏ sẽ chỉ in các cảnh báo tương tự không ngừng:

INFO SparkContext: Starting job: count at <console>:13 
INFO DAGScheduler: Got job 0 (count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Final stage: Stage 0(count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Parents of final stage: List() 
INFO DAGScheduler: Missing parents: List() 
INFO DAGScheduler: Submitting Stage 0 (Parallel CollectionRDD[0] at parallelize at <console>:13), which has no missing parents 
INFO DAGScheduler: Submitting 2 missing tasts from Stage 0 (ParallelCollectionRDD[0] at parallelize at <console>:13) 
INFO TaskSchedulerImpl: Adding task set 0.0 with 2 tasks 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 

Tiếp theo nghiên cứu của tôi về vấn đề này, tôi đã khẳng định rằng URL chủ Tôi đang sử dụng là giống hệt với một trên giao diện web. Tôi có thể ping và ssh cả hai cách (cluster để VM địa phương, và ngược lại). Hơn nữa, tôi đã chơi với tham số bộ nhớ thực thi (cả việc tăng và giảm bộ nhớ) để không có kết quả. Cuối cùng, tôi đã thử vô hiệu hóa tường lửa (iptables) trên cả hai mặt, nhưng tôi vẫn gặp lỗi tương tự. Tôi đang sử dụng Spark 1.0.2.

TL; DR Có thể chạy một Spark vỏ Apache từ xa (và vốn đã nộp đơn từ xa)? Nếu vậy, tôi đang thiếu gì?

EDIT: Tôi đã xem xét các bản ghi nhân viên và thấy rằng những người lao động có khó khăn khi tìm Spark:

ERROR org.apache.spark.deploy.worker.ExecutorRunner: Error running executor 
java.io.IOException: Cannot run program "/usr/bin/spark-1.0.2/bin/compute-classpath.sh" (in directory "."): error=2, No such file or directory 
... 

Spark được cài đặt trong một thư mục khác nhau trên VM địa phương của tôi hơn trên cluster. Đường dẫn mà nhân viên đang cố gắng tìm là đường dẫn trên máy ảo cục bộ của tôi. Có cách nào để tôi chỉ định đường dẫn này không? Hay chúng phải giống nhau ở mọi nơi?

Hiện tại, tôi đã điều chỉnh các thư mục của mình để vượt qua lỗi này. Bây giờ, Spark Shell của tôi không thành công trước khi tôi có cơ hội nhập lệnh đếm (Master removed our application: FAILED). Tất cả công nhân có cùng lỗi:

ERROR akka.remote.EndpointWriter: AssociationError [akka.tcp://[email protected]:7078] -> [akka.tcp://[email protected]:53633]: 
Error [Association failed with [akka.tcp://[email protected]:53633]] 
[akka.remote.EndpointAssociationException: Association failed with [akka.tcp://[email protected]:53633] 
Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$annon2: Connection refused: spark02/192.168.64.2:53633 

Khi bị nghi ngờ, tôi đang gặp sự cố mạng. Tôi nên xem gì bây giờ?

+0

Bạn có thể thử hai thứ sau đây không. 1. Hãy thử kết nối với bản gốc từ nút mà chủ đang chạy. 2. Thử thay thế tên máy chủ bằng IP "ở khắp mọi nơi". –

+0

Bạn có thể kết nối với cụm Spark từ máy từ xa. Spark shell chỉ là một chương trình Scala khác đang chạy trên cluster. –

+0

Có, điều này là có thể và sẽ hoạt động. Tôi nghi ngờ các vấn đề về mạng. Tôi không chắc chắn trên đỉnh đầu của tôi, nhưng tôi nghĩ rằng các công nhân sẽ cố gắng kết nối với máy địa phương của bạn trên một số cổng. Từ những triệu chứng tôi đoán là không hiệu quả. Có thể bạn có thể tìm thêm thông tin trong nhật ký công nhân! –

Trả lời

2

Tôi giải quyết vấn đề này tại khách hàng và cụm tia lửa của tôi。

Kiểm tra mạng, ứng dụng khách của bạn Có thể ping cụm lẫn nhau! Sau đó, thêm hai dòng config trong spark-env.sh của bạn trên client A.

đầu tiên

export SPARK_MASTER_IP=172.100.102.156 
export SPARK_JAR=/usr/spark-1.1.0-bin-hadoop2.4/lib/spark-assembly-1.1.0-hadoop2.4.0.jar 

Second

thử nghiệm của bạn vỏ spark với chế độ cụm!

+0

Đề xuất thứ hai không thực sự có ý nghĩa: Chạy' spark-shell' với ' Các kết quả --deploy-mode cluster' trong 'Lỗi: Chế độ triển khai cụm không áp dụng cho các shell Spark' và câu hỏi cụ thể là địa chỉ chạy một remote shell. – bluenote10

0

Tôi khuyên bạn nên viết một chương trình Scala hoặc Java đơn giản bằng cách tạo một dự án trong IDE của bạn.

Giả sử bạn đã tạo một dự án có tên là "simpleapp" có cấu trúc thư mục như thế này.

simpleapp 
- src/main/java 
    - org.apache.spark.examples 
    -SimpleApp.java 
- lib 
    - dependent.jars (you can put all dependent jars inside lib directory) 
- target 
    - simpleapp.jar (after compiling your source) 

Tạo các đối tượng SparkConf và SparkContext trong "SimpleApp.java" của bạn.

SparkConf conf = new SparkConf().setAppName(appName).setMaster("local[2]"); 
JavaSparkContext sc = new JavaSparkContext(conf); 

Tạo tệp JAR bằng lệnh sau. Bạn có thể tìm thấy tệp SimpleApp.class trong thư mục "target/classes". cd vào thư mục này.

jar cfve file.jar SimpleApp.class 

Đặt tệp JAR này vào dự án của bạn trong thư mục đích. Tệp JAR này chứa sự phụ thuộc của lớp SimpleApp của bạn trong khi gửi công việc của bạn tới Spark. Bây giờ hãy vào thư mục spark của bạn. Tôi đang sử dụng spark-1.4.0-bin-hadoop2.6. Cmd của bạn trông như thế này

spark-1.4.0-bin-hadoop2.6> 

Khởi động chủ và công nhân bằng các lệnh sau.

spark-1.4.0-bin-hadoop2.6> ./sbin/start-all.sh 

Nếu điều này không hoạt động, hãy bắt đầu chính và xóa riêng.

spark-1.4.0-bin-hadoop2.6> ./sbin/start-master.sh 
spark-1.4.0-bin-hadoop2.6> ./sbin/start-slaves.sh 

Gửi chương trình tia lửa của bạn bằng Spark Gửi. Nếu bạn có cấu trúc như tôi đã giải thích thì hãy vượt qua đối số này trong lớp.

--class org.apache.spark.examples.SimpleApp 

khác

--class SimpleApp 

Cuối cùng nộp chương trình tia lửa của bạn.

spark-1.4.0-bin-hadoop2.6>./bin/spark-submit --class SimpleApp --master local[2] /home/hadoopnod/Spark_Java/target/file.jar 
+3

Không muốn downvote, nhưng điều này không giải quyết "chạy shell từ xa". – bluenote10

1

Sự cố này có thể do cấu hình mạng gây ra. Dường như lỗi TaskSchedulerImpl: Initial job has not accepted any resources có thể có một vài nguyên nhân (xem thêm this answer):

  • thiếu nguồn lực thực tế
  • thông tin liên lạc bị hỏng giữa chủ và công nhân
  • thông tin liên lạc bị hỏng giữa thầy/nhân viên và tài xế

Cách dễ nhất để loại trừ khả năng đầu tiên là chạy thử nghiệm với vỏ Spark chạy trực tiếp trên bản gốc. Nếu điều này làm việc, các thông tin liên lạc cụm trong cụm chính nó là tốt và vấn đề là do giao tiếp với máy chủ điều khiển. Để phân tích sâu hơn vấn đề, bạn nên xem nhật ký công nhân, chứa các mục nhập như

16/08/14 09:21:52 INFO ExecutorRunner: Launch command: 
    "/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" 
    ... 
    "--driver-url" "spark://[email protected]:37752" 
    ... 

và kiểm tra xem nhân viên có thể thiết lập kết nối với IP/cổng của người lái hay không. Ngoài các vấn đề về tường lửa/cổng chuyển tiếp chung, có thể trình điều khiển bị ràng buộc với giao diện mạng sai. Trong trường hợp này, bạn có thể xuất SPARK_LOCAL_IP trên trình điều khiển trước khi bắt đầu trình bao Spark để liên kết với một giao diện khác.

Một số tài liệu tham khảo thêm:

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