Статьи

Cloudera Impala — быстрые интерактивные запросы с Hadoop

Вступление

Как обсуждалось в предыдущем посте о  Twitter Storm , Hadoop — это пакетно-ориентированное решение, в котором отсутствует поддержка специальных запросов в реальном времени. Многие игроки в Big Data осознали необходимость быстрых интерактивных запросов помимо традиционного подхода Hadooop. Cloudera, один из ключевых поставщиков решений в области больших данных / Hadoop, недавно запустила Cloudera Impala, которая устраняет этот пробел.

Как сообщила команда разработчиков Cloudera в своем блоге, их работа была основана на статье Google Dremel, которая также является основой для  Google BigQuery . Cloudera Impala предоставляет HiveQL-подобный язык запросов для широкого спектра операторов SELECT с предложениями WHERE, GROUP BY, HAVING, с ORDER BY — хотя в настоящее время LIMIT является обязательным для ORDER BY -, объединения (LEFT, RIGTH, FULL, OUTER, INNER) , UNION ALL, внешние таблицы и т. Д. Он также поддерживает арифметические и логические операторы и встроенные функции Hive, такие как COUNT, SUM, LIKE, IN или BETWEEN. Он может обращаться к данным, хранящимся в HDFS, но не использует mapreduce, вместо этого он основан на собственном механизме распределенных запросов.

Текущая версия Impala (Impala 1.0beta) не поддерживает операторы DDL (CREATE, ALTER, DROP TABLE), все функции создания / изменения / удаления таблиц должны выполняться через Hive, а затем обновляться в оболочке Impala.

Cloudera Impala имеет открытый исходный код под лицензией Apache, код можно получить с Github.  Его компоненты написаны на C ++, Java и Python.

Cloudera Impala Архитектура

Cloudera Impala имеет 3 ключевых компонента: импалад, импала-штат-магазин и импала-оболочка.

Оболочка Impala  — это, по сути, короткий сценарий оболочки, который запускает программу python impala-shell.py для выполнения запросов.

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SHELL_HOME=${IMPALA_SHELL_HOME:-${SCRIPT_DIR}}

PYTHONPATH="${SHELL_HOME}/gen-py:${SHELL_HOME}/lib:${PYTHONPATH}" \
  python ${SHELL_HOME}/impala_shell.py "$@"

Impalad  работает на каждой датоде Hadoop и планирует и выполняет запросы, отправленные из impala-shell.

Impala-state-store  хранит информацию (местоположение и статус) обо всех запущенных экземплярах impalad.

Установка Cloudera Impala

На момент написания этой статьи Cloudera Impala требуется 64-битный RHEL / Centos 6.2 или выше. Я проводил тесты на RHEL6.3 (64-битной) на AWS. Вам необходимо установить Cloudera CDH4.1, Hive и Mysql (последний используется для хранения метастафа Hive).

Примечание . Экземпляры AWS t1.micro не подходят для CDH4.1, для которого требуется больше памяти, чем обеспечивает t1.micro.

Cloudera рекомендует использовать Cloudera Manager для установки Impala, но я использовал ручные шаги, просто чтобы убедиться, что у меня есть полное понимание того, что происходит во время установки.

Шаг 1: Установите CDH4.1

