1

다음 스칼라 코드를 사용하여 S3의 텍스트 파일을 만들고 AWS EMR의 Apache Spark를 사용합니다.EMR의 스파크를 사용하여 S3의 파일에 작성

def createS3OutputFile() { 
    val conf = new SparkConf().setAppName("Spark Pi") 
    val spark = new SparkContext(conf) 
    // use s3n ! 
    val outputFileUri = s"s3n://$s3Bucket/emr-output/test-3.txt" 
    val arr = Array("hello", "World", "!") 
    val rdd = spark.parallelize(arr) 
    rdd.saveAsTextFile(outputFileUri) 
    spark.stop() 
    } 

def main(args: Array[String]): Unit = { 
    createS3OutputFile() 
    } 

나는 fat JAR을 생성하여 S3에 업로드합니다. I 클러스터 마스터에 다음 SSH와 함께 코드 실행

spark-submit \ 
    --deploy-mode cluster \ 
    --class "$class_name" \ 
    "s3://$s3_bucket/$app_s3_key" 

나는 S3 콘솔에서이 메시지가 표시되는 대신 파일의 폴더가 있습니다.

enter image description here

각 폴더 (예를 들어, 테스트 용 3.txt) 블록 파일의 긴 목록을 포함한다. 아래 사진 :

enter image description here

어떻게 출력 내 스파크 작업의 출력으로 S3에 대한 간단한 텍스트 파일을합니까? 이 일을

답변

4

시도 :

rdd.coalesce(1, shuffle = true).saveAsTextFile(...)

나의 이해는 shuffle = true 인수가 출력 하나의 텍스트 파일을 것이다 있도록이 병렬로 발생하는 원인이 있지만, 대용량 데이터 파일과 조심해야 할 것입니다.

Here은이 문제에 대한 자세한 내용입니다.

+0

내가 스칼라 극장과 스파크에 새로운 해요 확인합니다. 스파크 작업의 결과를 얻는 "표준"방법은 무엇입니까? 내가 그랬던 것처럼 파일에 쓰고 있습니까? 원시 Java 함수를 사용하여 파일을 작성합니까? – BlackSheep

+0

@BlackSheep 정말 당장의 작업에 달려 있습니다. 공식적인 방법은 없습니다. 파일을 생성 할 때 각 RDD 파티션은 사용자가 지시 한 작업을 수행하므로이 경우 각 RDD 파티션은 파일을 만들고 자신의 파일에 쓰게됩니다. – TheM00s3

+0

이것은 여전히 ​​폴더 구조를 생성하지만 하나의 자식 'part-00000' 만 있습니다. – Tim

-1

스파크는 분산 컴퓨팅입니다. 코드가 여러 노드에서 실행 중임을 의미합니다.

saveAsTextFile() 메서드는 파일 이름이 아닌 file path을 허용합니다.

부품 파일 수를 줄이려면 coalesce() 또는 repartition을 사용할 수 있습니다. 하지만 여전히 파일 경로 아래에 생성됩니다.

또는 Hadoop File SystemFileUtil 클래스를 사용하여 파일 이름을 변경하거나 여러 부품 파일을 단일 부품 파일로 병합 할 수 있습니다.

스토어 RDD는 또한

rdd.saveAsTextFile("s3n://bucket/path/") 

S3 this

+0

작업 출력이 S3로 파일로 저장되는 예제를 줄 수 있습니까? 가장 간단한 출력 - 개수 (#)를 선택할 수 있습니다. 어떻게 저것을 EMR에 산출물로 저장합니까? – BlackSheep

+0

@BlackSheep : rdd를 s3으로 저장하는 내 대답이 업데이트되었습니다. – Shankar

+1

'saveAsTextFile'은 글자 그대로 질문에 언급 된대로했습니다. 그게 내 문제를 어떻게 해결하니? – BlackSheep