Дилемма о искровых перегородках - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над проектом, в котором мне нужно читать файлы S3 (каждый размером около 3 МБ в сжатом виде), используя boto3. У меня есть небольшой скрипт pyspark, который запускается каждый час, чтобы обработать файл и сгенерировать 2 типа выходных данных, которые записываются обратно в S3. Сценарий pyspark использует библиотеку xmltodict python для чтения некоторых данных stati c в объект словаря, необходимый для обработки файла. У меня небольшой кластер Amazon EMR v5.28, работающий с 1 Master и 1 Core. Это может быть чрезмерно, но сейчас я не беспокоюсь.

Вопросы: 1. Откуда я знаю, «ЕСЛИ» я должен разделить данные? Я прочитал статьи о том, сколько разделов создать, и т. Д. c, но не смог найти ничего по IF и WHEN. Какие критерии определяют разделение - количество строк, столбцов, тип данных, действия, выполняемые в сценарии и т. Д. c в файле исходных данных? Я читаю исходный файл в RDD и преобразовываю его в DF и выполняю различные операции, добавляя столбцы, группируя данные, считая данные и т. Д. c. Как искра управляет разделением за кулисами? 2. В настоящее время я вручную выполняю сценарий pyspark следующим образом:

spark-submit --master spark://x.x.x.x:7077 --deploy-mode client test.py

на главном узле, поскольку я решил придерживаться автономного CM. «Xmltodict» установлен на этом узле, но не установлен на базовом узле. Похоже, его не нужно устанавливать или даже python3 настраивать на базовом узле, поскольку я не вижу никаких ошибок. Это правильно и может кто-нибудь пролить свет на эту путаницу? Я пытался установить библиотеки python через файл оболочки как bootstrap, когда создавал кластер, но он не удался, и, откровенно говоря, после нескольких попыток я отказался. 3. На основании разбиения я думаю, что я немного запутался в том, использовать ли coalesce () или collect () или нет. Опять же, вопрос в том, когда использовать, а когда нет?

Извините, слишком много вопросов. Теперь, когда у меня написан сценарий pyspark, я пытаюсь повысить эффективность. Спасибо

1 Ответ

0 голосов
/ 15 февраля 2020

Секционирование - это механизм, с помощью которого данные делятся на порции оптимального размера и основаны на том, что запускается несколько tasks, каждая из которых обрабатывает один фрагмент данных. Как видите, это ядро ​​параллелизма, и без этого не будет значительного использования Spark (или какой-либо среды обработки больших данных). Большинство форматов файлов разделяемые, а некоторые разделяемые при сжатии, такие как Avro, parquet или c et c. Некоторые форматы файлов не разделяются при сжатии, как - zip, gzip et c. В зависимости от размера обрабатываемого файла и возможности его разделения Spark автоматически создает несколько разделов и обрабатывает данные параллельно. В вашем случае, если данные zip, один файл будет одним разделом, и на нем одновременно может работать не более 1 процессора. Если этот почтовый индекс маленький, то все в порядке, но если он большой, то его обработка будет медленной.

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