Оптимизация производительности - PullRequest
0 голосов
/ 29 мая 2018

У меня 6 столов в улье.Я объединяю эти таблицы с предстоящими данными потока Кафки, используя потоковую передачу искры.Я использовал функцию registerTempTable и зарегистрировал все 6 таблиц и даже входящие данные Kafka.Затем я применил внутреннее объединение среди всех таблиц.

пример -

select * from tableA a 
join tableB b on a.id = b.id     
join tableC c on b.id = c.id
......
......

Потребовалось около 3 минут, чтобы завершить объединение.И я вижу много перемешивания данных.enter image description here

Я использовал следующие свойства -

  conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  conf.set("spark.kryoserializer.buffer.max", "512")
  conf.set("spark.sql.broadcastTimeout", "36000")
  conf.set("spark.sql.autoBroadcastJoinThreshold", "94371840")

Есть ли способ уменьшить случайное чтение и запись.

1 Ответ

0 голосов
/ 29 мая 2018

Вам необходимо:

  1. Преобразовать DataFrame в Key / Value PairRDD
  2. Разделить все PairRDD с одним и тем же разделителем
  3. cache() промежуточный результат
  4. Затем вы можете использовать RDD в операции соединения (но вам также потребуется преобразовать данные kafka в PairRDD.

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

Есть несколько полезных советов по объединениям в spark здесь

...