2014-12-24 2 views
13

Я пытаюсь понять внутренности Apache Spark. Интересно, использует ли Spark некоторые механизмы для обеспечения локальности данных при чтении из InputFormat или записи в OutputFormat (или других форматах, поддерживаемых Spark и не полученных из MapReduce).Использует ли Spark данные?

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

В случае написания, как будет работать такой механизм? Я знаю, что технически файл в HDFS можно сохранить в любом узле локально и реплицировать на другие два (так что вы используете сеть для двух из 3-х реплик), но если вы планируете писать в другие системы, такие как база данных NoSQL (Cassandra, HBase, другие ..), такие системы имеют свой собственный способ распространения данных. Есть ли способ сказать искру разбивать RDD таким образом, чтобы оптимизировать местоположение данных на основе распределения данных, ожидаемых выходным приемником (целевая база данных NoSQL, видимая изначально или через OutputFormat)?

Я имею в виду среду, в которой узлы Spark и узлы NoSQL живут на одних и тех же физических машинах.

ответ

4

Если вы используете Spark и Cassandra на одной и той же физической машине, вы должны зарегистрироваться spark-cassandra-connector Это обеспечит локальность данных как для чтения, так и для записи.

Например, если вы загружаете таблицу Cassandra в RDD, соединитель всегда будет пытаться выполнять операции на этом RDD локально на каждом узле. И когда вы сохраняете RDD в Cassandra, соединитель также попытается сохранить результаты локально.

Это предполагает, что ваши данные уже сбалансированы в вашем кластере Cassandra. Если ваш PartitionKey не выполнен правильно, в любом случае вы получите неуравновешенный кластер.

Также имейте в виду перетасовку работ на Spark. Например, если вы выполняете ReduceByKey на RDD, вы все равно будете передавать потоковые данные по сети. Поэтому всегда тщательно планируйте эти задания.

+0

Согласитесь с большинством из этого. Тем не менее, RedByKey может использовать преимущества разбиения. Если ваш RDD является парным (т. Е. (Ключ, значение)), вы можете сделать pairedRdd.partitionBy (новый HashPartitioner (100)), который сохранит информацию о разделении. Затем вы можете сделать ReduceByKey, который будет использовать информацию о разделении и сделать локальные сокращения. Это может потенциально избежать затрат в случайном порядке/сети. – ashic

+0

Насколько я знаю, место записи для разъема spark-cassandra означает, что координатор-узел для операции записи будет находиться на той же машине, что и искровой узел, на котором выполняется задача записи для данного раздела (LocalNodeFirst ...) , Затем узел-координатор должен переслать операцию записи в реплики ONE/TWO/THREE/XX. Если я выполняю пакетную запись с согласованностью ONE, реальная оптимизация будет организовывать разделы таким образом, чтобы узел координатора должен записывать данные локально только после отправки OK на соединитель. Возможен ли такой сценарий (Кассандра или любая другая БД)? –

+0

Это поведение по умолчанию в партиях Кассандры. Хотя не рекомендуется использовать партии, WriteAsync намного оптимизирован (особенно в Java-драйвере cassandra). Также есть разница между политикой записи и коэффициентом репликации в Кассандре. Если вы пишете на ОДНО узел и используете коэффициент репликации 3, узел координатора ответит OK, как только запись будет успешной для одного узла. Затем начнется процесс репликации. Вам не нужно ждать репликации во время записи. – Emam

Смежные вопросы