Вступление
Как обсуждалось в предыдущем посте о 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, вот бесплатный курс для начала.