Каковы различия между sc.распараллелить и sc.текстовый файл?

Я новичок в Spark. может кто-нибудь, пожалуйста, очистите мои сомнения:

предположим, что ниже мой код:

a = sc.textFile(filename) 
b = a.filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()

Я надеюсь, что ниже то, что происходит внутри: (пожалуйста, исправьте, если мое понимание неправильно)

(1) переменная a будет сохранена как переменная RDD, содержащая ожидаемое содержимое файла txt

(2) узел драйвера разбивает работу на задачи, и каждая задача содержит информацию о разделении данных, с которыми она будет работать. Теперь эти Задачи назначаются рабочим узлам.

(3) при действии сбора (i.e collect() в нашем случае) вызывается, результаты будут возвращены мастеру с разных узлов и сохранены как локальная переменная c.

теперь я хочу понять, какая разница ниже код:

a = sc.textFile(filename).collect() 
b = sc.parallelize(a).filter(lambda x: len(x)>0 and x.split("\t").count("111")) 
c = b.collect() 

может кто-нибудь уточнить ?

1 ответов


(1) переменная a будет сохранена как переменная RDD С ожидаемое содержимое файла txt

(выделение мое) не реально. Линия просто описание что будет после вы выполняете действие, т. е. переменная RDD делает не содержит ожидаемое содержимое файла txt.

RDD описывает разделы, которые при вызове действия становятся задачами, которые будут читать их части входной файл.

(2) узел драйвера разбивает работу на задачи, и каждая задача содержит информацию о разделении данных, с которыми она будет работать. Теперь эти задачи назначаются рабочим узлам.

да, но только когда вызывается действие, которое c=b.collect() в вашем случае.

(3) при действии сбора (i.e collect() в нашем случае) вызывается, результаты будут возвращены мастеру с разных узлов и сохранены как локальная переменная c.

да! Это самая опасная операция с памятью, так как все исполнители Spark работают где-то в кластере начните отправлять данные обратно водителю.

теперь я хочу понять, какая разница ниже код делает

цитирование документации sc.текстовый файл:

textFile (путь: строка, minPartitions: Int = defaultMinPartitions): RDD[строка] прочитайте текстовый файл из HDFS, локальной файловой системы (доступной на всех узлах) или любого URI файловой системы, поддерживаемого Hadoop, и верните его как RDD строк.

цитирование документации sc.распараллелить:

распараллелить[Т](сл: сл[Т], numSlices: Инт = defaultParallelism)(неявные параметры arg0: ClassTag[Т]): РДД[Т] распространите локальную коллекцию Scala для формирования RDD.

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

поэтому основное различие заключается в источнике данных.