HCatalog - Краткое руководство
Что такое HCatalog?
HCatalog - это инструмент управления хранилищем таблиц для Hadoop. Он предоставляет табличные данные хранилища метаданных Hive другим приложениям Hadoop. Он позволяет пользователям с различными инструментами обработки данных (Pig, MapReduce) легко записывать данные в сетку. Это гарантирует, что пользователям не нужно беспокоиться о том, где и в каком формате хранятся их данные.
HCatalog работает как ключевой компонент Hive и позволяет пользователям хранить свои данные в любом формате и любой структуре.
Почему HCatalog?
Включение правильного инструмента для правильной работы
Экосистема Hadoop содержит различные инструменты для обработки данных, такие как Hive, Pig и MapReduce. Хотя эти инструменты не требуют метаданных, они все равно могут использовать их, когда они есть. Совместное использование хранилища метаданных также позволяет пользователям различных инструментов более легко обмениваться данными. Рабочий процесс, при котором данные загружаются и нормализуются с помощью MapReduce или Pig, а затем анализируются с помощью Hive, очень распространен. Если все эти инструменты совместно используют одно хранилище метаданных, то пользователи каждого инструмента получают немедленный доступ к данным, созданным с помощью другого инструмента. Никаких шагов загрузки или переноса не требуется.
Захват состояний обработки, чтобы разрешить совместное использование
HCatalog может публиковать результаты вашей аналитики. Таким образом, другой программист может получить доступ к вашей аналитической платформе через «REST». Публикуемые вами схемы также могут быть полезны другим специалистам по данным. Другие специалисты по данным используют ваши открытия в качестве исходных данных для следующего открытия.
Интегрируйте Hadoop со всем
Hadoop как среда обработки и хранения данных открывает перед предприятием множество возможностей; однако, чтобы способствовать принятию, он должен работать с существующими инструментами и дополнять их. Hadoop должен использоваться в качестве входных данных для вашей аналитической платформы или интегрироваться с вашими оперативными хранилищами данных и веб-приложениями. Организация должна пользоваться преимуществами Hadoop без необходимости изучать совершенно новый набор инструментов. Службы REST открывают платформу для предприятий со знакомым API и языком, подобным SQL. Системы управления корпоративными данными используют HCatalog для более глубокой интеграции с платформой Hadoop.
Архитектура HCatalog
На следующем рисунке показана общая архитектура HCatalog.
HCatalog поддерживает чтение и запись файлов в любом формате, для которого SerDe(сериализатор-десериализатор) можно написать. По умолчанию HCatalog поддерживает форматы файлов RCFile, CSV, JSON, SequenceFile и ORC. Чтобы использовать настраиваемый формат, вы должны предоставить InputFormat, OutputFormat и SerDe.
HCatalog построен поверх хранилища метаданных Hive и включает DDL Hive. HCatalog предоставляет интерфейсы чтения и записи для Pig и MapReduce и использует интерфейс командной строки Hive для ввода команд определения данных и исследования метаданных.
Все подпроекты Hadoop, такие как Hive, Pig и HBase, поддерживают операционную систему Linux. Следовательно, вам необходимо установить версию Linux в вашей системе. HCatalog объединяется с Hive Installation 26 марта 2013 г. Начиная с версии Hive-0.11.0, HCatalog поставляется с установкой Hive. Поэтому следуйте инструкциям ниже, чтобы установить Hive, который, в свою очередь, автоматически установит HCatalog в вашей системе.
Шаг 1. Проверка установки JAVA
Перед установкой Hive в вашей системе должна быть установлена Java. Вы можете использовать следующую команду, чтобы проверить, установлена ли уже в вашей системе Java:
$ java –version
Если Java уже установлена в вашей системе, вы увидите следующий ответ -
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
Если в вашей системе не установлена Java, вам необходимо выполнить шаги, указанные ниже.
Шаг 2: установка Java
Загрузите Java (JDK <последняя версия> - X64.tar.gz), перейдя по следующей ссылке http://www.oracle.com/
потом jdk-7u71-linux-x64.tar.gz будет загружен в вашу систему.
Обычно загруженный файл Java находится в папке «Загрузки». Проверьте это и извлекитеjdk-7u71-linux-x64.gz файл, используя следующие команды.
$ cd Downloads/
$ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz
Чтобы сделать Java доступной для всех пользователей, вы должны переместить ее в папку «/ usr / local /». Откройте root и введите следующие команды.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Для настройки PATH и JAVA_HOME переменных, добавьте следующие команды в ~/.bashrc файл.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Теперь проверьте установку с помощью команды java -version с терминала, как описано выше.
Шаг 3. Проверка установки Hadoop
Перед установкой Hive необходимо установить Hadoop в вашей системе. Давайте проверим установку Hadoop, используя следующую команду -
$ hadoop version
Если Hadoop уже установлен в вашей системе, вы получите следующий ответ:
Hadoop 2.4.1
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
Если Hadoop не установлен в вашей системе, выполните следующие действия:
Шаг 4: загрузка Hadoop
Загрузите и извлеките Hadoop 2.4.1 из Apache Software Foundation, используя следующие команды.
$ su
password:
# cd /usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit
Шаг 5: установка Hadoop в псевдо-распределенном режиме
Следующие шаги используются для установки Hadoop 2.4.1 в псевдораспределенном режиме.
Настройка Hadoop
Вы можете установить переменные среды Hadoop, добавив следующие команды в ~/.bashrc файл.
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
Теперь примените все изменения к текущей работающей системе.
$ source ~/.bashrc
Конфигурация Hadoop
Вы можете найти все файлы конфигурации Hadoop в папке «$ HADOOP_HOME / etc / hadoop». Вам необходимо внести соответствующие изменения в эти файлы конфигурации в соответствии с вашей инфраструктурой Hadoop.
$ cd $HADOOP_HOME/etc/hadoop
Для разработки программ Hadoop с использованием Java необходимо сбросить переменные среды Java в hadoop-env.sh файл, заменив JAVA_HOME значение с расположением Java в вашей системе.
export JAVA_HOME=/usr/local/jdk1.7.0_71
Ниже приведен список файлов, которые необходимо отредактировать для настройки Hadoop.
core-site.xml
В core-site.xml Файл содержит такую информацию, как номер порта, используемый для экземпляра Hadoop, память, выделенная для файловой системы, ограничение памяти для хранения данных и размер буферов чтения / записи.
Откройте core-site.xml и добавьте следующие свойства между тегами <configuration> и </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
В hdfs-site.xmlФайл содержит такую информацию, как значение данных репликации, путь узла имени и путь узла данных вашей локальной файловой системы. Это означает место, где вы хотите хранить инфраструктуру Hadoop.
Предположим следующие данные.
dfs.replication (data replication value) = 1
(In the following path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
Откройте этот файл и добавьте следующие свойства между тегами <configuration>, </configuration> в этом файле.
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
</property>
</configuration>
Note - В приведенном выше файле все значения свойств определяются пользователем, и вы можете вносить изменения в соответствии с вашей инфраструктурой Hadoop.
пряжа-site.xml
Этот файл используется для настройки пряжи в Hadoop. Откройте файл yarn-site.xml и добавьте следующие свойства между тегами <configuration>, </configuration> в этом файле.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Этот файл используется для указания, какой фреймворк MapReduce мы используем. По умолчанию Hadoop содержит шаблон yarn-site.xml. Прежде всего, вам нужно скопировать файл изmapred-site,xml.template к mapred-site.xml файл, используя следующую команду.
$ cp mapred-site.xml.template mapred-site.xml
Откройте файл mapred-site.xml и добавьте следующие свойства между тегами <configuration>, </configuration> в этом файле.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Шаг 6. Проверка установки Hadoop
Следующие шаги используются для проверки установки Hadoop.
Настройка Namenode
Настройте namenode с помощью команды «hdfs namenode -format» следующим образом:
$ cd ~ $ hdfs namenode -format
Ожидаемый результат выглядит следующим образом -
10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain 1
images with txid >= 0 10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/
Проверка Hadoop DFS
Следующая команда используется для запуска DFS. Выполнение этой команды запустит вашу файловую систему Hadoop.
$ start-dfs.sh
Ожидаемый результат выглядит следующим образом -
10/24/14 21:37:56 Starting namenodes on [localhost]
localhost: starting namenode, logging to
/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-namenode-localhost.out localhost:
starting datanode, logging to
/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
Проверка скрипта пряжи
Следующая команда используется для запуска сценария Yarn. Выполнение этой команды запустит ваши демоны Yarn.
$ start-yarn.sh
Ожидаемый результат выглядит следующим образом -
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.4.1/logs/
yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to
/home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
Доступ к Hadoop в браузере
Номер порта по умолчанию для доступа к Hadoop - 50070. Используйте следующий URL-адрес, чтобы получить услуги Hadoop в своем браузере.
http://localhost:50070/
Проверить все приложения для кластера
Номер порта по умолчанию для доступа ко всем приложениям кластера - 8088. Используйте следующий URL-адрес для посещения этой службы.
http://localhost:8088/
После того, как вы закончите установку Hadoop, перейдите к следующему шагу и установите Hive в своей системе.
Шаг 7: загрузка Hive
В этом руководстве мы используем hive-0.14.0. Вы можете скачать его, перейдя по следующей ссылкеhttp://apache.petsads.us/hive/hive-0.14.0/. Предположим, он загружается на/Downloadsкаталог. Здесь мы загружаем архив Hive с именем «apache-hive-0.14.0-bin.tar.gz”Для этого учебника. Следующая команда используется для проверки загрузки -
$ cd Downloads $ ls
При успешной загрузке вы увидите следующий ответ -
apache-hive-0.14.0-bin.tar.gz
Шаг 8: установка Hive
Следующие шаги необходимы для установки Hive в вашей системе. Предположим, архив Hive загружен на/Downloads каталог.
Извлечение и проверка архива Hive
Следующая команда используется для проверки загрузки и извлечения архива Hive -
$ tar zxvf apache-hive-0.14.0-bin.tar.gz $ ls
При успешной загрузке вы увидите следующий ответ -
apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz
Копирование файлов в каталог / usr / local / hive
Нам нужно скопировать файлы от суперпользователя «su -». Следующие команды используются для копирования файлов из извлеченного каталога в/usr/local/hive»Каталог.
$ su -
passwd:
# cd /home/user/Download
# mv apache-hive-0.14.0-bin /usr/local/hive
# exit
Настройка среды для Hive
Вы можете настроить среду Hive, добавив следующие строки в ~/.bashrc файл -
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.
Следующая команда используется для выполнения файла ~ / .bashrc.
$ source ~/.bashrc
Шаг 9: Настройка Hive
Чтобы настроить Hive с Hadoop, вам необходимо отредактировать hive-env.sh файл, который помещается в $HIVE_HOME/confкаталог. Следующие команды перенаправляют в Hiveconfig папку и скопируйте файл шаблона -
$ cd $HIVE_HOME/conf $ cp hive-env.sh.template hive-env.sh
Отредактируйте hive-env.sh файл, добавив следующую строку -
export HADOOP_HOME=/usr/local/hadoop
На этом установка Hive завершена. Теперь вам потребуется внешний сервер базы данных для настройки Metastore. Мы используем базу данных Apache Derby.
Шаг 10: загрузка и установка Apache Derby
Следуйте инструкциям ниже, чтобы загрузить и установить Apache Derby -
Скачивание Apache Derby
Следующая команда используется для загрузки Apache Derby. Скачивание займет некоторое время.
$ cd ~ $ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz
Следующая команда используется для проверки загрузки -
$ ls
При успешной загрузке вы увидите следующий ответ -
db-derby-10.4.2.0-bin.tar.gz
Извлечение и проверка архива Derby
Следующие команды используются для извлечения и проверки архива Derby:
$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls
При успешной загрузке вы увидите следующий ответ -
db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz
Копирование файлов в каталог / usr / local / derby
Нам нужно скопировать от суперпользователя «su -». Следующие команды используются для копирования файлов из извлеченного каталога в/usr/local/derby каталог -
$ su -
passwd:
# cd /home/user
# mv db-derby-10.4.2.0-bin /usr/local/derby
# exit
Настройка среды для Дерби
Вы можете настроить среду Derby, добавив следующие строки в ~/.bashrc файл -
export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar
Следующая команда используется для выполнения ~/.bashrc file -
$ source ~/.bashrc
Создать каталог для Metastore
Создайте каталог с именем data в каталоге $ DERBY_HOME для хранения данных Metastore.
$ mkdir $DERBY_HOME/data
Установка Derby и настройка среды завершены.
Шаг 11. Настройка хранилища метаданных Hive
Настройка Metastore означает указание Hive, где хранится база данных. Вы можете сделать это, отредактировавhive-site.xml файл, который находится в $HIVE_HOME/confкаталог. Прежде всего, скопируйте файл шаблона, используя следующую команду -
$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
редактировать hive-site.xml и добавьте следующие строки между тегами <configuration> и </configuration> -
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby://localhost:1527/metastore_db;create = true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
Создайте файл с именем jpox.properties и добавьте в него следующие строки -
javax.jdo.PersistenceManagerFactoryClass = org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema = false
org.jpox.validateTables = false
org.jpox.validateColumns = false
org.jpox.validateConstraints = false
org.jpox.storeManagerType = rdbms
org.jpox.autoCreateSchema = true
org.jpox.autoStartMechanismMode = checked
org.jpox.transactionIsolation = read_committed
javax.jdo.option.DetachAllOnCommit = true
javax.jdo.option.NontransactionalRead = true
javax.jdo.option.ConnectionDriverName = org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL = jdbc:derby://hadoop1:1527/metastore_db;create = true
javax.jdo.option.ConnectionUserName = APP
javax.jdo.option.ConnectionPassword = mine
Шаг 12: Проверка установки Hive
Перед запуском Hive вам необходимо создать /tmpпапка и отдельная папка Hive в HDFS. Здесь мы используем/user/hive/warehouseпапка. Вам необходимо установить разрешение на запись для этих вновь созданных папок, как показано ниже -
chmod g+w
Теперь установите их в HDFS перед проверкой Hive. Используйте следующие команды -
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
Следующие команды используются для проверки установки Hive:
$ cd $HIVE_HOME $ bin/hive
При успешной установке Hive вы увидите следующий ответ -
Logging initialized using configuration in
jar:file:/home/hadoop/hive-0.9.0/lib/hive-common-0.9.0.jar!/
hive-log4j.properties Hive history
=/tmp/hadoop/hive_job_log_hadoop_201312121621_1494929084.txt
………………….
hive>
Вы можете выполнить следующую примерную команду, чтобы отобразить все таблицы -
hive> show tables;
OK Time taken: 2.798 seconds
hive>
Шаг 13: проверьте установку HCatalog
Используйте следующую команду, чтобы установить системную переменную HCAT_HOME для HCatalog Home.
export HCAT_HOME = $HiVE_HOME/HCatalog
Используйте следующую команду, чтобы проверить установку HCatalog.
cd $HCAT_HOME/bin
./hcat
Если установка прошла успешно, вы увидите следующий вывод -
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
[ -g "<group>" ] [ -p "<perms>" ]
[ -D"<name> = <value>" ]
-D <property = value> use hadoop value for given property
-e <exec> hcat command given from command line
-f <file> hcat commands in file
-g <group> group for the db/table specified in CREATE statement
-h,--help Print help information
-p <perms> permissions for the db/table specified in CREATE statement
Интерфейс командной строки HCatalog (CLI) можно вызвать из команды $HIVE_HOME/HCatalog/bin/hcat где $ HIVE_HOME - домашний каталог Hive. hcat это команда, используемая для инициализации сервера HCatalog.
Используйте следующую команду для инициализации командной строки HCatalog.
cd $HCAT_HOME/bin
./hcat
Если установка была выполнена правильно, вы получите следующий вывод -
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
[ -g "<group>" ] [ -p "<perms>" ]
[ -D"<name> = <value>" ]
-D <property = value> use hadoop value for given property
-e <exec> hcat command given from command line
-f <file> hcat commands in file
-g <group> group for the db/table specified in CREATE statement
-h,--help Print help information
-p <perms> permissions for the db/table specified in CREATE statement
Интерфейс командной строки HCatalog поддерживает следующие параметры командной строки -
Старший Нет | Вариант | Пример и описание |
---|---|---|
1 | -г | hcat -g mygroup ... В создаваемой таблице должна быть группа «mygroup». |
2 | -п | hcat -p rwxr-xr-x ... Создаваемая таблица должна иметь разрешения на чтение, запись и выполнение. |
3 | -f | hcat -f myscript.HCatalog ... myscript.HCatalog - это файл сценария, содержащий команды DDL для выполнения. |
4 | -e | hcat -e 'create table mytable(a int);' ... Рассмотрите следующую строку как команду DDL и выполните ее. |
5 | -D | hcat -Dkey = value ... Передает пару ключ-значение в HCatalog как системное свойство Java. |
6 | - | hcat Печатает сообщение об использовании. |
Примечание -
В -g и -p опции не являются обязательными.
В свое время либо -e или же -f может быть предоставлен вариант, но не оба одновременно.
Порядок опций не имеет значения; вы можете указывать параметры в любом порядке.
Старший Нет | Команда и описание DDL |
---|---|
1 | CREATE TABLE Создайте таблицу с помощью HCatalog. Если вы создаете таблицу с предложением CLUSTERED BY, вы не сможете писать в нее с помощью Pig или MapReduce. |
2 | ALTER TABLE Поддерживается за исключением параметров REBUILD и CONCATENATE. Его поведение остается таким же, как в Hive. |
3 | DROP TABLE Поддерживается. Поведение такое же, как у Hive (Отбросьте всю таблицу и структуру). |
4 | CREATE/ALTER/DROP VIEW Поддерживается. Поведение такое же, как у Hive. Note - Pig и MapReduce не могут читать и писать в представлениях. |
5 | SHOW TABLES Показать список таблиц. |
6 | SHOW PARTITIONS Отобразить список разделов. |
7 | Create/Drop Index Поддерживаются операции CREATE и DROP FUNCTION, но созданные функции все равно должны быть зарегистрированы в Pig и помещены в CLASSPATH для MapReduce. |
8 | DESCRIBE Поддерживается. Поведение такое же, как у Hive. Опишите структуру. |
Некоторые команды из приведенной выше таблицы объясняются в следующих главах.
В этой главе объясняется, как создать таблицу и как вставить в нее данные. Соглашения о создании таблицы в HCatalog очень похожи на создание таблицы с помощью Hive.
Создать оператор таблицы
Create Table - это оператор, используемый для создания таблицы в хранилище метаданных Hive с помощью HCatalog. Его синтаксис и пример следующие:
Синтаксис
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
пример
Предположим, вам нужно создать таблицу с именем employee с помощью CREATE TABLEзаявление. В следующей таблице перечислены поля и их типы данных вemployee стол -
Старший Нет | Имя поля | Тип данных |
---|---|---|
1 | Ид | int |
2 | имя | Строка |
3 | Зарплата | Плавать |
4 | Обозначение | строка |
Следующие данные определяют поддерживаемые поля, такие как Comment, Поля с форматированием строки, такие как Field terminator, Lines terminator, и Stored File type.
COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
Следующий запрос создает таблицу с именем employee используя приведенные выше данные.
./hcat –e "CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String) \
COMMENT 'Employee details' \
ROW FORMAT DELIMITED \
FIELDS TERMINATED BY ‘\t’ \
LINES TERMINATED BY ‘\n’ \
STORED AS TEXTFILE;"
Если вы добавите опцию IF NOT EXISTS, HCatalog игнорирует оператор, если таблица уже существует.
При успешном создании таблицы вы увидите следующий ответ -
OK
Time taken: 5.905 seconds
Заявление о загрузке данных
Как правило, после создания таблицы в SQL мы можем вставлять данные с помощью оператора Insert. Но в HCatalog мы вставляем данные с помощью оператора LOAD DATA.
При вставке данных в HCatalog лучше использовать LOAD DATA для хранения групповых записей. Есть два способа загрузить данные: один изlocal file system а второй от Hadoop file system.
Синтаксис
Синтаксис для ЗАГРУЗКИ ДАННЫХ следующий:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
- LOCAL - это идентификатор для указания локального пути. Это необязательно.
- OVERWRITE не является обязательным для перезаписи данных в таблице.
- PARTITION не является обязательным.
пример
Вставим в таблицу следующие данные. Это текстовый файл с именемsample.txt в /home/user каталог.
1201 Gopal 45000 Technical manager
1202 Manisha 45000 Proof reader
1203 Masthanvali 40000 Technical writer
1204 Kiran 40000 Hr Admin
1205 Kranthi 30000 Op Admin
Следующий запрос загружает данный текст в таблицу.
./hcat –e "LOAD DATA LOCAL INPATH '/home/user/sample.txt'
OVERWRITE INTO TABLE employee;"
При успешной загрузке вы увидите следующий ответ -
OK
Time taken: 15.905 seconds
В этой главе объясняется, как изменить атрибуты таблицы, такие как изменение имени таблицы, изменение имен столбцов, добавление столбцов и удаление или замена столбцов.
Alter Table Statement
Вы можете использовать оператор ALTER TABLE для изменения таблицы в Hive.
Синтаксис
Оператор принимает любой из следующих синтаксисов в зависимости от того, какие атрибуты мы хотим изменить в таблице.
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
Некоторые из сценариев описаны ниже.
Переименовать в… Заявление
Следующий запрос переименовывает таблицу из employee к emp.
./hcat –e "ALTER TABLE employee RENAME TO emp;"
Заявление об изменении
Следующая таблица содержит поля employee таблица и показывает поля, которые нужно изменить (жирным шрифтом).
Имя поля | Преобразовать из типа данных | Изменить имя поля | Преобразовать в тип данных |
---|---|---|---|
Ид | int | Ид | int |
имя | Строка | эмаль | Строка |
зарплата | Плавать | зарплата | Двойной |
обозначение | Строка | обозначение | Строка |
Следующие запросы переименовывают имя столбца и тип данных столбца, используя указанные выше данные:
./hcat –e "ALTER TABLE employee CHANGE name ename String;"
./hcat –e "ALTER TABLE employee CHANGE salary salary Double;"
Заявление о добавлении столбцов
Следующий запрос добавляет столбец с именем dept к employee стол.
./hcat –e "ALTER TABLE employee ADD COLUMNS (dept STRING COMMENT 'Department name');"
Заменить заявление
Следующий запрос удаляет все столбцы из employee table и заменяет его на emp и name столбцы -
./hcat – e "ALTER TABLE employee REPLACE COLUMNS ( eid INT empid Int, ename STRING name String);"
Оператор Drop Table
В этой главе описывается, как удалить таблицу в HCatalog. Когда вы удаляете таблицу из хранилища метаданных, она удаляет данные таблицы / столбца и их метаданные. Это может быть обычная таблица (хранящаяся в хранилище метаданных) или внешняя таблица (хранимая в локальной файловой системе); HCatalog обращается с обоими одинаковыми способами, независимо от их типа.
Синтаксис следующий -
DROP TABLE [IF EXISTS] table_name;
Следующий запрос удаляет таблицу с именем employee -
./hcat –e "DROP TABLE IF EXISTS employee;"
При успешном выполнении запроса вы увидите следующий ответ -
OK
Time taken: 5.3 seconds
В этой главе описывается, как создать и управлять viewв HCatalog. Представления базы данных создаются с использованиемCREATE VIEWзаявление. Представления могут быть созданы из одной таблицы, нескольких таблиц или другого представления.
Чтобы создать представление, пользователь должен иметь соответствующие системные привилегии в соответствии с конкретной реализацией.
Создать заявление о просмотре
CREATE VIEWсоздает представление с заданным именем. Выдается ошибка, если таблица или представление с таким именем уже существует. Вы можете использоватьIF NOT EXISTS чтобы пропустить ошибку.
Если имена столбцов не указаны, имена столбцов представления будут автоматически получены из defining SELECT expression.
Note - Если SELECT содержит скалярные выражения без псевдонимов, такие как x + y, результирующие имена столбцов представления будут сгенерированы в форме _C0, _C1 и т. Д.
При переименовании столбцов также могут быть предоставлены комментарии к столбцам. Комментарии не наследуются автоматически от нижележащих столбцов.
Оператор CREATE VIEW завершится ошибкой, если представление defining SELECT expression является недействительным.
Синтаксис
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...;
пример
Ниже приведены данные таблицы сотрудников. Теперь давайте посмотрим, как создать представление с именемEmp_Deg_View содержащие поля id, имя, назначение и зарплату сотрудника, имеющего зарплату более 35000.
+------+-------------+--------+-------------------+-------+
| ID | Name | Salary | Designation | Dept |
+------+-------------+--------+-------------------+-------+
| 1201 | Gopal | 45000 | Technical manager | TP |
| 1202 | Manisha | 45000 | Proofreader | PR |
| 1203 | Masthanvali | 30000 | Technical writer | TP |
| 1204 | Kiran | 40000 | Hr Admin | HR |
| 1205 | Kranthi | 30000 | Op Admin | Admin |
+------+-------------+--------+-------------------+-------+
Ниже приводится команда для создания представления на основе указанных выше данных.
./hcat –e "CREATE VIEW Emp_Deg_View (salary COMMENT ' salary more than 35,000')
AS SELECT id, name, salary, designation FROM employee WHERE salary ≥ 35000;"
Вывод
OK
Time taken: 5.3 seconds
Заявление Drop View
DROP VIEW удаляет метаданные для указанного представления. При удалении представления, на которое ссылаются другие представления, предупреждение не выдается (зависимые представления остаются висящими как недопустимые и должны быть отброшены или созданы заново пользователем).
Синтаксис
DROP VIEW [IF EXISTS] view_name;
пример
Следующая команда используется для удаления представления с именем Emp_Deg_View.
DROP VIEW Emp_Deg_View;
Часто вам нужно перечислить все таблицы в базе данных или перечислить все столбцы в таблице. Очевидно, что каждая база данных имеет собственный синтаксис для перечисления таблиц и столбцов.
Show Tablesоператор отображает имена всех таблиц. По умолчанию в нем перечислены таблицы из текущей базы данных или сIN предложение в указанной базе данных.
В этой главе описывается, как вывести список всех таблиц из текущей базы данных в HCatalog.
Показать заявление таблиц
Синтаксис SHOW TABLES следующий:
SHOW TABLES [IN database_name] ['identifier_with_wildcards'];
Следующий запрос отображает список таблиц -
./hcat –e "Show tables;"
При успешном выполнении запроса вы увидите следующий ответ -
OK
emp
employee
Time taken: 5.3 seconds
Раздел - это условие для табличных данных, которое используется для создания отдельной таблицы или представления. SHOW PARTITIONS перечисляет все существующие разделы для данной базовой таблицы. Разделы перечислены в алфавитном порядке. После Hive 0.6 также можно указать части спецификации раздела для фильтрации результирующего списка.
Вы можете использовать команду SHOW PARTITIONS, чтобы увидеть разделы, существующие в определенной таблице. В этой главе описывается, как вывести список разделов конкретной таблицы в HCatalog.
Показать заявление о разделах
Синтаксис следующий -
SHOW PARTITIONS table_name;
Следующий запрос удаляет таблицу с именем employee -
./hcat –e "Show partitions employee;"
При успешном выполнении запроса вы увидите следующий ответ -
OK
Designation = IT
Time taken: 5.3 seconds
Динамическое разделение
HCatalog объединяет таблицы в разделы. Это способ разделения таблицы на связанные части на основе значений разделенных столбцов, таких как дата, город и отдел. Используя разделы, легко запросить часть данных.
Например, таблица с именем Tab1содержит данные сотрудника, такие как идентификатор, имя, отдел и год (т. е. год присоединения). Предположим, вам нужно получить сведения обо всех сотрудниках, присоединившихся к работе в 2012 году. Запрос выполняет поиск необходимой информации по всей таблице. Однако если вы разделите данные о сотрудниках по годам и сохраните их в отдельном файле, это сократит время обработки запроса. В следующем примере показано, как разделить файл и его данные:
Следующий файл содержит employeedata стол.
/ tab1 / usededata / file1
id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Приведенные выше данные разделены на два файла с использованием года.
/ tab1 / usededata / 2012 / файл2
1, gopal, TP, 2012
2, kiran, HR, 2012
/ tab1 / usededata / 2013 / файл3
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Добавление раздела
Мы можем добавить в таблицу разделы, изменив таблицу. Предположим, у нас есть таблица с именемemployee с такими полями, как Id, Name, Salary, Designation, Dept и yoj.
Синтаксис
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)
Следующий запрос используется для добавления раздела в employee стол.
./hcat –e "ALTER TABLE employee ADD PARTITION (year = '2013') location '/2012/part2012';"
Переименование раздела
Вы можете использовать команду RENAME-TO для переименования раздела. Его синтаксис следующий -
./hact –e "ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;"
Следующий запрос используется для переименования раздела -
./hcat –e "ALTER TABLE employee PARTITION (year=’1203’) RENAME TO PARTITION (Yoj='1203');"
Удаление раздела
Синтаксис команды, которая используется для удаления раздела, выглядит следующим образом:
./hcat –e "ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,.
PARTITION partition_spec,...;"
Следующий запрос используется для удаления раздела -
./hcat –e "ALTER TABLE employee DROP [IF EXISTS] PARTITION (year=’1203’);"
Создание индекса
Индекс - это не что иное, как указатель на определенный столбец таблицы. Создание индекса означает создание указателя на определенный столбец таблицы. Его синтаксис следующий -
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name = property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)][
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
пример
Давайте рассмотрим пример, чтобы понять концепцию index. Используйте то же самоеemployee таблицу, которую мы использовали ранее с полями Id, Name, Salary, Designation и Dept. Создайте индекс с именем index_salary на salary столбец employee стол.
Следующий запрос создает индекс -
./hcat –e "CREATE INDEX inedx_salary ON TABLE employee(salary)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';"
Это указатель на salaryстолбец. Если столбец изменен, изменения сохраняются с использованием значения индекса.
Удаление индекса
Для удаления индекса используется следующий синтаксис -
DROP INDEX <index_name> ON <table_name>
Следующий запрос удаляет индекс index_salary -
./hcat –e "DROP INDEX index_salary ON employee;"
HCatalog содержит API передачи данных для параллельного ввода и вывода без использования MapReduce. Этот API использует базовую абстракцию хранилища таблиц и строк для чтения данных из кластера Hadoop и записи в него данных.
API передачи данных содержит в основном три класса; это -
HCatReader - Считывает данные из кластера Hadoop.
HCatWriter - Записывает данные в кластер Hadoop.
DataTransferFactory - Создает экземпляры читателя и писателя.
Этот API подходит для настройки главного-подчиненного узла. Давайте обсудим подробнееHCatReader и HCatWriter.
HCatReader
HCatReader - это внутренний по отношению к HCatalog абстрактный класс, который абстрагирует сложность базовой системы, из которой должны быть получены записи.
С. Нет. | Название и описание метода |
---|---|
1 | Public abstract ReaderContext prepareRead() throws HCatException Это должно быть вызвано на главном узле для получения ReaderContext, который затем должен быть сериализован и отправлен подчиненным узлам. |
2 | Public abstract Iterator <HCatRecorder> read() throws HCaException Это должно вызываться на подчиненных узлах для чтения HCatRecords. |
3 | Public Configuration getConf() Он вернет объект класса конфигурации. |
Класс HCatReader используется для чтения данных из HDFS. Чтение - это двухэтапный процесс, в котором первый шаг выполняется на главном узле внешней системы. Второй шаг выполняется параллельно на нескольких подчиненных узлах.
Чтения выполняются на ReadEntity. Прежде чем вы начнете читать, вам нужно определить ReadEntity, из которого следует читать. Это можно сделать черезReadEntity.Builder. Вы можете указать имя базы данных, имя таблицы, раздел и строку фильтра. Например -
ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build(); 10.
Приведенный выше фрагмент кода определяет объект ReadEntity («сущность»), содержащий таблицу с именем mytbl в базе данных с именем mydb, который можно использовать для чтения всех строк этой таблицы. Обратите внимание, что эта таблица должна существовать в HCatalog до начала этой операции.
После определения ReadEntity вы получаете экземпляр HCatReader, используя ReadEntity и конфигурацию кластера -
HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
Следующим шагом является получение ReaderContext от читателя следующим образом:
ReaderContext cntxt = reader.prepareRead();
HCatWriter
Эта абстракция является внутренней для HCatalog. Это сделано для облегчения записи в HCatalog из внешних систем. Не пытайтесь создать это напрямую. Вместо этого используйте DataTransferFactory.
Sr.No. | Название и описание метода |
---|---|
1 | Public abstract WriterContext prepareRead() throws HCatException Внешняя система должна вызывать этот метод только один раз с главного узла. Он возвращаетWriterContext. Это должно быть сериализовано и отправлено на подчиненные узлы для созданияHCatWriter там. |
2 | Public abstract void write(Iterator<HCatRecord> recordItr) throws HCaException Этот метод следует использовать на подчиненных узлах для выполнения записи. RecordItr - это объект-итератор, содержащий коллекцию записей для записи в HCatalog. |
3 | Public abstract void abort(WriterContext cntxt) throws HCatException Этот метод следует вызывать на главном узле. Основная цель этого метода - очистка в случае сбоев. |
4 | public abstract void commit(WriterContext cntxt) throws HCatException Этот метод следует вызывать на главном узле. Цель этого метода - выполнить фиксацию метаданных. |
Подобно чтению, запись также представляет собой двухэтапный процесс, в котором первый шаг выполняется на главном узле. Впоследствии второй этап выполняется параллельно на подчиненных узлах.
Записи делаются на WriteEntity который может быть построен аналогично чтению -
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();
Приведенный выше код создает объект WriteEntity, entity
который можно использовать для записи в таблицу с именемmytbl в базе данных mydb.
После создания WriteEntity следующим шагом будет получение WriterContext -
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();
Все вышеперечисленные шаги выполняются на главном узле. Затем главный узел сериализует объект WriterContext и делает его доступным для всех ведомых устройств.
На подчиненных узлах вам необходимо получить HCatWriter с помощью WriterContext следующим образом:
HCatWriter writer = DataTransferFactory.getHCatWriter(context);
Затем writerпринимает итератор в качестве аргумента для write
метода -
writer.write(hCatRecordItr);
В writer затем звонит getNext() на этом итераторе в цикле и записывает все записи, прикрепленные к итератору.
В TestReaderWriter.javaфайл используется для тестирования классов HCatreader и HCatWriter. Следующая программа демонстрирует, как использовать HCatReader и HCatWriter API для чтения данных из исходного файла и последующей записи их в целевой файл.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.ql.CommandNeedRetryException;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hive.HCatalog.common.HCatException;
import org.apache.hive.HCatalog.data.transfer.DataTransferFactory;
import org.apache.hive.HCatalog.data.transfer.HCatReader;
import org.apache.hive.HCatalog.data.transfer.HCatWriter;
import org.apache.hive.HCatalog.data.transfer.ReadEntity;
import org.apache.hive.HCatalog.data.transfer.ReaderContext;
import org.apache.hive.HCatalog.data.transfer.WriteEntity;
import org.apache.hive.HCatalog.data.transfer.WriterContext;
import org.apache.hive.HCatalog.mapreduce.HCatBaseTest;
import org.junit.Assert;
import org.junit.Test;
public class TestReaderWriter extends HCatBaseTest {
@Test
public void test() throws MetaException, CommandNeedRetryException,
IOException, ClassNotFoundException {
driver.run("drop table mytbl");
driver.run("create table mytbl (a string, b int)");
Iterator<Entry<String, String>> itr = hiveConf.iterator();
Map<String, String> map = new HashMap<String, String>();
while (itr.hasNext()) {
Entry<String, String> kv = itr.next();
map.put(kv.getKey(), kv.getValue());
}
WriterContext cntxt = runsInMaster(map);
File writeCntxtFile = File.createTempFile("hcat-write", "temp");
writeCntxtFile.deleteOnExit();
// Serialize context.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(writeCntxtFile));
oos.writeObject(cntxt);
oos.flush();
oos.close();
// Now, deserialize it.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(writeCntxtFile));
cntxt = (WriterContext) ois.readObject();
ois.close();
runsInSlave(cntxt);
commit(map, true, cntxt);
ReaderContext readCntxt = runsInMaster(map, false);
File readCntxtFile = File.createTempFile("hcat-read", "temp");
readCntxtFile.deleteOnExit();
oos = new ObjectOutputStream(new FileOutputStream(readCntxtFile));
oos.writeObject(readCntxt);
oos.flush();
oos.close();
ois = new ObjectInputStream(new FileInputStream(readCntxtFile));
readCntxt = (ReaderContext) ois.readObject();
ois.close();
for (int i = 0; i < readCntxt.numSplits(); i++) {
runsInSlave(readCntxt, i);
}
}
private WriterContext runsInMaster(Map<String, String> config) throws HCatException {
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withTable("mytbl").build();
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();
return info;
}
private ReaderContext runsInMaster(Map<String, String> config,
boolean bogus) throws HCatException {
ReadEntity entity = new ReadEntity.Builder().withTable("mytbl").build();
HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
ReaderContext cntxt = reader.prepareRead();
return cntxt;
}
private void runsInSlave(ReaderContext cntxt, int slaveNum) throws HCatException {
HCatReader reader = DataTransferFactory.getHCatReader(cntxt, slaveNum);
Iterator<HCatRecord> itr = reader.read();
int i = 1;
while (itr.hasNext()) {
HCatRecord read = itr.next();
HCatRecord written = getRecord(i++);
// Argh, HCatRecord doesnt implement equals()
Assert.assertTrue("Read: " + read.get(0) + "Written: " + written.get(0),
written.get(0).equals(read.get(0)));
Assert.assertTrue("Read: " + read.get(1) + "Written: " + written.get(1),
written.get(1).equals(read.get(1)));
Assert.assertEquals(2, read.size());
}
//Assert.assertFalse(itr.hasNext());
}
private void runsInSlave(WriterContext context) throws HCatException {
HCatWriter writer = DataTransferFactory.getHCatWriter(context);
writer.write(new HCatRecordItr());
}
private void commit(Map<String, String> config, boolean status,
WriterContext context) throws IOException {
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withTable("mytbl").build();
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
if (status) {
writer.commit(context);
} else {
writer.abort(context);
}
}
private static HCatRecord getRecord(int i) {
List<Object> list = new ArrayList<Object>(2);
list.add("Row #: " + i);
list.add(i);
return new DefaultHCatRecord(list);
}
private static class HCatRecordItr implements Iterator<HCatRecord> {
int i = 0;
@Override
public boolean hasNext() {
return i++ < 100 ? true : false;
}
@Override
public HCatRecord next() {
return getRecord(i);
}
@Override
public void remove() {
throw new RuntimeException();
}
}
}
Вышеупомянутая программа считывает данные из HDFS в виде записей и записывает данные записи в mytable
В HCatInputFormat и HCatOutputFormatинтерфейсы используются для чтения данных из HDFS и после обработки записывают полученные данные в HDFS с помощью задания MapReduce. Разберем интерфейсы форматов ввода и вывода.
HCatInputFormat
В HCatInputFormatиспользуется с заданиями MapReduce для чтения данных из таблиц, управляемых HCatalog. HCatInputFormat предоставляет API-интерфейс MapReduce Hadoop 0.20 для чтения данных, как если бы они были опубликованы в таблице.
Sr.No. | Название и описание метода |
---|---|
1 | public static HCatInputFormat setInput(Job job, String dbName, String tableName)throws IOException Установите входы для использования в работе. Он запрашивает хранилище метаданных с заданной входной спецификацией и сериализует соответствующие разделы в конфигурацию задания для задач MapReduce. |
2 | public static HCatInputFormat setInput(Configuration conf, String dbName, String tableName) throws IOException Установите входы для использования в работе. Он запрашивает хранилище метаданных с заданной входной спецификацией и сериализует соответствующие разделы в конфигурацию задания для задач MapReduce. |
3 | public HCatInputFormat setFilter(String filter)throws IOException Установите фильтр для входной таблицы. |
4 | public HCatInputFormat setProperties(Properties properties) throws IOException Задайте свойства для формата ввода. |
API HCatInputFormat включает следующие методы:
- setInput
- setOutputSchema
- getTableSchema
Использовать HCatInputFormat для чтения данных сначала создайте экземпляр InputJobInfo считывая необходимую информацию из таблицы, а затем позвонить setInput с InputJobInfo.
Вы можете использовать setOutputSchema метод включения projection schema, чтобы указать поля вывода. Если схема не указана, будут возвращены все столбцы в таблице. Вы можете использовать метод getTableSchema, чтобы определить схему таблицы для указанной входной таблицы.
HCatOutputFormat
HCatOutputFormat используется с заданиями MapReduce для записи данных в таблицы, управляемые HCatalog. HCatOutputFormat предоставляет API-интерфейс MapReduce Hadoop 0.20 для записи данных в таблицу. Когда задание MapReduce использует HCatOutputFormat для записи вывода, используется выходной формат по умолчанию, настроенный для таблицы, и новый раздел публикуется в таблице после завершения задания.
Sr.No. | Название и описание метода |
---|---|
1 | public static void setOutput (Configuration conf, Credentials credentials, OutputJobInfo outputJobInfo) throws IOException Задайте информацию о выходе для записи для задания. Он запрашивает сервер метаданных, чтобы найти StorageHandler для использования в таблице. Выдает ошибку, если раздел уже опубликован. |
2 | public static void setSchema (Configuration conf, HCatSchema schema) throws IOException Установите схему для данных, записываемых в раздел. Схема таблицы используется по умолчанию для раздела, если он не вызывается. |
3 | public RecordWriter <WritableComparable<?>, HCatRecord > getRecordWriter (TaskAttemptContext context)throws IOException, InterruptedException Найдите записывающего на работу. Он использует OutputFormat StorageHandler по умолчанию, чтобы получить средство записи. |
4 | public OutputCommitter getOutputCommitter (TaskAttemptContext context) throws IOException, InterruptedException Получите коммиттер вывода для этого формата вывода. Это гарантирует правильность фиксации вывода. |
В HCatOutputFormat API включает следующие методы -
- setOutput
- setSchema
- getTableSchema
Первый вызов HCatOutputFormat должен быть setOutput; любой другой вызов вызовет исключение о том, что выходной формат не инициализирован.
Схема для записываемых данных определяется setSchemaметод. Вы должны вызвать этот метод, предоставив схему данных, которые вы пишете. Если ваши данные имеют ту же схему, что и схема таблицы, вы можете использоватьHCatOutputFormat.getTableSchema() чтобы получить схему таблицы, а затем передать ее в setSchema().
пример
Следующая программа MapReduce считывает данные из одной таблицы, которая, как предполагается, имеет целое число во втором столбце («столбец 1»), и подсчитывает, сколько экземпляров каждого отдельного значения она находит. То есть это эквивалент "select col1, count(*) from $table group by col1;".
Например, если значения во втором столбце равны {1, 1, 1, 3, 3, 5}, то программа выдаст следующий вывод значений и счетчиков:
1, 3
3, 2
5, 1
Давайте теперь посмотрим на программный код -
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.HCatalog.common.HCatConstants;
import org.apache.HCatalog.data.DefaultHCatRecord;
import org.apache.HCatalog.data.HCatRecord;
import org.apache.HCatalog.data.schema.HCatSchema;
import org.apache.HCatalog.mapreduce.HCatInputFormat;
import org.apache.HCatalog.mapreduce.HCatOutputFormat;
import org.apache.HCatalog.mapreduce.InputJobInfo;
import org.apache.HCatalog.mapreduce.OutputJobInfo;
public class GroupByAge extends Configured implements Tool {
public static class Map extends Mapper<WritableComparable,
HCatRecord, IntWritable, IntWritable> {
int age;
@Override
protected void map(
WritableComparable key, HCatRecord value,
org.apache.hadoop.mapreduce.Mapper<WritableComparable,
HCatRecord, IntWritable, IntWritable>.Context context
)throws IOException, InterruptedException {
age = (Integer) value.get(1);
context.write(new IntWritable(age), new IntWritable(1));
}
}
public static class Reduce extends Reducer<IntWritable, IntWritable,
WritableComparable, HCatRecord> {
@Override
protected void reduce(
IntWritable key, java.lang.Iterable<IntWritable> values,
org.apache.hadoop.mapreduce.Reducer<IntWritable, IntWritable,
WritableComparable, HCatRecord>.Context context
)throws IOException ,InterruptedException {
int sum = 0;
Iterator<IntWritable> iter = values.iterator();
while (iter.hasNext()) {
sum++;
iter.next();
}
HCatRecord record = new DefaultHCatRecord(2);
record.set(0, key.get());
record.set(1, sum);
context.write(null, record);
}
}
public int run(String[] args) throws Exception {
Configuration conf = getConf();
args = new GenericOptionsParser(conf, args).getRemainingArgs();
String serverUri = args[0];
String inputTableName = args[1];
String outputTableName = args[2];
String dbName = null;
String principalID = System
.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
if (principalID != null)
conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
Job job = new Job(conf, "GroupByAge");
HCatInputFormat.setInput(job, InputJobInfo.create(dbName, inputTableName, null));
// initialize HCatOutputFormat
job.setInputFormatClass(HCatInputFormat.class);
job.setJarByClass(GroupByAge.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(WritableComparable.class);
job.setOutputValueClass(DefaultHCatRecord.class);
HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, null));
HCatSchema s = HCatOutputFormat.getTableSchema(job);
System.err.println("INFO: output schema explicitly set for writing:" + s);
HCatOutputFormat.setSchema(job, s);
job.setOutputFormatClass(HCatOutputFormat.class);
return (job.waitForCompletion(true) ? 0 : 1);
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new GroupByAge(), args);
System.exit(exitCode);
}
}
Перед компиляцией указанной выше программы вам необходимо загрузить несколько jars и добавьте их в classpathдля этого приложения. Вам необходимо загрузить все jar-файлы Hive и HCatalog (HCatalog-core-0.5.0.jar, hive-metastore-0.10.0.jar, libthrift-0.7.0.jar, hive-exec-0.10.0.jar, libfb303-0.7.0.jar, jdo2-api-2.3-ec.jar, slf4j-api-1.6.1.jar).
Используйте следующие команды, чтобы скопировать эти jar файлы из local к HDFS и добавьте их в classpath.
bin/hadoop fs -copyFromLocal $HCAT_HOME/share/HCatalog/HCatalog-core-0.5.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-metastore-0.10.0.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libthrift-0.7.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-exec-0.10.0.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libfb303-0.7.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/jdo2-api-2.3-ec.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/slf4j-api-1.6.1.jar /tmp
export LIB_JARS=hdfs:///tmp/HCatalog-core-0.5.0.jar,
hdfs:///tmp/hive-metastore-0.10.0.jar,
hdfs:///tmp/libthrift-0.7.0.jar,
hdfs:///tmp/hive-exec-0.10.0.jar,
hdfs:///tmp/libfb303-0.7.0.jar,
hdfs:///tmp/jdo2-api-2.3-ec.jar,
hdfs:///tmp/slf4j-api-1.6.1.jar
Используйте следующую команду для компиляции и выполнения данной программы.
$HADOOP_HOME/bin/hadoop jar GroupByAge tmp/hive
Теперь проверьте выходной каталог (hdfs: user / tmp / hive) на предмет вывода (part_0000, part_0001).
В HCatLoader и HCatStorerAPI-интерфейсы используются со сценариями Pig для чтения и записи данных в таблицы, управляемые HCatalog. Для этих интерфейсов не требуется специальной настройки HCatalog.
Чтобы лучше понять эту главу, лучше иметь некоторые знания о скриптах Apache Pig. Для получения дополнительной информации, пожалуйста, просмотрите наш учебник Apache Pig .
HCatloader
HCatLoader используется со сценариями Pig для чтения данных из таблиц, управляемых HCatalog. Используйте следующий синтаксис для загрузки данных в HDFS с помощью HCatloader.
A = LOAD 'tablename' USING org.apache.HCatalog.pig.HCatLoader();
Вы должны указать имя таблицы в одинарных кавычках: LOAD 'tablename'. Если вы используете базу данных не по умолчанию, вы должны указать свой ввод как 'dbname.tablename'.
Хранилище метаданных Hive позволяет создавать таблицы без указания базы данных. Если вы создали таблицы таким образом, то имя базы данных будет'default' и не требуется при указании таблицы для HCatLoader.
В следующей таблице содержатся важные методы и описание класса HCatloader.
Sr.No. | Название и описание метода |
---|---|
1 | public InputFormat<?,?> getInputFormat()throws IOException Прочтите формат ввода данных загрузки с помощью класса HCatloader. |
2 | public String relativeToAbsolutePath(String location, Path curDir) throws IOException Он возвращает строковый формат Absolute path. |
3 | public void setLocation(String location, Job job) throws IOException Он устанавливает место, где может быть выполнено задание. |
4 | public Tuple getNext() throws IOException Возвращает текущий кортеж (key и value) из петли. |
HCatStorer
HCatStorer используется со сценариями Pig для записи данных в таблицы, управляемые HCatalog. Используйте следующий синтаксис для операции сохранения.
A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...
STORE my_processed_data INTO 'tablename' USING org.apache.HCatalog.pig.HCatStorer();
Вы должны указать имя таблицы в одинарных кавычках: LOAD 'tablename'. И база данных, и таблица должны быть созданы до запуска сценария Pig. Если вы используете базу данных не по умолчанию, вы должны указать свой ввод как'dbname.tablename'.
Хранилище метаданных Hive позволяет создавать таблицы без указания базы данных. Если вы создали таблицы таким образом, то имя базы данных будет'default' и вам не нужно указывать имя базы данных в store заявление.
Для USINGВы можете иметь строковый аргумент, представляющий пары ключ / значение для разделов. Это обязательный аргумент, когда вы пишете в многораздельную таблицу, а столбец раздела не находится в выходном столбце. Значения ключей разделов НЕ должны указываться.
В следующей таблице содержатся важные методы и описание класса HCatStorer.
Sr.No. | Название и описание метода |
---|---|
1 | public OutputFormat getOutputFormat() throws IOException Считайте выходной формат сохраненных данных с помощью класса HCatStorer. |
2 | public void setStoreLocation (String location, Job job) throws IOException Устанавливает место для выполнения этого store применение. |
3 | public void storeSchema (ResourceSchema schema, String arg1, Job job) throws IOException Сохраните схему. |
4 | public void prepareToWrite (RecordWriter writer) throws IOException Это помогает записывать данные в конкретный файл с помощью RecordWriter. |
5 | public void putNext (Tuple tuple) throws IOException Записывает данные кортежа в файл. |
Запуск свиньи с HCatalog
Pig не берет фляги HCatalog автоматически. Чтобы ввести необходимые jar-файлы, вы можете использовать флаг в команде Pig или установить переменные средыPIG_CLASSPATH и PIG_OPTS как описано ниже.
Чтобы ввести соответствующие jar-файлы для работы с HCatalog, просто включите следующий флаг -
pig –useHCatalog <Sample pig scripts file>
Установка CLASSPATH для выполнения
Используйте следующую настройку CLASSPATH для синхронизации HCatalog с Apache Pig.
export HADOOP_HOME = <path_to_hadoop_install>
export HIVE_HOME = <path_to_hive_install>
export HCAT_HOME = <path_to_hcat_install>
export PIG_CLASSPATH = $HCAT_HOME/share/HCatalog/HCatalog-core*.jar:\ $HCAT_HOME/share/HCatalog/HCatalog-pig-adapter*.jar:\
$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\
$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\
$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/conf:$HADOOP_HOME/conf:\ $HIVE_HOME/lib/slf4j-api-*.jar
пример
Предположим, у нас есть файл student_details.txt в HDFS со следующим содержимым.
student_details.txt
001, Rajiv, Reddy, 21, 9848022337, Hyderabad
002, siddarth, Battacharya, 22, 9848022338, Kolkata
003, Rajesh, Khanna, 22, 9848022339, Delhi
004, Preethi, Agarwal, 21, 9848022330, Pune
005, Trupthi, Mohanthy, 23, 9848022336, Bhuwaneshwar
006, Archana, Mishra, 23, 9848022335, Chennai
007, Komal, Nayak, 24, 9848022334, trivendram
008, Bharathi, Nambiayar, 24, 9848022333, Chennai
У нас также есть образец скрипта с названием sample_script.pigв том же каталоге HDFS. Этот файл содержит операторы, выполняющие операции и преобразования наstudent отношение, как показано ниже.
student = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING
PigStorage(',') as (id:int, firstname:chararray, lastname:chararray,
phone:chararray, city:chararray);
student_order = ORDER student BY age DESC;
STORE student_order INTO 'student_order_table' USING org.apache.HCatalog.pig.HCatStorer();
student_limit = LIMIT student_order 4;
Dump student_limit;
Первый оператор скрипта загрузит данные в файл с именем student_details.txt как отношение, названное student.
Второй оператор сценария упорядочит кортежи отношения в порядке убывания в зависимости от возраста и сохранит их как student_order.
Третий оператор хранит обработанные данные student_order приводит к отдельной таблице с именем student_order_table.
Четвертый оператор скрипта сохранит первые четыре кортежа student_order в виде student_limit.
Наконец, пятая инструкция сбросит содержимое отношения student_limit.
Давайте теперь выполним sample_script.pig как показано ниже.
$./pig -useHCatalog hdfs://localhost:9000/pig_data/sample_script.pig
Теперь проверьте выходной каталог (hdfs: user / tmp / hive) на предмет вывода (part_0000, part_0001).