В Spark API, в чем разница между функциями makeRDD и функцией параллелизации?

У меня есть один вопрос, во время make spark app. В Spark API, в чем разница между функциями makeRDD и функцией parallelize?

Ответ 1

Нет никакой разницы. Чтобы процитировать инструкцию makeRDD:

Этот метод идентичен parallelize.

и если вы посмотрите на реализацию, она просто вызывает parallelize:

def makeRDD[T: ClassTag](
    seq: Seq[T],
    numSlices: Int = defaultParallelism): RDD[T] = withScope {
  parallelize(seq, numSlices)
}

В конце дня это вопрос вкуса. Следует учитывать, что makeRDD, по-видимому, специфичен для API Scala. PySpark и внутренний SparkR API предоставляют только parallelize.

Примечание. Существует вторая реализация makeRDD, которая позволяет вам устанавливать параметры местоположения, но данные другая подпись не взаимозаменяема с parallelize.

Ответ 2

Как отмечено @zero323, makeRDD имеет 2 реализации. Один из них идентичен распараллеливанию. other - очень полезный способ внедрить локальность данных в ваше приложение Spark, даже если вы не используете HDFS.

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

Чтобы сделать это, вы можете использовать makeRDD для создания пустого RDD с разными настройками местоположения, назначенными каждому из ваших разделов RDD. Каждый раздел может нести ответственность за загрузку ваших данных. Пока вы заполняете разделы с помощью пути к локальным данным раздела, выполнение последующих преобразований будет node -local.

Seq<Tuple2<Integer, Seq<String>>> rddElemSeq = 
                       JavaConversions.asScalaBuffer(rddElemList).toSeq();
RDD<Integer> rdd = sparkContext.makeRDD(rddElemSeq, ct);
JavaRDD<Integer> javaRDD = JavaRDD.fromRDD(rdd, ct);
JavaRDD<List<String>> keyRdd = javaRDD.map(myFunction);
JavaRDD<myData> myDataRdd = keyRdd.map(loadMyData);

В этом фрагменте rddElemSeq содержит настройки местоположения для каждого раздела (IP-адрес). Каждый раздел также имеет Integer, который действует как ключ. Моя функция myFunction использует этот ключ и может использоваться для создания списка путей к моим данным, локальным для этого раздела. Затем эти данные можно загрузить в следующей строке.