Spark: master local[*] намного медленнее, чем master local
У меня есть EC2
настроить с r3.8xlarge (32 cores, 244G RAM)
,
В моем Spark
приложение, я читаю два файла CSV из S3
с помощью Spark-CSV
из DataBrick каждый CSV имеет около 5 миллионов строк. я unionAll
два DataFrames и работает dropDuplicates
на комбинированном DataFrame.
Но когда у меня есть,
val conf = new SparkConf()
.setMaster("local[32]")
.setAppName("Raw Ingestion On Apache Spark")
.set("spark.sql.shuffle.partitions", "32")
Спарк медленнее, чем .setMaster("local")
Разве это не будет быстрее с 32 ядрами?
1 ответ
Хорошо, спарк - это не операционная система Windows, чтобы она работала с максимально возможной мощностью с самого начала, вам нужно настроить ее для своего использования.
Прямо сейчас вы прямо сказали, что нужно запустить и обработать мои данные на одном узле с 32 ядрами. Это не то, для чего Спарк хорош. Предполагается, что это распределенная система, работающая в многоузловом кластере, где она работает лучше всего.
Причина проста, даже если вы используете 32 ядра, как насчет проблемы с вводом-выводом? Потому что теперь вы используете "давайте", если на нем было 30 исполнителей, тогда это 32 процесса чтения с одного диска.
Вы указали 32 ядра, как насчет памяти исполнителя? У обеих машин был один таран, где вы тестировали.
Теперь вы конкретно указали, что вам нужно 32 раздела, если данные очень малы, что приводит к большим накладным расходам. В идеале не следует указывать раздел до тех пор, пока вы не будете точно знать, что делаете, или выполняете повторяющуюся задачу, и знаете, что данные будут точно одинаковыми все время.
Если вы настроите его правильно, спарк с 32 ядрами действительно будет работать быстрее, чем "локальный", который в основном работает на одном ядре.