Статьи

Аналитика больших данных с Hive и iReport

Каждый эпизод сериала «Персонаж», представляющий интерес для Джей Джей Абрамса, начинается со следующего повествования мистера Финча, одного из ведущих персонажей: « Вас смотрят. У правительства есть секретная система — машина, которая шпионит за вами каждый час каждого дня. Я знаю, потому что … Я построил это. «Конечно, нам, техническим специалистам, лучше знать. Чтобы создать такую ​​высокопроизводительную машину, понадобилась бы огромная команда инженеров-электриков и программистов, и бюджет был бы невообразим… или не будет? Подождите секунду у нас есть Hadoop ! Теперь каждый из нас может быть мистером Финчем за скромный бюджет благодаря Hadoop .

В статье 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.

  1. Скопируйте файл jar драйвера MySQL JDBC в каталог ~ / hive-0.7.1-bin / lib
  2. Измените следующие свойства в файле hive-default.xml, находящемся в каталоге ~ / hive-0.7.1-bin / conf :
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <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>
  3. Используйте MySQL workbench или утилиту командной строки MySQL для создания схемы с использованием набора символов latin1. Если Hive не найдет схему, он создаст ее самостоятельно, используя набор символов по умолчанию для MySQL. В моем случае это был UTF-8, и это приводило к ошибкам jdbc. Если вы хотите использовать утилиту командной строки, просто введите:
    1
    mysql> CREATE DATABASE  IF NOT EXISTS `metastore` DEFAULT CHARACTER SET latin1 COLLATE latin1_bin;
  4. Введите Hive в командной строке, чтобы ввести Hive CLI, и введите:
    1
    2
    3
    4
    5
    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 Спироса Сакеллариу .