spark.files에 의해 수신 스파크 작업 종속성의 파일 소스 코드 분석

버전 : spak2.3

관련 출처 : org.apache.spark.SparkContext

 

작업에 불꽃을 생성, 그들은 종종 의존성의 수를 지정, 우리는 일반적으로 스파크 제출 스크립트에 지정된 --files / 경로 /로 / 파일을 사용하여 구현 될 수있다.

그러나 회사의 제품 아키텍처는 Livy의 스파크 작업에 의해 조정 리비 (Livy)가 실제로 스파크 제출의 패키지 달성, 최종 분석, 그래서 어떻게 여기 스파크에 종속성을 지정하는 것입니다. 내가 명령 줄 --files을 지정할 수 없기 때문에 어떻게 프로그래밍, 그 지정? 각 노드의 작업 방법이 파일이 할 구하는 시간을 실행?

매개 전사가 분석 스파크 제출 , 스파크 실제로 제출 파라미터 "spark.files"에 의해 수신 --files를 그 sparkConf 코드에 의해 파라미터를 설정하는 것이 가능하다.

예를 들면 :

컨퍼런스 = SparkConf 새로운 새로운 SparkConf (); 
conf.set ( "spark.files", "/ 경로 /로 / 파일" );
 // 파일이 HDFS에있는 경우, conf.set에 의해 ( "spark.files" "HDFS : / 경로 /로는 / 파일") 을 지정 만 IP 포트를 필요로하지 않는 HDFS에 스키마를 추가해야합니다

 

공식 웹 사이트 스파크 설명의 매개 변수에 대한을 :

파일의 목록을 쉼표로 구분 spark.files 각 집행의 작업 디렉토리에 위치합니다. globs와이 허용됩니다.

 

구체적 방법에 지정된 파일의 소스 코드를 읽는 사용자 SparkContext.scala를 따라 다음은 (종속성 마찬가지로 단지 패키지 지정 --jars)

데프 항아리 서열 [문자열] = _jars 
DEF 파일 서열 [문자열] = _files 
... 

_jars = Utils.getUserJars (_conf) 
_files .. = _conf.getOption ( "spark.files")지도 (_ 분할 ( ", " )).지도 (_. 필터 (_. 비어 있지 않은)) 
  .toSeq.flatten 

... 

// 생성자를 통해 주어진 각 JAR 추가 
하는 경우 (항아리! = null이 ) { 
  jars.foreach (addJar) 
} 

경우 (파일! = ) { 
  files.foreach (addFile) 
}

addFile는 다음을 달성 :

/ ** 
* 다운로드 한을 가진이 스파크에 대한 추가 파일이 작업마다 ON 노드 BE. 
* 
*되지 않습니다에 의해 IT는 A 파일 실행이 추가되는 경우, 사용 가능한 동안 소호에서 다음 taskset가 시작할 때까지. 
* 
* @Param 경로 중 하나는 로컬 파일이 될 수 있습니다 , HDFS의 파일 (하둡 지원 또는 기타 
* 파일 시스템), 또는은 HTTP, HTTPS 또는의 FTP URI. 스파크 채용 정보에 액세스 할 수있는 파일에서 
*가 자신의 위치를 찾기 다운로드``SparkFiles.get (파일 이름)을 사용합니다. 
* @ PARAM 순환이 사실을 경우, path``의 디렉토리를 부여 할 수 있습니다. 평가이 페이지 현재 디렉토리가된다 
* 하둡 지원되는 파일 시스템 만 지원됩니다. 
* 1. 각 노드에 파일을 다운로드 
하면 즉시 파일을 추가하는 경우에만에, * (2) 효과의 구현의 시작 부분에 다음 taskset
* 3. 파일 위치는 HDFS의 하둡 지원되는 파일 시스템, HTTP, HTTPS 또는 FTP URI 캔에 로컬 파일 또는 다른 파일이 될 수 있습니다. 에서 스파크 작업으로 
이 파일 SparkFiles.get의 * (파일 이름)에 액세스 할 수 
재귀 적으로 파일을 얻고 싶은 경우에,이 디렉토리를 부여 할 수 * 4. 그러나이 방법 하둡 지원하는 파일 시스템에만 유효합니다. 
* / 
는 def addFile (경로 : 문자열, 재귀이 : 부울) : 단위 = { 
발 URI = 새로운 새로운 경로 (경로) .toUri 
발 schemeCorrectedPath = uri.getScheme 일치 {
     // . 경로가 null의 스키마를 지정하지 않으면 
     // 명령 행에 지정된 시간 --files - 로컬 --files에 해당 파일 /home/kong/log4j.properties을 : /home/kong/log4j.properties 
  사례  널 (null) | "로컬"=> 새로운 새로운 파일 (경로) .getCanonicalFile .toURI.toString
   케이스_ => 경로 
} 

발 hadoopPath =경로 (schemeCorrectedPath) 
발 방식 = 새로운 URI (schemeCorrectedPath) .getScheme
 경우 (! 배열 ( "HTTP", "HTTPS", "FTP" ) .contains (계획)) { 
  발 FS = hadoopPath.getFileSystem (hadoopConfiguration) 
  발 ISDIR = fs.getFileStatus (hadoopPath) .isDirectory
   경우 (! isLocal && 계획 == "파일"&& ISDIR) {
     던져  새로운 SparkException (+ "를 실행하지 않을 경우 addFile 지역 디렉토리를 지원하지 않습니다"들 
      "로컬 모드를." ) 
  } 
  경우 ( ! 재귀 &&ISDIR) {
     던져  새로운SparkException (들 "추가 파일 $ hadoopPath이 디렉토리와 재귀가 아닌"+ 
      "에 돌았 다." ) 
  } 
} 다른 {
   // SPARK-17650 :이 종속성의 목록에 추가하기 전에 유효한 URL인지 확인 
  의 Utils. validateURL (URI) 
} 

발 키 = 경우 (! isLocal && 계획 == "파일" ) { 
  env.rpcEnv.fileServer.addFile ( 파일 (uri.getPath)) 
} 다른 { 
  schemeCorrectedPath 
} 
발 타임 스탬프 = System.currentTimeMillis는
 경우 ( addedFiles.putIfAbsent (키, 타임 스탬프) .isEmpty) {
  logInfo (들 "타임 스탬프 $ 타임 스탬프와 $ 키에서 추가 된 파일 $ 경로" )
   // 드라이버에서 실행되는 폐쇄는 여전히 사용할 수 있도록 파일을 로컬로 가져 오기
   // 파일에 액세스 할 수 SparkFiles API를. 
  Utils.fetchFile (uri.toString, 새로운 파일 (SparkFiles.getRootDirectory ())의 conf, 
    env.securityManager, hadoopConfiguration, 타임 스탬프, useCache = 거짓 ) 
  postEnvironmentUpdate () 
} 
}

 

