Как обрабатывать различные графические файлы для независимой обработки между узлами кластера в Apache Spark?

Допустим, у меня есть большое количество графических файлов, и каждый граф имеет около 500 000 ребер. Я обрабатывал эти файлы графов в Apache Spark, и мне было интересно, как эффективно распараллелить всю работу по обработке графов. Поскольку на данный момент каждый файл графа независим от любого другого, я ищу параллелизм с файлами. Итак, если у меня есть 100 графических файлов и кластеры из 20 узлов, могу ли я обрабатывать каждый файл на каждом узле, чтобы каждый узел обрабатывал 5 файлов. Теперь то, что происходит, похоже на то, что один граф обрабатывается в несколько этапов, что вызывает много перетасовки.

graphFile = "/mnt/bucket/edges" #This directory has 100 graph files each file with around 500K edges

nodeFile = "/mnt/bucket/nodes" #This directory has node files

graphData = sc.textFile(graphFile).map(lambda line: line.split(" ")).flatMap(lambda edge: [(int(edge[0]),int(edge[1]))])

graphDataFrame = sqlContext.createDataFrame(graphData, ['src', 'dst']).withColumn("relationship", lit('edges')) # Dataframe created so as to work with Graphframes

nodeData = sc.textFile(nodeFile).map(lambda line: line.split("\s")).flatMap(lambda edge: [(int(edge[0]),)])

nodeDataFrame = sqlContext.createDataFrame(nodeData, ['id'])

graphGraphFrame = GraphFrame(nodeDataFrame, graphDataFrame)

connectedComponent = graphGraphFrame.connectedComponents()

Дело в том, что обработка даже пары файлов занимает много времени. И мне нужно обработать 20К файлов. Каждый файл имеет 800 тысяч ребер. Может быть, если удастся разработать стратегию разделения данных, которая гарантирует, что все зависимые ребра будут обрабатываться на одном узле, перетасовки будет меньше.

Или каков наилучший способ решить это эффективно?


person hsuk    schedule 17.08.2016    source источник
comment
Если вы хотите обрабатывать данные, используя одну машину и один поток, какой смысл использовать Spark?   -  person zero323    schedule 17.08.2016
comment
Я могу быть не прав. Мне просто интересно и смущено, как искра обрабатывает данные. Я создал отдельный RDD для каждого файла графа, и когда я запускаю задание, он просто продолжает промежуточную постановку. Я запускаю его на кластере из 8 узлов.   -  person hsuk    schedule 17.08.2016
comment
Основное внимание Spark уделяет параллелизму данных, и, хотя основной движок достаточно универсален, чтобы использовать его для некоторых вариантов параллелизма задач, обычно это дорогое излишество. Если вы предполагаете, что отдельные графы могут обрабатываться на одном узле, просто используйте хорошую локальную библиотеку и распараллеливайте задачи, используя ваш любимый инструмент планирования/управления конвейером.   -  person zero323    schedule 17.08.2016
comment
Спасибо, если я создам один большой RDD из всех этих файлов, как мне правильно их разбить?   -  person hsuk    schedule 17.08.2016
comment
Вы можете использовать собственный разделитель и извлечь имена файлов, например, из input_file_name, но я не думаю, что это сильно поможет вам с GraphX. .   -  person zero323    schedule 17.08.2016
comment
Ну, сейчас я использую фреймы данных. Но все еще жду, как его разбить. Эй, если вы предоставите мне свой адрес электронной почты, я могу отправить вам свой код, который примерно равен 15 строкам, и не могли бы вы просмотреть и сказать мне, что примерно сделать с ним, чтобы оптимизировать его. Я не могу просто разместить свой код здесь.   -  person hsuk    schedule 18.08.2016
comment
Не могли бы вы увидеть мой обновленный вопрос...   -  person hsuk    schedule 20.08.2016
comment
Честно говоря, мне больше нечего добавить. Если вы хотите обрабатывать графики локально, библиотеки обработки графиков на основе Spark (GraphX, Graphframes) будут бесполезны. И даже если обработать все на одном узле, все равно потребуется перемешивание.   -  person zero323    schedule 20.08.2016
comment
Дело в том, что обработка даже пары файлов занимает много времени. И мне нужно обработать 20К файлов. Каждый файл имеет 800 тысяч ребер. Может быть, если удастся разработать стратегию разделения данных, которая гарантирует, что все зависимые ребра будут обрабатываться на одном узле, перетасовки будет меньше.   -  person hsuk    schedule 20.08.2016


Ответы (1)


TL;DR Apache Spark не подходит для этой работы.

Основная область применения Spark — параллелизм данных, но то, что вы ищете, — это параллелизм задач. Теоретически базовый движок Spark достаточно универсален, чтобы его можно было использовать и для достижения ограниченного параллелизма задач, но на практике для такой работы существуют лучшие инструменты, и это определенно не является целью таких библиотек, как GraphX ​​и GraphFrames.

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

Учитывая фрагмент кода, который вы показали, встроенная библиотека обработки графов, такая как igraph или NetworkX (лучше задокументирован и гораздо более полный, но, к сожалению, требователен к памяти и немного медлителен) в сочетании с GNU Parallel должно быть более чем достаточно и гораздо эффективнее на практике. Для более сложных заданий вы можете рассмотреть возможность использования полнофункционального инструмента управления рабочим процессом, такого как Airflow или Luigi.

person zero323    schedule 20.08.2016
comment
что вы подразумеваете под, к сожалению, менее эффективным? - person hsuk; 21.08.2016
comment
Если вы имеете в виду, что Spark не является подходящим инструментом для этой работы, какие могут быть примеры алгоритма графа, с которым искра может эффективно справиться. Я действительно не понял, почему Spark не может быть подходящим инструментом для этой работы. - person hsuk; 21.08.2016
comment
И не могли бы вы объяснить мне, какие данные будут полезны для правильной работы вышеуказанной функции подключенного компонента. - person hsuk; 21.08.2016
comment
почему Spark не может быть подходящим инструментом для этой работы, потому что он не предназначен для задач с малой задержкой на одной машине. какие могут быть примеры графового алгоритма, с которым искра может эффективно работать - распределенная обработка графа в целом является сложной проблемой. Если у вас есть данные, которые можно легко обработать с помощью встроенных решений, нет причин заморачиваться с распределенными. Оставьте его для данных, которые действительно требуют этого. - person zero323; 21.08.2016