[SCALA] 어떻게 스파크 많은 파티션으로 마루 파일을 분할하려면?
SCALA어떻게 스파크 많은 파티션으로 마루 파일을 분할하려면?
그래서 나는합니다 (SQL 물건을 사용) 스파크와 함께 읽고 있어요 단지 1 개 마루 파일을 가지고 있고 그것이 100 개 파티션 처리하고 싶습니다. 우리는 또한 (GZIP)에서 none으로 마루의 압축을 변경 시도, 100로 설정 spark.default.parallelism을 시도했습니다. (셔플이 100로 다시 분할됩니다 그 이후 분명히 일이 훨씬 더 빨리 발생하면) 우리는 스파크 작업의 첫 번째 단계를 무슨 상관없이 단 하나의 파티션을 가지고있다.
이제 (아래처럼) 몇 소식통에 따르면 마루는 내가 슈퍼 혼동하고있어 몇 가지 조언을 사랑하는 것 (심지어 GZIP을 사용하는 경우!), 그래서 분열성해야합니다.
https://www.safaribooksonline.com/library/view/hadoop-application-architectures/9781491910313/ch01.html
나는 불꽃 1.0.0를 사용하고, 그리고 그렇게 할 수 없도록 분명히 spark.sql.shuffle.partitions의 기본 값은 200입니다. 나는 무슨 일인지 이해하지 않도록 사실 모든 병렬 처리에 대한 기본값은 훨씬 더 하나보다.
해결법
-
==============================
1.당신은 작은 블록 크기로 마루 파일을 작성해야합니다. 기본값은 블록 당 128MB의이지만, 작가의 parquet.block.size 구성을 설정하여 구성 할 수 있습니다.
당신은 작은 블록 크기로 마루 파일을 작성해야합니다. 기본값은 블록 당 128MB의이지만, 작가의 parquet.block.size 구성을 설정하여 구성 할 수 있습니다.
당신이 세부 사항을 발굴하려는 경우 ParquetOutputFormat의 소스는 여기에있다.
블록 크기는 더 읽기 스레드를 가질 수 있도록 데이터의 최소 금액은 당신이 (마루는 원주 형이기 때문에, 당신은 단지 라인이나 이런 사소한 일에 의해 분할 할 수 없음) 논리적으로 읽을 수있는 마루 파일로 읽을 수있다 입력 블록보다.
-
==============================
2.어쩌면 당신의 마루 파일은 하나 개의 HDFS 블록을합니다. 많은 HDFS 블록과 부하를 가진 큰 나무 마루 파일을 만듭니다
어쩌면 당신의 마루 파일은 하나 개의 HDFS 블록을합니다. 많은 HDFS 블록과 부하를 가진 큰 나무 마루 파일을 만듭니다
val k = sc.parquetFile("the-big-table.parquet") k.partitions.length
당신은 HDFS 블록으로 파티션의 같은 수를 볼 수 있습니다. 이것은 나를 위해 좋은 일했다 (스파크 1.1.0)
-
==============================
3.당신은 당신이 마루에 쓰기 중에 분포를 제어 할 것을 언급했다. 당신은 RDDs 마루 보존 파티션 RDD의에서 마루를 만들 때. 그래서, 당신은 RDD를 작성하고 100 개 파티션을 지정하고 마루 형식 dataframe에서 그것은 FS 100 개 별도의 마루 파일을 작성 될 경우. 읽기 위해 당신은 spark.sql.shuffle.partitions 매개 변수를 지정할 수 있습니다.
당신은 당신이 마루에 쓰기 중에 분포를 제어 할 것을 언급했다. 당신은 RDDs 마루 보존 파티션 RDD의에서 마루를 만들 때. 그래서, 당신은 RDD를 작성하고 100 개 파티션을 지정하고 마루 형식 dataframe에서 그것은 FS 100 개 별도의 마루 파일을 작성 될 경우. 읽기 위해 당신은 spark.sql.shuffle.partitions 매개 변수를 지정할 수 있습니다.
-
==============================
4.그 일의 새로운 방법 (스파크 2.X는) 설정입니다
그 일의 새로운 방법 (스파크 2.X는) 설정입니다
spark.sql.files.maxPartitionBytes
출처 : https://issues.apache.org/jira/browse/SPARK-17998 (공식 문서가 정확하지 아직은 .SQL를 벗어났습니다)
내 경험에서, 하둡 설정은 더 이상 영향을주지 않습니다.
-
==============================
5.당신은 하둡 구성 (sc.hadoopConfiguration) 속성 mapreduce.input.fileinputformat.split.maxsize을 설정 SparkContext를 사용해야 달성하기 위해.
당신은 하둡 구성 (sc.hadoopConfiguration) 속성 mapreduce.input.fileinputformat.split.maxsize을 설정 SparkContext를 사용해야 달성하기 위해.
당신은 분할의 수만큼 파티션으로 얻을 수있는 것보다, hdfs.blockSize보다 낮은 값으로 속성을 설정하여.
예를 들면 : 경우 hdfs.blockSize = 134217728 (128메가바이트) 하나 개의 파일은 정확히 하나 개의 전체 블록을 포함 읽기입니다 및 mapreduce.input.fileinputformat.split.maxsize = 67,108,864 (64메가바이트)
그리고 그 분할이로 읽을 수 있습니다 두 개의 파티션이있을 것이다.
from https://stackoverflow.com/questions/27194333/how-to-split-parquet-files-into-many-partitions-in-spark by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어레이 스파크 SQL의 요소 범위를 선택 (0) | 2019.11.23 |
---|---|
[SCALA] 어떻게 여러 개의 입력과 implicits는 스칼라에서 사용할 수 있습니까? (0) | 2019.11.23 |
[SCALA] 스칼라 : 릴리스 간 바이너리 호환성 (0) | 2019.11.23 |
[SCALA] 스칼라 API와 불꽃 Dataframe에 TSV 읽기 (0) | 2019.11.23 |
[SCALA] java.util.concurrent.Future에 대한 scala.concurrent.Future 래퍼 (0) | 2019.11.22 |