마지막 addJar 및 addFile 방법에서라고 postEnvironmentUpdate의 방법뿐만 아니라 SparkContext 초기화 과정에서
다음과 같이도 postEnvironmentUpdate라고 마지막으로, 코드는 다음과 같습니다

  / ** 사후 환경 업데이트 작업 스케줄러 이벤트는 일단 준비가 * / 
  개인 DEF postEnvironmentUpdate () {
     IF (TaskScheduler! = ) { 
      발 schedulingMode = getSchedulingMode.toString 
      발 addedJarPaths = addedJars.keys.toSeq 
      발 addedFilePaths = addedFiles.keys .toSeq는
         // SparkEnv의 메소드를 호출하는 environmentDetails 상세한 정보 환경 스파크 특성, 시스템 등록, 클래스 경로 및 기타 환경 정보 JVM 파라미터. 
      environmentDetails = 브로 SparkEnv.environmentDetails (conf의, schedulingMode, addedJarPaths, 
        addedFilePaths) 
        //SparkListenerEnvironmentUpdate 이벤트가 발생하고, 이벤트 버스로 전달 
      브로 environmentUpdate = SparkListenerEnvironmentUpdate (environmentDetails) 
      listenerBus.post (environmentUpdate) 
    } 
  }

 

environmentDetails의 방법 :

  / ** 
   * JVM 정보, 스파크 속성, 시스템 속성의 맵 표현을 반환하고, 
   * 클래스 경로. 지도 키 카테고리를 정의하고, 맵 값은 대응하는 표현 
   KV 쌍의 시퀀스로서 * 속성. 이 SparkListenerEnvironmentUpdate에 주로 사용된다. 
   * / 
  개인 [불꽃] 
  데프 environmentDetails ( 
      conf의 : SparkConf, 
      schedulingMode : 문자열, 
      addedJars 서열 [문자열], 
      addedFiles 서열 [문자열]) : 맵 [문자열, 서열 [(문자열, 문자열)이]] = { 

    수입 속성. _ 
    발 jvmInformation = 서열 ( 
      ( "자바 버전", "$ javaVersion ($ javaVendor)"S), 
      ( "자바 홈" , JAVAHOME), 
      ( "스칼라 버전" , versionString가) 
    ) .sorted 

    // 스파크 속성을
     // 이 SparkUI에 의해 사용이 설정되어 있는지 어떤지를 스케줄링 모드 () 포함 
    발 schedulerMode = 경우를 (! conf.contains ( "spark.scheduler.mode" )) { 
        서열 (( "spark.scheduler.mode" , schedulingMode)) 
      } 다른 { 
        Seq.empty [(문자열, 문자열)] 
      } 
    브로 sparkProperties = (+ conf.getAll + schedulerMode는) .sorted //
      

    자바 클래스 경로없는 시스템 특성 
    브로 systemProperties = Utils.getSystemProperties.toSeq 
    브로 otherProperties = {systemProperties.filter 케이스 (K, _) => 
      K ! = "java.class.path를"&&! k.startsWith ( "스파크." ) 
    } .sorted 

    // 모든 추가 항아리와 파일을 포함하여 클래스 경로 
    발 classPathEntries = javaClassPath 
      (File.pathSeparator) .split 
      .filterNot (_. IsEmpty 함수) 
      .MAP ((_, "시스템 클래스 경로를" )) 
    발 addedJarsAndFiles = (addedJars + + addedFiles) .MAP ((_, "사용자가 추가" )) 
    발 클래스 경로= (addedJarsAndFiles ++ classPathEntries는) .sorted 

    지도 [문자열, 서열 [(문자열, 문자열)] (
       > - "JVM 정보" jvmInformation,
       "스파크 속성"-> sparkProperties,
       "시스템 등록 정보"-> otherProperties,
       "클래스 경로 항목 "-> 클래스 경로) 
  }

추천

출처www.cnblogs.com/dtmobile-ksw/p/11556901.html