복붙노트

[HADOOP] 마루 파일을로드하고 같은 수의 hdfs 파티션을 유지

HADOOP

마루 파일을로드하고 같은 수의 hdfs 파티션을 유지

120 파티션으로 hdfs에 저장된 파켓 파일 / df가 있습니다. hdfs의 각 파티션 크기는 약 43.5M입니다.

총합 크기

hdfs dfs -du -s -h /df
5.1 G  15.3 G  /df
hdfs dfs -du -h /df
43.6 M  130.7 M  /df/pid=0
43.5 M  130.5 M  /df/pid=1
...
43.6 M  130.9 M  /df/pid=119

해당 파일을 Spark에로드하고 동일한 수의 파티션을 유지하고 싶습니다. 그러나 Spark는 파일을 60 개의 파티션으로 자동로드합니다.

df = spark.read.parquet('df')
df.rdd.getNumPartitions()
60

HDFS 설정 :

'parquet.block.size'가 설정되지 않았습니다.

sc._jsc.hadoopConfiguration().get('parquet.block.size')

아무것도 반환하지 않습니다.

'dfs.blocksize'는 128로 설정되어 있습니다.

float(sc._jsc.hadoopConfiguration().get("dfs.blocksize"))/2**20

보고

128

이 값 중 하나를 더 낮은 값으로 변경해도 hdfs에있는 동일한 수의 파티션으로 파켓 파일이로드되지 않습니다.

예를 들면 다음과 같습니다.

sc._jsc.hadoopConfiguration().setInt("parquet.block.size", 64*2**20)
sc._jsc.hadoopConfiguration().setInt("dfs.blocksize", 64*2**20)

43.5M이 128M보다 훨씬 낮다는 것을 알고 있습니다. 그러나이 응용 프로그램에서는 많은 변환을 즉시 완료하여 각 120 개의 파티션이 128M에 훨씬 가까워 질 것입니다.

로드 후 즉시 응용 프로그램에서 파티션을 다시 나누지 않아도됩니다.

Spark가 hdfs에 저장된 동일한 수의 파티션으로 쪽모이 세공 파일을로드하도록하는 방법이 있습니까?

해결법

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

    1.먼저 Spark가 데이터를 파티션으로 분할하는 방법을 확인하기 시작했습니다. 기본적으로 데이터 및 클러스터의 특성과 크기에 따라 다릅니다. 이 기사에서는 데이터 프레임이 60 개의 파티션에로드 된 이유에 대한 답변을 제공해야합니다.

    먼저 Spark가 데이터를 파티션으로 분할하는 방법을 확인하기 시작했습니다. 기본적으로 데이터 및 클러스터의 특성과 크기에 따라 다릅니다. 이 기사에서는 데이터 프레임이 60 개의 파티션에로드 된 이유에 대한 답변을 제공해야합니다.

    https://umbertogriffo.gitbooks.io/apache-spark-best-practices-and-tuning/content/sparksqlshufflepartitions_draft.html

    일반적으로 모든 최적화 (파티션 수 포함)를 처리하는 Catalyst이므로, 사용자 지정 설정에 대한 정당한 이유가 없으면 작업을 수행하도록합니다. 사용하는 변환이 넓 으면 Spark는 어쨌든 데이터를 섞습니다.

  2. from https://stackoverflow.com/questions/56602051/load-parquet-file-and-keep-same-number-hdfs-partitions by cc-by-sa and MIT license