искра - RDD часто упоминается в искре Что такое RDD?

Spark

Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания


СегодняВторая часть искровой темыВ этой статье рассмотрим очень важное понятие искры — RDD.

В предыдущей лекции мы устанавливали spark локально, хотя у нас есть только локальный кластер, это не мешает нам экспериментировать. Самая большая особенность spark заключается в том, что независимо от ресурсов кластера код для вычислений один и тот же, и spark будетАвтоматически выполнять распределенное планирование для нас.

Концепция СДР

Внедрение искры неотделимо от RDD, и RDD является очень важной его частью. Но многие новички часто не знают, что такое RDD, и то же самое верно для меня Я написал много кода, прежде чем систематически изучать искру, но я все еще не понимаю таких понятий, как RDD.

Полное английское название RDD:Resilient Distributed Dataset, Я написал это на английском, чтобы было намного понятнее. Даже если вы не знаете первое слово, вы, по крайней мере, знаете, что это распределенный набор данных. Первое слово означает эластичность, поэтому дословный перевод такой:Устойчивые распределенные наборы данных. Хотя мы все еще недостаточно ясны, это намного яснее, чем просто знание концепции RDD.

RDD — это неизменяемая коллекция распределенных объектов, каждый RDD разделен на несколько разделов, и эти разделы работают на разных узлах кластера.

Во многих материалах есть только такое поверхностное объяснение, которое вроде бы много говорит, но до нас не доходит. Подумав об этом, появилось много вопросов, и наконец я нашел подробное объяснение в блоге великого бога, великий бог перевернул его.исходный код искры, нашел определение RDD, RDD содержит следующее:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

Давайте посмотрим на это один за другим:

  1. Это набор разделов,Раздел — это наименьшая единица набора данных в spark.. То есть данные в spark хранятся в разделах, а разные разделы хранятся на разных узлах. Это также является основой распределенных вычислений.
  2. Вычислительная задача применяется к каждому разделу. в искреДанные и выполняемые операции разделены, а spark основан на механизме ленивых вычислений, то есть перед операцией действия, которая фактически запускает вычисление, spark сохранит, какие данные для выполнения какого вычисления. Отношение отображения между данными и вычислениями хранится в RDD.
  3. зависимости между RDD,Между СДР существует трансформационная связь., СДР можно преобразовать в другие СДР посредством операций преобразования, и эти операции преобразования будут записаны. Когда часть данных потеряна, Spark может пересчитать недостающую часть данных с помощью записанных зависимостей вместо того, чтобы пересчитывать все данные.
  4. Метод разделения, т.функция для вычисления разделов. Spark поддерживает секционирование хэшей на основе хэшей и секционирование на основе диапазонов.
  5. Список того, где хранить предпочтительное хранилище для каждого раздела.

Благодаря вышеупомянутым пяти пунктам мы можем увидеть важную концепцию искры. которыйМобильные данные не так хороши, как мобильные вычисления, то есть, когда искра запускается и планирует, она будет распределять вычисления по узлам, а не собирать данные узлов для расчета. RDD родился на основе этой идеи, и он делает именно это.

Создание RDD

Есть два способа создать RDD в spark, один из нихчитать внешний набор данных, другойРаспараллелить коллекцию, уже хранящуюся в памяти.

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

Перед этим давайте посмотримSparkContextПонятие SparkContext заключается в записи всей искры, что эквивалентно основной функции программы. Когда мы запускаем spark, spark создает для нас экземпляр SparkContext с именем sc, к которому мы можем получить прямой доступ.

Нам нужно создать RDD на основе sc.Например, я хочу создать RDD, состоящий из строк:

texts = sc.parallelize(['now test', 'spark rdd'])

Возвращаемые тексты представляют собой RDD:

Помимо распараллеливания, мы также можемвнешние данныеНапример, чтобы сгенерировать RDD, если я хочу прочитать из файла, я могу использовать метод textFile в sc, чтобы получить его:

text = sc.textFile('/path/path/data.txt')

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

Действия-конверсии и действия-действия

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

Как следует из названия, при выполнении операции преобразования spark будетПреобразование одного RDD в другой RDD. Содержимое нашего преобразования будет записано в RDD, но никакая операция выполняться не будет. Таким образом, мы по-прежнему получаем RDD вместо результата выполнения.

Например, после того, как мы создали RDD текстов, мы хотим отфильтровать содержимое и оставить только те, длина которых превышает 8. Мы можем использовать фильтр для преобразования:

textAfterFilter = texts.filter(lambda x: len(x) > 8)

То, что мы получаем после вызова, также является RDD, как мы только что сказали, потому что filter — это операция преобразования, поэтому spark только записывает свое содержимое и не выполняет его на самом деле.

Операция преобразования может работать с любым количеством RDD, например, если я сделаю следующее, я получу всего 4 RDD:

inputRDD = sc.textFile('path/path/log.txt')
lengthRDD = inputRDD.filter(lambda x: len(x) > 10)
errorRDD = inputRDD.filter(lambda x: 'error' in x)
unionRDD = errorRDD.union(lengthRDD)

Последнийunion объединит результаты двух RDD, если мы выполним приведенный выше код, spark запишет информацию о зависимости этих RDD, мы нарисуем эту информацию о зависимости, и она станет графом зависимости:

Независимо от того, сколько операций преобразования мы выполняем, spark никогда фактически не выполняет операции в нем,Только когда мы выполняем действие, зарегистрированные конверсии действительно учитываются.. Такие операции, как first(), take(), count() и т. д., являются операциями действия, и в это время spark возвращает нам результат вычисления.

Целью first является возврат первого результата, take должен передать параметр, чтобы указать количество возвращаемых результатов, а count — это количество результатов вычислений. Поскольку мы просрочили, после того, как мы выполнили эти операции, spark вернул нам результат.

В этой статье основное внимание уделяется концепции RDD, а наша следующая статья будет посвящена подробной интерпретации операций преобразования и операций действия. Заинтересованные студенты могут с нетерпением ждать этого ~

На сегодняшней статье все. Если вы чувствуете, что что-то приобрели, пожалуйста, нажмитесмотреть или пересылатьЧто ж, твое маленькое усилие много значит для меня.