2014-10-31 2 views
18

하나의 마스터와 3 명의 직원이있는 Spark 클러스터를 설정했습니다. Spark는 CentOS VM에 설치되어 있습니다. 로컬 VM에서 Spark 셸을 실행하여 마스터에 연결하고 간단한 스칼라 코드를 실행할 수있게하려고합니다. 그래서, 다음은 내 로컬 VM에서 실행하는 명령입니다.어떻게 Apache Spark 쉘을 원격으로 실행할 수 있습니까?

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

쉘은 스칼라 코드를 입력 할 수있는 지점까지 실행됩니다. 유언 집행관은 (각 근로자 당 3 명씩) 허가를 받았다고합니다. 마스터 UI를 들여다 보면 하나의 실행중인 애플리케이션 인 스파크 쉘을 볼 수 있습니다. 모든 작업자는 2/2 코어를 사용하고 응용 프로그램에 512MB (5GB 중)를 할당했습니다. 따라서 다음 스칼라 코드를 실행하려고합니다.

sc.parallelize(1 to 100).count  

불행히도 명령이 작동하지 않습니다. 쉘은 단지 끝없이 같은 경고를 출력 할 것이다 :

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 

문제에 대한 내 연구에 따라, 나는 내가 사용하고있는 마스터 URL은 웹 UI에있는 것과 동일 있음을 확인했다. 두 가지 방법으로 ping 및 ssh를 수행 할 수 있습니다 (클러스터를 로컬 VM에 적용하고 그 반대의 경우도 가능). 또한 executor-memory 매개 변수 (메모리를 증가 시키거나 감소시키는 매개 변수)를 사용하여 아무런 효과가 없습니다. 마지막으로 양쪽에서 방화벽 (iptables)을 사용하지 못하게 시도했지만 동일한 오류가 계속 발생합니다. Spark 1.0.2를 사용하고 있습니다.

TL : DR Apache 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 
... 

스파크는 클러스터보다는 내 로컬 VM에 다른 디렉토리에 설치됩니다. 작업자가 찾으려고하는 경로는 로컬 VM에있는 경로입니다. 이 경로를 지정하는 방법이 있습니까? 또는 그들이 어디에나 동일해야합니까?

당분간이 오류를 피하기 위해 디렉토리를 조정했습니다. 카운트 명령 (Master removed our application: FAILED)을 입력 할 수있게되기 전에 내 스파크 셸이 실패합니다. 모든 직원의 오류는 같습니다.

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 

의심되는 것으로, 네트워크 문제가 있습니다. 지금 무엇을 봐야합니까?

+0

다음 두 가지를 시도해주세요. 1. 마스터가 실행중인 노드에서 마스터에 연결을 시도하십시오. 2. 호스트 이름을 "모든 곳"의 IP로 대체하십시오. –

+0

원격 시스템에서 Spark 클러스터에 연결할 수 있습니다. 스파크 셸은 클러스터에서 실행되는 또 다른 Scala 프로그램입니다. –

+0

예, 가능하며 작동해야합니다. 네트워크 문제가 의심됩니다. 내 머리 꼭대기에서 잘 모르겠지만, 노동자들이 일부 포트에서 로컬 컴퓨터에 연결을 시도 할 것입니다. 증상에서 나는 그것이 효과가 없다고 생각합니다. 어쩌면 작업자 로그에서 더 많은 정보를 찾을 수 있습니다! –

답변

2

가 내 스파크 클라이언트와 스파크 클러스터에서이 문제를 해결한다.

네트워크를 확인, 클라이언트 A는 서로 클러스터 Ping 할 수 있습니다! 그런 다음 클러스터 모드

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 

둘째

을 테스트 스파크 쉘

첫 번째 클라이언트 A에 당신의 spark-env.sh에 2 개 개의 라인 설정을 추가!

+0

두 번째 추천은 실제로 이해가되지 않습니다 :'spark-shell'을' --deploy-mode cluster' 결과는'Error : Cluster deploy mode가 Spark shells에 적용되지 않습니다'라는 결과를 낳았습니다. – bluenote10

0

IDE에서 프로젝트를 작성하여 간단한 스칼라 또는 Java 프로그램을 작성하는 것이 좋습니다.

"simpleapp"라는 프로젝트를 만들고이 디렉토리 구조가 이와 같다고 가정 해 보겠습니다.

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) 

"SimpleApp.java"에 SparkConf 및 SparkContext 개체를 만듭니다.

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

다음 명령을 사용하여 JAR 파일을 만듭니다. SimpleApp.class 파일은 "target/classes"폴더에서 찾을 수 있습니다. 이 디렉토리로 이동하십시오.

jar cfve file.jar SimpleApp.class 

이 JAR 파일을 프로젝트의 대상 디렉토리에 넣습니다. 이 JAR 파일에는 작업을 Spark에 제출하는 동안 SimpleApp 클래스의 종속성이 포함되어 있습니다. 이제 스파크 디렉토리로 이동하십시오. 나는 spark-1.4.0-bin-hadoop2.6을 사용하고있다. cmd는 다음과 같습니다.

spark-1.4.0-bin-hadoop2.6> 

다음 명령을 사용하여 마스터와 작업자를 시작하십시오.

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

이렇게해도 작동하지 않으면 마스터와 슬레이브를 별도로 시작하십시오.

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

Spark Submit를 사용하여 스파크 프로그램을 제출하십시오. 제가 설명했던 구조를 가지고 있다면 클래스에서이 인수를 전달하십시오.

--class SimpleApp 

다른

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

마지막으로 당신의 스파크 프로그램을 제출합니다.

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

downvote를 원하지는 않지만, "쉘을 원격으로 실행"을 언급하지 않습니다. – bluenote10

1

이 문제는 네트워크 구성으로 인해 발생할 수 있습니다. 그것은 꽤 몇 가지 원인이있을 수있는 오류 TaskSchedulerImpl: Initial job has not accepted any resources처럼 보인다 (도 this answer 참조)

  • 실제 자원 부족
  • 마스터와 노동자 사이의
  • 깨진 통신 마스터/노동자와 드라이버 사이
  • 깨진 통신

첫 번째 가능성을 제외하는 가장 쉬운 방법은 마스터에서 직접 실행되는 Spark 셸을 사용하여 테스트를 실행하는 것입니다. 이 방법이 작동하면 클러스터 자체의 클러스터 통신은 정상이며 문제는 드라이버 호스트와의 통신으로 인해 발생합니다. 더는

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" 
    ... 

같은 항목을 포함하고 작업자가 운전자의 IP/포트에 연결을 설정할 수 있는지 여부를 테스트 작업자 로그를 조사하는 데 도움이 문제를 분석합니다. 일반 방화벽/포트 전달 문제 외에도 드라이버가 잘못된 네트워크 인터페이스에 바인딩되어있을 수 있습니다. 이 경우 다른 인터페이스에 바인딩하기 위해 Spark 셸을 시작하기 전에 드라이버에서 SPARK_LOCAL_IP을 내보낼 수 있습니다.

일부 추가 참조 : 네트워크 연결 문제에

관련 문제