복붙노트

[HADOOP] 원격 Spark 마스터에 연결 - Java / Scala

HADOOP

원격 Spark 마스터에 연결 - Java / Scala

AWS에서 3 노드 (1 마스터, 2 작업자) Apache Spark 클러스터를 만들었습니다. 마스터에서 클러스터에 작업을 제출할 수 있지만 원격으로 작동시킬 수는 없습니다.

/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "/usr/local/spark/README.md" // Should be some file on your system
    val conf = new SparkConf().setAppName("Simple Application").setMaster("spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077")
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    sc.stop()
  }
}

나는 주인에게서 볼 수있다 :

Spark Master at spark://ip-171-13-22-125.ec2.internal:7077
URL: spark://ip-171-13-22-125.ec2.internal:7077
REST URL: spark://ip-171-13-22-125.ec2.internal:6066 (cluster mode)

로컬 컴퓨터에서 SimpleApp.scala를 실행하면 Spark Master에 연결할 수 없습니다.

2017-02-04 19:59:44,074 INFO  [appclient-register-master-threadpool-0] client.StandaloneAppClient$ClientEndpoint (Logging.scala:54)  [] - Connecting to master spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077...
2017-02-04 19:59:44,166 WARN  [appclient-register-master-threadpool-0] client.StandaloneAppClient$ClientEndpoint (Logging.scala:87)  [] - Failed to connect to spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077
org.apache.spark.SparkException: Exception thrown in awaitResult
    at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:77) ~[spark-core_2.10-2.0.2.jar:2.0.2]
    at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:75) ~[spark-core_2.10-2.0.2.jar:2.0.2]
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) ~[scala-library-2.10.0.jar:?]
    at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59) ~[spark-core_2.10-2.0.2.jar:2.0.2]

그러나 마스터를 로컬로 설정하면 작동 할 것이므로 로컬로 실행되므로 마스터가됩니다. 그러나 클라이언트를이 원격 마스터에 연결하려고합니다. 어떻게해야합니까? 아파치 설정보기 파일. 공용 DNS와 포트에 telnet으로 연결할 수도 있고, 각각의 EC2 인스턴스에 대해 공용 DNS와 호스트 이름을 사용하여 / etc / hosts를 구성 할 수도 있습니다. 이 원격 마스터에게 작업을 제출하고 싶습니다. 무엇이 없습니까?

해결법

  1. ==============================

    1.호스트 호스트 이름 / IP를 바인딩하려면 spark 설치 conf 디렉토리 (spark-2.0.2-bin-hadoop2.7 / conf)로 이동하여 아래 명령을 사용하여 spark-env.sh 파일을 만듭니다.

    호스트 호스트 이름 / IP를 바인딩하려면 spark 설치 conf 디렉토리 (spark-2.0.2-bin-hadoop2.7 / conf)로 이동하여 아래 명령을 사용하여 spark-env.sh 파일을 만듭니다.

    cp spark-env.sh.template spark-env.sh
    

    vi 편집기에서 spark-env.sh 파일을 열고 마스터의 호스트 이름 / IP와 함께 아래 행을 추가하십시오.

    SPARK_MASTER_HOST=ec2-54-245-111-320.compute-1.amazonaws.com
    

    stop-all.sh 및 start-all.sh를 사용하여 Spark를 중지하고 시작하십시오. 이제 이것을 사용하여 원격 마스터를 연결하는 데 사용할 수 있습니다.

    val spark = SparkSession.builder()
      .appName("SparkSample")
      .master("spark://ec2-54-245-111-320.compute-1.amazonaws.com:7077")
      .getOrCreate()
    

    환경 변수 설정에 대한 자세한 내용은 http://spark.apache.org/docs/latest/spark-standalone.html#cluster-launch-scripts를 참조하십시오.

  2. ==============================

    2.원격 클러스터에서 로컬 코드를 시작하는 데 다른 문제가 발생했습니다. 작업이 제출되고 자원이 올바르게 할당되지만 내 로컬 시스템의 드라이버 프로세스에서 클러스터가 허용되지 않는다고 주장합니다.

    원격 클러스터에서 로컬 코드를 시작하는 데 다른 문제가 발생했습니다. 작업이 제출되고 자원이 올바르게 할당되지만 내 로컬 시스템의 드라이버 프로세스에서 클러스터가 허용되지 않는다고 주장합니다.

    원격 컴퓨터의 로그에서, 로컬 네트워크에서 driver-url로 작업을 수락하고 있음을 발견했습니다.

    그래서 내 문제는 드라이버 프로세스를 해결하는 잘못된 호스트 이름과 관련이 있습니다.

  3. from https://stackoverflow.com/questions/42048475/connecting-to-a-remote-spark-master-java-scala by cc-by-sa and MIT license