2. О чём пойдёт речь
● что можно выжать из Spark
● с чем могут быть проблемы
● ничего сверхъестественного
● это есть в документации
(но кто читает дальше первой страницы?)
3. DISCLAIMER
Теперь не верьте моим словам только
потому, что их сказал Будда, но проверяйте
их как следует
Будда Шакьямуни
7. dstream.foreachRDD { rdd =>
// executed at the driver
val connection =
createNewConnection()
rdd.foreach { record =>
// executed at the worker
connection.send(record)
}
}
Важно: соединения не сереализуемы
НЕПРАВИЛЬНО!
8. dstream.foreachRDD { rdd =>
// executed at the driver
val connection =
createNewConnection()
rdd.foreach { record =>
// executed at the worker
connection.send(record)
}
}
Важно: соединения не сереализуемы
НЕПРАВИЛЬНО!
dstream.foreachRDD { rdd =>
rdd.foreach { record =>
val connection =
createNewConnection()
connection.send(record)
connection.close()
}
}
НЕЭФФЕКТИВНО!
9. dstream.foreachRDD { rdd =>
rdd.foreachPartition { partitionOfRecords =>
// connection per partition, i.e. per worker
machine
val connection = createNewConnection()
partitionOfRecords.foreach(record => connection.
send(record))
connection.close()
}
}
Правильный вариант
Worker Worker Worker
connection
connection
connection
11. Процессы без входных данных (2)
def runSimulation(workerId: Int): Unit = {
...
}
sc.parallelize(1 to NWorkers, NWorkers)
.map(runSimulation)
.collect()
numSlices -
количество партиций
15. Одновременные джобы
Что будет, если…
(1) val sourceRdd = sc.textFile(...)
(2) sourceRdd.filter(x => x == 42).map(...).collect()
(3) sourceRdd.filter(x => x != 42).map(...).collect()
(2) и (3) выполнятся параллельно или
последовательно?
16. Одновременные джобы (2)
Что будет, если…
(1) val sourceRdd = sc.textFile(...)
(2) sourceRdd.filter(x => x == 42).map(...).collect()
(3) sourceRdd.filter(x => x != 42).map(...).collect()
(2) и (3) выполнятся параллельно или
последовательно?
Блокер - сам драйвер
17. Одновременные джобы (3)
(1) val sourceRdd = sc.textFile(...)
(2) val rdd1 = sourceRdd.filter(x => x == 42).map(...)
(3) val rdd2 = sourceRdd.filter(x => x != 42).map(...)
(4) List(rdd1, rdd2).par.foreach { rdd =>
rdd.collect()
}
18. Пример: SQL-сервер
Server
(Driver)
Query (Job)
Query (Job)
Query (Job)
val conf = new SparkConf()
// conf.set("spark.scheduler.mode",
"FIFO")
conf.set("spark.scheduler.mode", "FAIR")
val sc = new SparkContext(conf)
21. Сэмплирование данных
val rdd = sc.parallelize(1 to 1000)
// takeSample(withReplacement, num)
rdd.takeSample(false, 10) // ⇒ array of 10 elements, but calls .count()
// sample(withReplacement, fraction)
rdd.sample(false, 0.01).collect() // ⇒ array of 7 elements
rdd.sample(false, 0.01).collect() // ⇒ array of 14 elements
rdd.sample(false, 0.01).collect() // ⇒ array of 13 elements