Делает ли dataframe.repartition (x) выполнение быстрее - PullRequest
0 голосов
/ 04 марта 2020

У меня есть скрипт Spark, который читает данные из amazon S3, а затем пишет в другом формате паркетного использования.

Вот как выглядит код:

File = "LocationInFirstBucket.csv.gz"
df_ods = spark.read.csv(File, header=True, sep=";")

df_ods.repartition(25).write.format("parquet").mode("OverWrite").save("AnotherLocationInS3")

Мой вопрос: как аргумент перераспределения (здесь 25) влияет на время выполнения? Должен ли я увеличить его, чтобы скрипт работал быстрее?

Второй вопрос: было бы лучше, если бы я кешировал свою df до последней строки?

Спасибо

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

В типичных настройках ни перераспределение, ни кеш не помогут вам в этом конкретном случае c. Поскольку вы считываете данные из неразделимого формата:

File = "LocationInFirstBucket.csv.gz"
df_ods = spark.read.csv(File, header=True, sep=";")

df_ods будет иметь только один раздел.

В таком случае перераспределение будет иметь смысл, если вы выполнил любую фактическую обработку этих данных.

Однако, если вы просто выполняете запись в распределенную файловую систему, перераспределение просто удвоит стоимость - вы должны сначала отправить данные на другие узлы (что включает сериализацию, десериализацию, передачу по сети, запись на диск), а затем продолжайте запись в распределенную файловую систему.

Конечно, существуют крайние случаи, когда это имеет смысл. Если сеть, соединяющая ваш кластер, намного быстрее, чем сеть, соединяющая ваш кластер с узлами S3, эффективная задержка может быть немного ниже.

Что касается кэширования, то здесь вообще нет смысла кэшировать. Кэширование набора данных стоит дорого и имеет смысл, только если сохраненные данные используются повторно.

0 голосов
/ 04 марта 2020

Ответ 1: - Повторение 25 или более или менее зависит от того, сколько у вас данных и нет. исполнителей вы предоставили. Если ваш код Spark запущен в кластере с более чем одним исполнителем, и он не перераспределен, то перераспределение быстро приведет к параллельной записи ваших данных.

Ответ 2: - Нет необходимости кэшировать df перед последней строкой, потому что вы используете только одно действие в вашем коде. Если вы выполняете несколько действий с вашим DF и не хотите, чтобы он пересчитывался как число действий, вы кешируете его.

0 голосов
/ 04 марта 2020

Дело в том, что Spark может распараллелить запись в определенную точку, поскольку один файл не может быть записан несколькими исполнителями одновременно.

Перераспределение помогает вам в этом распараллеливании, потому что оно будет писать 25 разных файлы (по одному на каждый раздел). Если вы увеличите количество разделов, вы увеличите количество записанных файлов, что ускорит выполнение. Это связано с ценой, поскольку время чтения будет увеличиваться в зависимости от количества файлов, которые нужно прочитать.

Ограничение - это количество исполнителей, с которыми вы выполняете свою работу, например, если вы работаете с 25 исполнителями, то установка перераспределения в 26 не поможет вам, потому что для записи 26-го раздела один из предыдущих 25 должен быть закончен.

Что касается другого вопроса, я не думаю, что .cache () поможет вам, потому что Spark ленив, может быть, эта статья может помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...