Чтобы установить CDH4.1, вам нужно выполнить следующие команды (эти шаги описывают, как установить Hadoop MRv1 — если вы хотите вместо этого использовать YARN, для этого требуется установить другие RPM-файлы MapReduce. Однако Cloudera указал в инструкциях по установке, что они делают пока не считаю, что MapReduce 2.0 (YARN) готова к работе, поэтому я решил придерживаться MRv1 для этих тестов. CDH4.1 MRV1 можно установить как псевдораспределение или как полностью кластерное решение, для тестов мы увидим псевдораспределение:

$ sudo yum --nogpgcheck localinstall cloudera-cdh-4-0.noarch.rpm
$  sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
$sudo yum install hadoop-0.20-conf-pseudo

Это также установит Haddop-0.20-MapReduce (jobtracker, tasktracker) и Hadoop HDFS (namenode, secondnamenode, datanode) в качестве зависимостей.

После установки пакетов вам необходимо выполнить следующую команду, чтобы правильно настроить псевдораспределенный режим Hadoop:

# Format namenode
$ sudo -u hdfs hdfs namenode -format

# Start HDFS daemons
$ for service in /etc/init.d/hadoop-hdfs-*
$ do
$  sudo $service start
$ done

# Create /tmp dir
$ sudo -u hdfs hadoop fs -mkdir /tmp
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp

# Create system dirs
$ sudo -u hdfs hadoop fs -mkdir /var
$ sudo -u hdfs hadoop fs -mkdir /var/lib
$ sudo -u hdfs hadoop fs -mkdir /var/lib/hadoop-hdfs
$ sudo -u hdfs hadoop fs -mkdir /var/lib/hadoop-hdfs/cache
$ sudo -u hdfs hadoop fs -mkdir /var/lib/hadoop-hdfs/cache/mapred
$ sudo -u hdfs hadoop fs -mkdir /var/lib/hadoop-hdfs/cache/mapred/mapred
$ sudo -u hdfs hadoop fs -mkdir /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
$ sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
$ sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred

# Create user dirs
$ sudo -u hdfs hadoop fs -mkdir  /user/istvan
$ sudo -u hdfs hadoop fs -chown istvan /user/istvan

# Start MapReduce
$ for service in /etc/init.d/hadoop-0.20-mapreduce-*
$ do
$  sudo $service start
$ done

Шаг 2: Установите MySQL (используется Hive как metastore)

$ sudo yum install mysql-server

Шаг 3: Установите Hive

$ sudo yum install hive

Шаг 4. Сконфигурируйте Hive для использования MySQL в качестве мета-хранилища
Чтобы настроить Hive и MySQL для совместной работы, необходимо установить соединитель MysQL:

$ curl -L 'http://www.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.22.tar.gz/from/http://mysql.he.net/' | tar xz
$ sudo cp mysql-connector-java-5.1.22/mysql-connector-java-5.1.22-bin.jar /usr/lib/hive/lib/

Затем создайте базу данных Hive metastore

$ mysql -u root -p
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql;

и пользователь улья:

mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> quit;

Чтобы настроить Hive для использования MySQL в качестве локального хранилища метаданных, вам нужно изменить hive-site.xml следующим образом:

  
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://myhost/metastore</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>hive</value>
</property>

<property>
  <name>hive.metastore.local</name>
  <value>true</value>
</property>

Шаг 5: Установите Impala и Impala Shell

$ sudo yum install impala
$ sudo yum install impala-shell

Если вы будете следовать процедуре установки вручную, автоматически не будут создаваться файлы конфигурации Impala. Вам необходимо создать каталог / usr / lib / impala / conf и скопировать в него следующий файл: core-site.xml, hdfs-site.xml, hive-site.xml и log4j.properties.

$ ls -ltr
total 16
-rw-r--r--. 1 root root 2094 Nov  4 16:37 hive-site.xml
-rw-r--r--. 1 root root 2988 Nov  4 16:43 impala-log4j.properties
-rwxr-xr-x. 1 root root 2052 Nov  4 16:58 hdfs-site.xml
-rwxr-xr-x. 1 root root 1701 Nov  9 16:53 core-site.xml

Настроить Импалу

Для поддержки прямого чтения для Impala вам необходимо настроить следующие свойства Hadoop:

ядро-site.xml

<property>
  <name>dfs.client.read.shortcircuit</name>
  <value>true</value>
</property>

<property>
  <name>dfsclient.read.shortcircuit.skip.checksum</name>
  <value>false</value>
</property>

HDFS-site.xml:

<property>
  <name>dfs.datanode.data.dir.perm</name>
  <value>755</value>
</property>

<property>
  <name>dfs.block.local-path-access.user</name>
  <value>impala,mapred,istvan</value>
</property>

Вы также можете включить отслеживание местонахождения данных:

<property>
  <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
  <value>true</value>
</property>

Шаг 6: Запуск демонов Impala
Войдите в систему как пользователь Impala и выполните следующие команды:

$ GVLOG_v=1 nohup /usr/bin/impala-state-store -state_store_port=24000 &
$ GVLOG_v=1 nohup /usr/bin/impalad -state_store_host=localhost -nn=localhost -nn_port=8020 -hostname=localhost -ipaddress=127.0.0.1 &

Выполнять запросы Impala

Чтобы запускать интерактивные запросы Impala из оболочки impala, нам нужно создавать таблицы с помощью Hive (помните, текущая бета-версия Impala не поддерживает DDL). В этом примере я использовал Google stockprices (полученный с http://finance.yahoo.com в формате csv):

hive> CREATE EXTERNAL TABLE stockprice
    > (yyyymmdd STRING, open_price FLOAT, high_price FLOAT, low_price FLOAT,
    >  close_price FLOAT, stock_volume INT, adjclose_price FLOAT)
    >  ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ','
    > LINES TERMINATED BY '\n'
    > LOCATION '/user/istvan/input/';
OK
Time taken: 14.499 seconds
hive> show tables;
OK
stockprice
Time taken: 16.04 seconds
hive> DESCRIBE stockprice;
OK
yyyymmdd        string
open_price      float
high_price      float
low_price       float
close_price     float
stock_volume    int
adjclose_price  float
Time taken: 0.583 seconds

Аналогичную таблицу — на этот раз не внешнюю — можно также создать и загрузить из улья:

hive> CREATE TABLE imp_test
    > (yyyymmdd STRING, open_price FLOAT, high_price FLOAT, low_price FLOAT,
    > close_price FLOAT, stock_volume INT, adjclose_price FLOAT)
    > ;
OK
Time taken: 0.542 seconds
hive> LOAD DATA LOCAL INPATH '/home/istvan/goog_stock.csv' OVERWRITE INTO TABLE imp_test;
Copying data from file:/home/istvan/goog_stock.csv
Copying file: file:/home/istvan/goog_stock.csv
Loading data to table default.imp_test
rmr: DEPRECATED: Please use 'rm -r' instead.
Deleted /user/hive/warehouse/imp_test
O
Time taken: 1.903 seconds

Затем вы можете выполнить запрос Hive, чтобы получить 5 самых высоких цен. Как видите, Hive запустит задание MapReduce изнутри:

hive> select * from stockprice order by high_price desc;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201211110837_0006, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201211110837_0006
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201211110837_0006
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2012-11-11 13:16:30,895 Stage-1 map = 0%,  reduce = 0%
2012-11-11 13:16:46,554 Stage-1 map = 100%,  reduce = 0%
2012-11-11 13:17:05,918 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.2 sec
2012-11-11 13:17:07,061 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.2 sec
2012-11-11 13:17:08,243 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.2 sec
....
2012-11-11 13:17:17,274 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.2 sec
2012-11-11 13:17:18,334 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.2 sec
MapReduce Total cumulative CPU time: 6 seconds 200 msec
Ended Job = job_201211110837_0006
MapReduce Jobs Launched: 
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 6.2 sec   HDFS Read: 0 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 200 msec
OK
05/10/2012770.71774.38765.01767.652735900767.65
04/10/2012762.75769.89759.4768.052454200768.05
02/10/2012765.2765.99750.27756.992790200756.99
01/10/2012759.05765.0756.21761.783168000761.78
25/09/2012753.05764.89747.66749.166058500749.16
03/10/2012755.72763.92752.2762.52208300762.5
08/10/2012761.0763.58754.15757.841958600757.84
27/09/2012759.95762.84751.65756.53931100756.5
09/10/2012759.67761.32742.53744.093003200744.09
26/09/2012749.85761.24741.0753.465672900753.46
...
Time taken: 82.09 seconds

Выполнение того же запроса из impala-shell выполняется значительно быстрее. Cloudera утверждают, что это может быть выполнено на порядок или даже быстрее, в зависимости от запроса. Из своего опыта я могу подтвердить, что impala-shell возвращал результат в среднем за одну секунду по сравнению с версией Hive, которая занимала примерно 82 секунды.

hive> [istvan@ip-10-227-137-76 ~]$ impala-shell
Welcome to the Impala shell. Press TAB twice to see a list of available commands.

Copyright (c) 2012 Cloudera, Inc. All rights reserved.
(Build version: Impala v0.1 (1fafe67) built on Mon Oct 22 13:06:45 PDT 2012)
[Not connected] > connect localhost:21000
[localhost:21000] > select * from stockprice order by high_price desc limit 20000;
05/10/2012770.7100219726562774.3800048828125765.010009765625767.65002441406252735900767.6500244140625
04/10/2012762.75769.8900146484375759.4000244140625768.04998779296882454200768.0499877929688
02/10/2012765.2000122070312765.989990234375750.27001953125756.9899902343752790200756.989990234375
01/10/2012759.0499877929688765756.2100219726562761.7800292968753168000761.780029296875
25/09/2012753.0499877929688764.8900146484375747.6599731445312749.15997314453126058500749.1599731445312
03/10/2012755.719970703125763.9199829101562752.2000122070312762.52208300762.5
08/10/2012761763.5800170898438754.1500244140625757.84002685546881958600757.8400268554688
27/09/2012759.9500122070312762.8400268554688751.6500244140625756.53931100756.5
09/10/2012759.6699829101562761.3200073242188742.530029296875744.09002685546883003200744.0900268554688
26/09/2012749.8499755859375761.239990234375741753.46002197265625672900753.4600219726562
18/10/2012755.5399780273438759.419982910156267669512430200695
...

Если вы используете команды DDL из Hive (например, создать таблицу), вам нужно запустить команду refresh в impala-shell, чтобы отразить изменения .:

[localhost:21000] > refresh
Successfully refreshed catalog
[localhost:21000] > describe stockprice
yyyymmdd        string
open_price      float
high_price      float
low_price       float
close_price     float
stock_volume    int
adjclose_price  float
[localhost:21000] > show tables;
imp_test
stockprice
[localhost:21000] >

Вывод

В мире больших данных предпринимается все больше усилий для поддержки специальных, быстрых запросов и обработки данных в реальном времени для больших наборов данных. Cloudera Impala — это, безусловно, увлекательное решение, использующее ту же концепцию, что и Google BigQuery, но обещающее поддержку более широкого диапазона форматов ввода и сделав его доступным в качестве технологии с открытым исходным кодом, оно может привлечь внешних разработчиков для улучшения программного обеспечения и перехода к следующему этап.

Если вы хотите узнать больше о Clodera Impala, вот  бесплатный курс  для начала.