spark: нетипичные примеры использования

22
Spark: нетипичные примеры использования

Upload: faithlessfriend

Post on 18-Jul-2015

546 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: Spark:  нетипичные примеры использования

Spark: нетипичные примеры

использования

Page 2: Spark:  нетипичные примеры использования

О чём пойдёт речь

● что можно выжать из Spark● с чем могут быть проблемы● ничего сверхъестественного● это есть в документации (но кто читает дальше первой страницы?)

Page 3: Spark:  нетипичные примеры использования

DISCLAIMER

Теперь не верьте моим словам только потому, что их сказал Будда, но проверяйте

их как следует

Будда Шакьямуни

Page 4: Spark:  нетипичные примеры использования

Типичный пример

rdd.map(processor) .reduce(reducer)

rdd = sc.textFile(“hdfs://...”)

stream = KafkaUtils.createStream(...)

rdd.saveAsTextFile(...)

Page 5: Spark:  нетипичные примеры использования

Обращение ко внешним сервисам

data enrichment

Page 6: Spark:  нетипичные примеры использования

Обращение ко внешним сервисам (2)

data enrichment

Page 7: Spark:  нетипичные примеры использования

dstream.foreachRDD { rdd =>

// executed at the driver val connection = createNewConnection() rdd.foreach { record =>

// executed at the worker connection.send(record) }}

Важно: соединения не сереализуемыНЕПРАВИЛЬНО!

Page 8: Spark:  нетипичные примеры использования

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() }}

НЕЭФФЕКТИВНО!

Page 9: Spark:  нетипичные примеры использования

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

connectio

n connection

conn

ectio

n

Page 10: Spark:  нетипичные примеры использования

Процессы без входных данных

worker worker worker worker

Driver

Page 11: Spark:  нетипичные примеры использования

Процессы без входных данных (2)

def runSimulation(workerId: Int): Unit = {

...

}

sc.parallelize(1 to NWorkers, NWorkers)

.map(runSimulation)

.collect()

numSlices - количество партиций

Page 12: Spark:  нетипичные примеры использования

Обратная связь

worker worker worker worker

Driver BadFormatException

Page 13: Spark:  нетипичные примеры использования

Обратная связь (2)

worker worker worker worker

Driver RabbitMQ

BadFormatException

Page 14: Spark:  нетипичные примеры использования

Обратная связь (Ninja level)

worker worker worker worker

Driver Akka

SparkContext.env.actorSystem

BadFormatException

Page 15: Spark:  нетипичные примеры использования

Одновременные джобыЧто будет, если…

(1) val sourceRdd = sc.textFile(...)

(2) sourceRdd.filter(x => x == 42).map(...).collect()

(3) sourceRdd.filter(x => x != 42).map(...).collect()

(2) и (3) выполнятся параллельно или последовательно?

Page 16: Spark:  нетипичные примеры использования

Одновременные джобы (2)Что будет, если…

(1) val sourceRdd = sc.textFile(...)

(2) sourceRdd.filter(x => x == 42).map(...).collect()

(3) sourceRdd.filter(x => x != 42).map(...).collect()

(2) и (3) выполнятся параллельно или последовательно?Блокер - сам драйвер

Page 17: Spark:  нетипичные примеры использования

Одновременные джобы (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()

}

Page 18: Spark:  нетипичные примеры использования

Пример: 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)

Page 19: Spark:  нетипичные примеры использования

Перебалансировка партициймного файлов = много партиций

rdd.coalesce(4)

Page 20: Spark:  нетипичные примеры использования

Перебалансировка партиций (2)gzip - неделимый формат

rdd.repartition(10)

split ‘em, Shura, they are golden!

Page 21: Spark:  нетипичные примеры использования

Сэмплирование данных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

Page 22: Spark:  нетипичные примеры использования

Thank you!

[email protected]