Spark записывает раздел в hdf, имеющий файлы одинакового размера - PullRequest
2 голосов
/ 17 октября 2019

У меня есть большая таблица в формате hdf, в которой миллионы строк в день. Моя цель - записывать файлы одинакового размера, заставляя записывать максимальное количество строк в одном файле. Это то, что я делаю для достижения этой цели (искры 2.3.1). Например,

 spark.sql("select * from dataToWrite where yyyy_mm_dd = '2019-10-01'")
      .write
      .option("maxRecordsPerFile", 1000000)
      .format("orc")
      .partitionBy("yyyy_mm_dd")
      .mode(SaveMode.Overwrite)
      .save(s"hdfs://nameservice1/user/hive/warehouse/aliparoti.db/test_data'")

После этого я проверяю hdfs и получаю

 -rw-rw-rw-   3 aliparoti hive     33.8 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00097-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    596.0 M 2019-10-17 15:23 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00098-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    594.2 M 2019-10-17 15:29 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00098-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    589.4 M 2019-10-17 15:37 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00098-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c002.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    101.6 M 2019-10-17 15:38 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00098-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c003.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    592.1 M 2019-10-17 15:16 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00099-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     33.8 M 2019-10-17 15:17 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00099-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    595.8 M 2019-10-17 15:19 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00100-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     33.6 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00100-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    595.2 M 2019-10-17 15:19 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00101-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     32.7 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00101-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    595.1 M 2019-10-17 15:19 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00102-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     33.9 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00102-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    594.5 M 2019-10-17 15:19 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00103-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     34.6 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00103-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    592.0 M 2019-10-17 15:23 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00104-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    592.2 M 2019-10-17 15:28 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00104-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     67.6 M 2019-10-17 15:29 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00104-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c002.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    595.4 M 2019-10-17 15:24 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00105-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     33.1 M 2019-10-17 15:24 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00105-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc
 -rw-rw-rw-   3 aliparoti hive    597.2 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00106-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c000.snappy.orc
 -rw-rw-rw-   3 aliparoti hive     35.0 M 2019-10-17 15:20 /user/hive/warehouse/aliparoti.db/test_data/yyyy_mm_dd=2019-10-01/part-00106-9fb1ec99-c7c9-4d41-a183-ca58d18bbe8f.c001.snappy.orc

Каким-то образом я получаю эти странные размеры файлов. Знаете ли вы, что я могу сделать, чтобы получить куски одинакового размера? Может мне нужен пользовательский разделитель?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Неэффективно, поскольку только одно ядро ​​будет выполнять работу, но должно дать ожидаемый результат

spark.sql("select * from dataToWrite where yyyy_mm_dd = '2019-10-01'")
    .repartition("yyyy_mm_dd")
    .write
    .option("maxRecordsPerFile", 1000000)
    .format("orc")
    .partitionBy("yyyy_mm_dd")
    .mode(SaveMode.Overwrite)
    .save(s"hdfs://nameservice1/user/hive/warehouse/aliparoti.db/test_data'")
0 голосов
/ 17 октября 2019

Причина такого поведения:

Предположим, у вас есть 100,05,000 строк данных, равномерно распределенных между 10 разделами. Таким образом, каждый раздел теперь будет содержать 10,00500 строк. Учитывая, что каждое ядро ​​исполнителя будет работать над каждым разделом, при выполнении задачи записи каждый исполнитель записывает 1 файл с 10 000 000 строк, а другой - 500 строк. Таким образом, в идеале будет 10 одинаковых по размеру файлов и 10 одинаковых по размеру файлов. Это то, что происходит в вашем случае.

Решение:

Вам нужно выполнить count, а затем, исходя из этого значения, вам нужно прийти к числу, так что строк в каждом файле будетгде-то около 10 000 000. Используйте это число в методе repartition, и в конце вы найдете файлы одинакового размера.

Надеюсь, это поможет!

...