Загружает ли Apache Spark все данные из целевой базы данных?

Я хочу использовать Apache Spark и подключиться к Vertica с помощью JDBC.

В базе данных Vertica у меня есть 100 миллионов записей, а искровой код выполняется на другом сервере.

Когда я запускаю запрос в Spark и отслеживаю использование сети, трафик между двумя серверами очень высок.

Кажется, Spark загружает все данные с целевого сервера.

это мой код:

test_df = spark.read.format("jdbc")
    .option("url" , url).option("dbtable", "my_table")
    .option("user", "user").option("password" , "pass").load()

test_df.createOrReplaceTempView('tb')

data = spark.sql("select * from tb")

data.show()

когда я запускаю это, после 2 минут и очень высокого использования сети результат возвращается.

Загружает ли Spark все данные из целевой базы данных?


person HoseinEY    schedule 16.02.2017    source источник
comment
Вы можете использовать sql("select count(*) from spark_table").explain(true), чтобы увидеть план запроса, который может дать вам больше информации.   -  person Vishnu667    schedule 16.02.2017


Ответы (2)


JDBC на основе DBs разрешать запросы на выталкивание, чтобы вы считывали с диска только релевантные элементы: например: df.filter("user_id == 2").count сначала выберет только отфильтрованные записи, а затем отправит счет для искры. Таким образом, используя JDBC: 1. спланируйте фильтры, 2. разделите вашу БД в соответствии с вашими шаблонами запросов и дополнительно оптимизируйте форму искры, например:

val prop = new java.util.Properties
prop.setProperty("driver","org.postgresql.Driver")
prop.setProperty("partitionColumn", "user_id")
prop.setProperty("lowerBound", "1")
prop.setProperty("upperBound", "272")
prop.setProperty("numPartitions", "30")

Однако большинство relational DB разбито по определенным полям в древовидной структуре, которая не идеальна для сложных запросов к большим данным: я настоятельно рекомендую скопировать таблицу из JDBC в no-sql, например cassandra, mongo, elastic serach, или в файловые системы, например alluxio или hdfs. чтобы включить масштабируемые - параллельные - сложные - быстрые запросы. Наконец, вы можете заменить JDBC на aws redshift, что не должно быть так сложно реализовать для бэкэнда/внешнего интерфейса, однако с вашей стороны искры трудно справляться с конфликтами повторной зависимости, но это позволит вам выполнять сложные запросы намного быстрее, поскольку он разделяет столбцы, так что вы можете иметь агрегаты push down для самих столбцов, используя несколько рабочих процессов.

person elcomendante    schedule 16.02.2017
comment
для этой команды в spark: result = df.filter(df.test_col == 1).count(), Spark запустите этот запрос в базе данных: SELECT 1 FROM Event WHERE (test_col IS NOT NULL) AND (test_col = 1) . выберите 1, чтобы добиться больших результатов при очень высоком сетевом трафике. как я могу получить счет по-другому? - person HoseinEY; 18.02.2017

После завершения ваших заданий spark войдите в базу данных Vertica, используя те же учетные данные, которые использовались и запустите задание spark:

SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000;

Это покажет вам запросы, отправленные в базу данных искровым заданием, что позволит вам увидеть, передал ли он счетчик (*) в базу данных или действительно пытался получить всю таблицу по сети.

person Doug Harmon    schedule 17.02.2017