Подтвердить что ты не робот

Доступ к таблицам RDD Spark SQL через Thrift Server

Я зарегистрировал временную таблицу с Spark SQL, как описано в [этот раздел]:

people.registerTempTable("people")
// I can run queries on it all right.
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")

Теперь я хочу получить доступ к этой таблице удаленно через JDBC. Я запускаю Thrift Server, как описано в [этот другой раздел].

./sbin/start-thriftserver.sh --master spark://same-master-as-above:7077

Но таблица не видна.

0: jdbc:hive2://localhost:10000> show tables;         
+---------+
| result  |
+---------+
+---------+
No rows selected (2.216 seconds)

Я предполагаю, что это потому, что таблица является "временной" (т.е. привязана к времени жизни объекта SqlContext). Но как мне делать не временные таблицы?

Я вижу таблицы Hive через Thrift Server, но я не вижу, как я мог бы разоблачить RDD, как это. Я нашел комментарий, который предполагает, что я не могу.

Или я должен запустить Thrift Server в своем приложении со своим собственным SqlContext? Почти все классы вокруг него private, и этот код не находится в Maven Central (насколько я вижу). Я должен использовать HiveThriftServer2.startWithContext? Он недокументирован и @DeveloperApi, но может работать.

4b9b3361

Ответ 1

Измените spark-defaults.conf и добавьте spark.sql.hive.thriftServer.singleSession true.

Это позволяет серверу Thrift видеть временные таблицы, основанные непосредственно на RDD, без сохранения таблицы. Вы также можете сделать CACHE TABLE XXX AS <query> в Spark SQL и открыть его через ODBC/JDBC.

Ответ 2

Скорее всего, вы уже решили эту проблему. Но недавно я попробовал подобный случай использования и хотел поделиться своими выводами. Чтобы выставить данные Spark по JDBC, вам необходимо сделать следующее:

  • Запустите бережливый сервер, который поставляется с Spark (я использовал версию 1.3.1), бережливый сервер с Hive также мог работать, но я не тестировал, что

    /opt/mapr/spark/spark-1.3.1/sbin/start-thriftserver.sh - Исходная искра://Искра-мастер: 7077 --hiveconf hive.server2.thrift.bind.host Искра-мастер --hiveconf hive.server2.trift.port 10001

Убедитесь, что вы не указали "localhost", но фактический ip-адрес/имя DNS сервера "hive.server2.thrift.bind.host", иначе вы не можете подключиться к этому бережному серверу с другого хоста

  • beeline - это простой клиент JDBC, который поставляется с Hive и Spark. Запустите beeline и подключите его к вашему бережному серверу.

SPARK_HOME/bin/beeline

beeline > ! connect jdbc: hive2://spark-master: 10001

  • вы можете использовать любой hiveql здесь для загрузки данных, которые вы хотите в таблицу, но sql будет выполнен в Spark cluster

    создать временные твиты таблицы, используя параметры org.apache.spark.sql.parquet(путь 'maprfs:///path-to-your-parquet-files/');

  • кэшировать таблицу в искровой памяти

твиты в таблице кэша

  • Вот и все ваши данные теперь кэшируются в искровом кластере, и вы можете запросить это с низкой задержкой по удаленному jdbc

  • jdbc-кодирование точно такое же, как и запись любого кода jive-кода hive, потому что бережливый сервер понимает hiveql и переводит его, чтобы исправить sql. Посмотрите здесь примеры hive jdbc:

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLs

Для имени пользователя вы можете указать любое имя пользователя linux в машине бережливого сервера и оставить пароль пустым (это не защищенный режим, при необходимости вы можете сделать вещи более безопасными)

  • таблица "твиты" не будет видна с помощью "show tables" и т.д., потому что таблица не зарегистрирована в метастаре улья, но вы можете делать все sql-запросы с помощью таблицы над jdbc

  • вы можете использовать Spark для кэширования данных в памяти и запроса на удаленный jdbc/odbc. Это даст низкие латентные ответы, я получил ответы за 2 секунды для данных размером около 40 ГБ. Но кэширование не будет работать для действительно больших данных, таких как tera bytes. В этом случае избегайте команды "cache table...", и вы все равно можете использовать удаленный jdbc/odbc, но ответы не будут находиться в диапазоне с низкой задержкой.

Все самое лучшее!

MK

Ответ 3

Из SPARK-3675:

Общим вопросом в списке рассылки является чтение из временных таблиц по JDBC. Хотя мы должны попробовать и поддерживать большую часть этого в SQL, было бы неплохо также запросить общие RDD над JDBC.

И решение (входящее в Spark 1.2.0) действительно должно использовать HiveThriftServer2.startWithContext.

Ответ 4

Общая идея временной таблицы, по крайней мере, из первоначального намерения RDBMS заключается в том, что она имеет очень ограниченную область действия, обычно сеанс пользователя, и выходит за пределы области видимости и очищается при завершении сеанса.

Если вы создаете временную таблицу за один сеанс, то другой сеанс, который подключается через JDBC или ODBC к бережному серверу, не сможет его увидеть, и это по дизайну. Если вам нужна таблица для продолжения работы за пределами сеанса, она не является временной по определению.

Решение, предлагаемое для "enable spark.sql.hive.thriftServer.singleSession, чтобы поделиться ими с вашими SQL-клиентами" работает да, но вроде бы поражает цель иметь многосеансовую среду. Установка одиночного сеанса эффективно заставляет временные таблицы вести себя как постоянные таблицы, за исключением того, что они будут выходить из контекста, если мета-хранилище улей перезагрузится.

Достаточно просто использовать SqlContext для CREATE TABLE или использовать saveAsTable(): https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#saving-to-persistent-tables

EDIT. Похоже, что saveAsTable упоминается в первую очередь в документации по искровому 1.3, но вы можете использовать метод inlineSQL, если вы используете более раннюю версию.

people.write.saveAsTable("people")

Это будет сохраняться в таблице people в вашей базе данных по умолчанию. Лучше сначала создать базу данных и указать ее:

people.write.saveAsTable("databaseName.people")

или со встроенным SQL

sqlContext.sql("CREATE TABLE IF NOT EXISTS people
as SELECT name FROM people WHERE age >= 13 AND age <= 19")

Оба этих метода будут регистрировать постоянную таблицу в метастаре улья. saveAsTable также имеет параметры относительно того, хотите ли вы добавить или перезаписать