버전 : 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, "클래스 경로 항목 "-> 클래스 경로) }