В статье JCG « Объясненные режимы Hadoop — автономный, псевдораспределенный, распределенный » партнер JCG Рахул Патоди объяснил, как настроить Hadoop . В рамках проекта Hadoop было разработано множество инструментов для анализа полуструктурированных данных, но Hive , пожалуй, наиболее интуитивно понятный из них, поскольку он позволяет любому, кто имеет опыт работы с SQL, отправлять задания MapReduce, описанные как запросы SQL. Hive может быть выполнен из интерфейса командной строки, а также запущен в режиме сервера с клиентом Thrift, выступающим в качестве интерфейса JDBC / ODBC, предоставляя доступ к приложениям для анализа данных и создания отчетов.
В этой статье мы настроим Hive Server, создадим таблицу, загрузим ее с данными из текстового файла, а затем создадим Jasper Resport с помощью iReport . Отчет Jasper выполняет запрос SQL на сервере Hive, который затем преобразуется в задание MapReduce, выполняемое Hadoop .
Примечание: я использовал Hadoop версии 0.20.205, Hive версии 0.7.1 и iReport версии 4.5 под управлением OpenSuSE 12.1 Linux с установленным MySQL 5.5.
Предполагая, что вы уже установили Hadoop, загрузите и установите Hive, следуя вики-инструкциям Hive Getting Started . По умолчанию Hive устанавливается в режиме CLI, работающем в автономном режиме Hadoop .
Создание многопользовательского Hive metastore
Установка Hive по умолчанию использует встроенную базу данных derby в качестве метастаза. Metastore — это место, где Hive поддерживает описания данных, к которым мы хотим получить доступ через SQL. Для того чтобы метастроение было доступно многим пользователям одновременно, его необходимо перенести в отдельную базу данных. Вот как установить метасторое хранилище MySQL.
- Скопируйте файл jar драйвера MySQL JDBC в каталог ~ / hive-0.7.1-bin / lib
- Измените следующие свойства в файле hive-default.xml, находящемся в каталоге ~ / hive-0.7.1-bin / conf :
0102030405060708091011121314151617181920212223
<
property
>
<
name
>javax.jdo.option.ConnectionURL</
name
>
<
value
>jdbc:mysql://hyperion/metastore?createDatabaseIfNotExist=true</
value
>
<
description
>JDBC connect string for a JDBC metastore</
description
>
</
property
>
<
property
>
<
name
>javax.jdo.option.ConnectionDriverName</
name
>
<
value
>com.mysql.jdbc.Driver</
value
>
<
description
>Driver class name for a JDBC metastore</
description
>
</
property
>
<
property
>
<
name
>javax.jdo.option.ConnectionUserName</
name
>
<
value
>foo</
value
>
<
description
>Username to connect to the database</
description
>
</
property
>
<
property
>
<
name
>javax.jdo.option.ConnectionPassword</
name
>
<
value
>bar</
value
>
<
description
>Password to connect to the database</
description
>
</
property
>
- Используйте MySQL workbench или утилиту командной строки MySQL для создания схемы с использованием набора символов latin1. Если Hive не найдет схему, он создаст ее самостоятельно, используя набор символов по умолчанию для MySQL. В моем случае это был UTF-8, и это приводило к ошибкам jdbc. Если вы хотите использовать утилиту командной строки, просто введите:
1
mysql> CREATE DATABASE IF NOT EXISTS `metastore` DEFAULT CHARACTER SET latin1 COLLATE latin1_bin;
- Введите Hive в командной строке, чтобы ввести Hive CLI, и введите:
12345
hive> SHOW TABLES;
OK
testlines
Time taken: 3.654 seconds
hive>
Это заполнит вашу вновь созданную схему метастазирования. Если вы видите какие-либо ошибки, проверьте свою конфигурацию hive -default.xml и убедитесь, что схема вашей базы данных названа ‘metastore’ с latin1 как набор символов по умолчанию.
Теперь давайте заполним Hadoop Hive некоторыми данными
Давайте просто создадим два текстовых файла с именами file01 и file02, каждый из которых содержит:
file01 :
Hello World Bye World
Привет всем пока всем
file02 :
Привет Hadoop до свидания Hadoop
Привет всем до свидания всем
Скопируйте эти файлы из вашей локальной файловой системы в HDFS:
1
2
|
$ hadoop fs - mkdir HiveExample $ hadoop fs -copyFromLocal ~ /file * /user/ssake/HiveExample |
Перейдите в Hive CLI и создайте таблицу с именем testlines, которая будет содержать слова каждой строки в массиве строк:
1
|
hive> create table testlines (line array<string>) row format delimited collection items terminated by ' ' ; |
Загрузите текстовые файлы в Hive:
1
2
|
hive> load data inpath "/user/ssake/HiveExample/file01" INTO table testlines; hive> load data inpath "/user/ssake/HiveExample/file02" INTO table testlines; |
Убедитесь, что тестовые строки теперь содержат слова каждой строки:
1
2
3
4
5
6
7
|
hive> select * from testlines; OK [ "Hello" , "World" , "Bye" , "World" ] [ "Hello" , "Everybody" , "Bye" , "Everybody" ] [ "Hello" , "Hadoop" , "Goodbye" , "Hadoop" ] [ "Hello" , "Everybody" , "Goodbye" , "Everybody" ] Time taken: 0.21 seconds |
Теперь, когда у нас есть Hive с данными, мы можем запустить его в качестве сервера с портом 10000, что типично для работы сервера Hive:
1
2
|
$ HIVE_PORT=10000 $ hive --service hiveserver |
С помощью этой настройки можно получить доступ к нашему серверу Hive нескольким клиентам Thrift. Однако, согласно блогу Apache Hive, многопоточные функции Hive не проходят тщательного тестирования, и поэтому для каждого клиента Thrift безопаснее использовать отдельный порт и экземпляр куста.
Создать отчет «количество слов»
iReport 4.5 поддерживает источники данных улья, поэтому давайте использовать его для создания отчета, который будет работать с нашим сервером улья в качестве источника данных:
1. Создайте источник данных, соединяющийся с сервером улья.
2. Используйте мастер отчетов для генерации вашего отчета
3. Введите следующее в поле ввода HiveQL Query:
1
|
select word, count (word) from testlines lateral view explode(line) words as word group by word |
Кратко объясним, что делает вышеуказанный запрос:
Наша исходная таблица, таблица «testlines», имеет один столбец с именем «line», который содержит данные в виде массива строк. Каждый массив строк представляет слова в предложении, найденные в импортированных файлах « file01 » и « file02 ».
Чтобы правильно посчитать вхождения каждого отдельного слова во всех входных файлах, мы должны «взорвать» массивы строк из нашей исходной таблицы в новую, которая должна содержать каждое отдельное слово. Для этого мы используем «боковое представление» в сочетании с «HiveQL» командами explode (), как показано выше.
Выполняя вышеупомянутый запрос HiveQL, мы создаем новую иконическую таблицу с именем «words», в которой есть один столбец с именем «word», содержащий все слова, найденные в каждом массиве строк из нашей таблицы «testlines».
4. Нажмите кнопку…, чтобы выбрать все поля и нажмите «Далее».
5. Когда вы находитесь в представлении конструктора, перейдите на вкладку Предварительный просмотр, чтобы выполнить отчет HiveQL.
И вот наш отчет:
Теперь все готово для создания приложений, которые получают доступ к вашим данным Hadoop, используя знакомый интерфейс JDBC!
Справка: аналитика больших данных с помощью Hive и iReport от нашего партнера W4G Спироса Сакеллариу .