Size: a a a

2020 January 14

Н

Никита in Moscow Spark
привет, у меня flume стримит в папку на hdfs, хочу отпроцессить эти данные и затирать то, что прочитал и писать в hive красиво, чтобы не плодить маленькие файлы.
вопрос: как читать файлы в sparke а потом их затирать? Как лучше делать это джобом или спарк стримингом?
Если писать малеьникими rdd через спарк стриминг в хайв, он их потом замерджит или будут маленькьие файлы?
источник

a

agathis in Moscow Spark
Господа, кто-нибудь читал спарком партиционированные by hash таблицы из оракла (или, собственно, любой другой rdbms)?
Выглядит так, что спарк понятия не имеет о структуре таблицы, и если читать со spark.read.format("jdbc"), можно даже указать numPartitions - но оно к сожалению не имеет ничего общего с партициями БД
источник

R

Renarde in Moscow Spark
agathis
Господа, кто-нибудь читал спарком партиционированные by hash таблицы из оракла (или, собственно, любой другой rdbms)?
Выглядит так, что спарк понятия не имеет о структуре таблицы, и если читать со spark.read.format("jdbc"), можно даже указать numPartitions - но оно к сожалению не имеет ничего общего с партициями БД
С ораклом это не работает, спарк будет пытаться стучаться множественными селектами и будет получаться не оч. Как более оптимальный вариант - вычитать список экстентов из dba таблиц и дальше селектить экстенты в параллель - будет норм. Так работает Sqoop for Oracle, если я не ошибаюсь.
Ограничения - нужен доступ на уровне dba к БД.
Зато это хорошо работает с Teradata - там расписал хеш, и спарк будет в параллель работать прям хорошо.
источник

N

Nikolay in Moscow Spark
Экстенты нельзя селектить. Наверное про партиции речь
источник

R

Renarde in Moscow Spark
Nikolay
Экстенты нельзя селектить. Наверное про партиции речь
я вот забыл совсем эту терминологию (то ли экстент, то ли партиция, то ли сегмент).
Короче идея была в том, что достается список значений из из какой-то dba_* таблицы и по ним запросы в параллель норм идут
источник

N

Nikolay in Moscow Spark
dba_не нужны . Хватит all_
источник

R

Renarde in Moscow Spark
Вот, нашел.

Партиции достаются вот так:

SELECT partition_name FROM dba_tab_partitions WHERE table_name=‘your_table’


Затем полученный список можно залить в RDD:

va
l partitions = spark.read.format.jdbc(“select partition_name …”)

Затем можно сделать flatMap:

part
itions.flatMap(partitionName -> {
 val query = s“SELECT * FROM table PARTITION ({partitionName})”
 // some jdbc-related stuff
})

И
получить все партиции в параллель.
источник

a

agathis in Moscow Spark
Renarde
Вот, нашел.

Партиции достаются вот так:

SELECT partition_name FROM dba_tab_partitions WHERE table_name=‘your_table’


Затем полученный список можно залить в RDD:

va
l partitions = spark.read.format.jdbc(“select partition_name …”)

Затем можно сделать flatMap:

part
itions.flatMap(partitionName -> {
 val query = s“SELECT * FROM table PARTITION ({partitionName})”
 // some jdbc-related stuff
})

И
получить все партиции в параллель.
Во, спасибо. Это похоже оно
источник

DZ

Dmitry Zuev in Moscow Spark
Так вроде jdbc умеет в partitionColumn, это не поможет?
источник

R

Renarde in Moscow Spark
Dmitry Zuev
Так вроде jdbc умеет в partitionColumn, это не поможет?
нет, потому что spark сгенерирует запросы типа:

select * from tab where x between 10 and 20
select * from tab where x between 20 and 30
источник

R

Renarde in Moscow Spark
что в оракле будет медленно. Поэтому надо чуть похитрить с селектом
источник

a

agathis in Moscow Spark
Renarde
нет, потому что spark сгенерирует запросы типа:

select * from tab where x between 10 and 20
select * from tab where x between 20 and 30
это отлично работает с партиционированием by range
источник

AA

Aleksandr Aleksandro... in Moscow Spark
Renarde
нет, потому что spark сгенерирует запросы типа:

select * from tab where x between 10 and 20
select * from tab where x between 20 and 30
Можно явно предикаты указать через
predicates - Condition in the where clause for each partition.
источник

R

Renarde in Moscow Spark
Aleksandr Aleksandrov
Можно явно предикаты указать через
predicates - Condition in the where clause for each partition.
> where clause
Это не where clause, это отдельный оракловый синтаксис.
источник

R

Renarde in Moscow Spark
Тут никакого where и в помине нет 🤷‍♂️

> SELECT * FROM table PARTITION ({partitionName})
источник

AA

Aleksandr Aleksandro... in Moscow Spark
Renarde
> where clause
Это не where clause, это отдельный оракловый синтаксис.
если в where будет селект по патриции, то оракл план нормально построит
источник

R

Renarde in Moscow Spark
Aleksandr Aleksandrov
если в where будет селект по патриции, то оракл план нормально построит
дедлок будет в планировщике. Представь ты 1024 партиции в  1024 запроса одновременно кинешь - будет медленно.
если partition by hash, то ты не знаешь где у. тебя границы
источник

N

Nikolay in Moscow Spark
Если партиции по hash, то нужно не between а через in
источник

N

Nikolay in Moscow Spark
В каждом in может быть до 1000 значений
источник

SK

Sergej Khakhulin in Moscow Spark
Grigory Pomadchin
Не помню вообще говоря) вот расскажешь нам
При сборке спарка нормально когда такие варнинги сыпяться?
И ответ что бы без хадупа нужен ключ -Phadoop-provided
источник