У меня есть один вопрос, во время make spark app.
В Spark API, в чем разница между функциями makeRDD
и функцией parallelize
?
В Spark API, в чем разница между функциями makeRDD и функцией параллелизации?
Ответ 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
использует этот ключ и может использоваться для создания списка путей к моим данным, локальным для этого раздела. Затем эти данные можно загрузить в следующей строке.