Как я могу заставить драйвер Hive JDBC и оболочку Hive взаимодействовать с одной и той же БД?

#java #jdbc #hadoop #hive

#java #jdbc #hadoop #улей

Вопрос:

У меня есть сервер hive, работающий на порту 10000 по умолчанию, запущенный через: hive --service hiveserver затем у меня есть программа Java (учебное пособие!), использующая клиент Hive JDBC, подключенный к нему с помощью:

 Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
  

Запускается учебник, который создает таблицу testhivedrivertable в базе данных по умолчанию и описывает ее. Это работает нормально, и моя служба hive регистрирует кучу вещей.

Затем я пытаюсь подключить оболочку к той же БД, через hive -p 10000 которую я получаю оболочку, однако я не могу видеть таблицу, созданную программой Java (и при этом программа Java не может видеть таблицы, созданные, когда я нахожусь в оболочке). Кроме того, ничего не отображается в консоли, когда я запускаю команды в оболочке hive, поэтому я почти уверен, что разговариваю с другим экземпляром hive.

Как я могу заставить оболочку hive взаимодействовать с той же базой данных, что и драйвер Java JDBC ?!

Комментарии:

1. Если вы перезапустите программу Java, таблица все еще там? Мне интересно, нормально ли завершает транзакции hive ..?

2. @jayunit100 да, при перезапуске программы Java (с удалением кода удаления / создания) таблица все еще существует, плюс она не может видеть таблицу, введенную из командной строки, поэтому я не думаю, что происходят какие-либо транзакции.

Ответ №1:

Вы разговариваете с одним и тем же экземпляром Hive; к сожалению, не с одним и тем же метастором.

Метахранение улья — это база данных, в которой хранятся метаданные о ваших таблицах Hive (например, имя таблицы, имена и типы столбцов, расположение таблицы, используемый обработчик хранилища, количество сегментов в таблице, сортировка столбцов, если таковые имеются, столбцы разделов, если таковые имеются, и т.д.). Когда вы создаете таблицу, это метахранениеобновляется информацией, относящейся к новой таблице, которая запрашивается при выполнении запросов к этой таблице.

Однако одним из важных соображений основателей Hive было упростить его запуск из коробки. Это привело их к решению использовать встроенную базу данных Derby в качестве метахрана по умолчанию. Это не требует настройки, но побочным эффектом является то, что область действия базы данных находится в пределах одного вызова CLI или одного контекста клиента JDBC. Следовательно, метаданные Hive не сохраняются при нескольких вызовах клиента или между клиентами. Это то, что вы наблюдаете.

Вам следует перейти на использование автономного метахрана, который будет сохранять данные на нескольких клиентах Hive. MySQL и PostGres являются популярными вариантами. У Cloudera есть хорошая статья о настройке Hive и MySQL для использования метастора MySQL. Это доступно здесь .

Ответ №2:

Google отправил меня сюда, поэтому я подумал, что могу поделиться своими выводами с другими пользователями Google:

Если вы используете hive2, можно использовать новый клиент beeline. Похоже, он использует jdbc для подключения к серверу и, таким образом, использует одно и то же хранилище метафор.

Например: beeline -u jdbc:hive2://localhost:10000/default