
# 快速开发Hive HCatalog应用
Hive是一个开源的，建立在Hadoop上的数据仓库框架，提供类似SQL的HQL语言操作结构化数据，其基本原理是将HQL语言自动转换成Mapreduce任务或Spark任务，从而完成对Hadoop集群中存储的海量数据进行查询和分析。
Hive主要特点如下：
- 通过HQL语言非常容易地完成数据提取、转换和加载（ETL）。
- 通过HQL完成海量结构化数据分析。
- 灵活的数据存储格式，支持JSON、CSV、TEXTFILE、RCFILE、ORCFILE、SEQUENCEFILE等存储格式，并支持自定义扩展。
- 多种客户端连接方式，支持JDBC接口。
Hive的主要应用于海量数据的离线分析（如日志分析，集群状态分析）、大规模的数据挖掘（用户行为分析，兴趣分区，区域展示）等场景下。
MRS对外提供了基于Hive组件的应用开发样例工程，本实践用于指导您创建MRS集群后，获取并导入样例工程并在本地进行编译调测，用于实现MRS集群中的Hive表的创建、数据插入、读取等操作。
#### 创建MRS Hive集群
1. 购买一个包含有Hive组件的MRS集群，详情请参见[购买自定义集群](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0513.html)。
   ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   本文以购买的MRS 3.1.5版本的集群为例，组件包含Hadoop、Hive组件，集群开启Kerberos认证。
   
2. 单击"立即购买"，等待MRS集群创建成功。
 
#### 准备应用开发配置文件
1. 集群创建成功后，登录FusionInsight Manager创建用于创建Hive数据表及提交HCatalog程序的集群用户。 
   选择"系统 \> 权限 \> 用户 \> 添加用户"，在新增用户界面创建一个机机用户，例如**hiveuser**。
   "用户组"需加入"hive"、"supergroup"用户组。
   
   
2. 下载并安装集群客户端，用于运行HCatalog程序，例如安装目录为"/opt/client"。
 
#### 获取样例工程
1. 通过开源镜像站获取样例工程。 
   下载样例工程的Maven工程源码和配置文件，并在本地配置好相关开发工具，可参考[通过开源镜像站获取样例工程](https://support.huaweicloud.com/devg3-mrs/mrs_07_010002.html)。
   根据集群版本选择对应的分支，下载并获取MRS相关样例工程。
   例如本章节场景对应示例为"hcatalog-example"样例，获取地址：<https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.5/src/hive-examples/hcatalog-example>。
   
   
2. 本地使用IDEA工具导入样例工程，等待Maven工程下载相关依赖包，具体操作可参考[配置并导入样例工程](https://support.huaweicloud.com/devg3-mrs/mrs_07_110008.html)。
   
   图1Hive HCatalog样例工程示例   
   ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001551235514.png)
   本地配置好Maven及SDK相关参数后，样例工程会自动加载相关依赖包。
   
   
 
#### 编译并运行程序
1. 编译HCatalog样例程序： 
   1. 在IDEA Maven工具窗口，选择clean生命周期，执行Maven构建过程。
   
   2. 选择package生命周期，执行Maven构建过程。
      图2打包样例程序   
      ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001551246270.png)
      当输出"BUILD SUCCESS"，表示编译成功。
      编译成功后将会在样例工程的"target"目录下生成jar包"hcatalog-example-*XXX*.jar"。
      ```
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time:  03:30 min
      [INFO] Finished at: 2023-05-17T20:22:44+08:00
      [INFO] ------------------------------------------------------------------------
      ```
      
   
   
   
   
2. 登录Hive Beeline命令行，创建用于HCatalog程序分析的源表及数据表。 
   **source /opt/client/bigdata_env**
   **kinit** **hiveuser**
   **beeline**
   **create table t1(col1 int);**
   **create table t2(col1 int,col2 int);**
   向源数据表t1中插入测试数据：
   **insert into table t1** **select 1** **union all** **select 1** **union all** **select 2** **union all** **select 2** **union all** **select 3** **;**
   **select \* from t1;**
   ```
   +----------+
   | t1.col1  |
   +----------+
   | 1        |
   | 1        |
   | 2        |
   | 2        |
   | 3        |
   +----------+
   ```
   
   
3. 将导出的jar包上传至集群客户端所在的Linux节点指定路径，例如"/opt/hive_demo"。
4. 为方便后续操作，将样例程序目录、客户端组件目录等配置为公共变量。 
   退出Beeline命令行，执行以下命令：
   **export HCAT_CLIENT=/opt/hive_demo**
   **export HADOOP_HOME=/opt/client/HDFS/hadoop**
   **export HIVE_HOME=/opt/client/Hive/Beeline**
   **export HCAT_HOME=$HIVE_HOME/../HCatalog**
   **export LIB_JARS=$HCAT_HOME/lib/hive-hcatalog-core-** *XXX* **.jar,$HCAT_HOME/lib/hive-metastore-** *XXX* **.jar,$HCAT_HOME/lib/hive-standalone-metastore-** *XXX* **.jar,$HIVE_HOME/lib/hive-exec-*XXX*.jar,$HCAT_HOME/lib/libfb303-** *XXX* **.jar,$HCAT_HOME/lib/slf4j-api-** *XXX* **.jar,$HCAT_HOME/lib/jdo-api-** *XXX* **.jar,$HCAT_HOME/lib/antlr-runtime-** *XXX* **.jar,$HCAT_HOME/lib/datanucleus-api-jdo-** *XXX* **.jar,$HCAT_HOME/lib/datanucleus-core-** *XXX* **.jar,$HCAT_HOME/lib/datanucleus-rdbms-fi-** *XXX* **.jar,$HCAT_HOME/lib/log4j-api-** *XXX* **.jar,$HCAT_HOME/lib/log4j-core-** *XXX* **.jar,$HIVE_HOME/lib/commons-lang-** *XXX* **.jar,$HIVE_HOME/lib/hive-exec-** *XXX* **.jar**
   **export HADOOP_CLASSPATH=$HCAT_HOME/lib/hive-hcatalog-core-** *XXX* **.jar:$HCAT_HOME/lib/hive-metastore-** *XXX* **.jar:$HCAT_HOME/lib/hive-standalone-metastore-** *XXX* **.jar:$HIVE_HOME/lib/hive-exec-** *XXX* **.jar:$HCAT_HOME/lib/libfb303-** *XXX* **.jar:$HADOOP_HOME/etc/hadoop:$HCAT_HOME/conf:$HCAT_HOME/lib/slf4j-api-** *XXX* **.jar:$HCAT_HOME/lib/jdo-api-** *XXX* **.jar:$HCAT_HOME/lib/antlr-runtime-** *XXX* **.jar:$HCAT_HOME/lib/datanucleus-api-jdo-** *XXX* **.jar:$HCAT_HOME/lib/datanucleus-core-** *XXX* **.** **jar:$HCAT_HOME/lib/datanucleus-rdbms-fi-** *XXX* **.jar:$HCAT_HOME/lib/log4j-api-** *XXX* **.jar:$HCAT_HOME/lib/log4j-core-** *XXX* **.jar:$HIVE_HOME/lib/commons-lang-** *XXX* **.jar:$HIVE_HOME/lib/hive-exec-** *XXX* **.jar**
   ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   LIB_JARS和HADOOP_CLASSPATH中指定的jar包的版本号"*XXX*"需要根据实际环境的版本号进行修改。
   
   
5. 使用Yarn客户端提交任务。 
   **yarn --config $HADOOP_HOME/etc/hadoop jar** **$HCAT_CLIENT/hcatalog-example-** *XXX* **.jar com.huawei.bigdata.HCatalogExample -libjars $LIB_JARS t1 t2**
   ```
   ...
   2023-05-18 20:05:56,691 INFO mapreduce.Job: The url to track the job: https://host-192-168-64-122:26001/proxy/application_1683438782910_0008/
   2023-05-18 20:05:56,692 INFO mapreduce.Job: Running job: job_1683438782910_0008
   2023-05-18 20:06:07,250 INFO mapreduce.Job: Job job_1683438782910_0008 running in uber mode : false
   2023-05-18 20:06:07,253 INFO mapreduce.Job:  map 0% reduce 0%
   2023-05-18 20:06:15,362 INFO mapreduce.Job:  map 25% reduce 0%
   2023-05-18 20:06:16,386 INFO mapreduce.Job:  map 50% reduce 0%
   2023-05-18 20:06:35,999 INFO mapreduce.Job:  map 100% reduce 0%
   2023-05-18 20:06:42,048 INFO mapreduce.Job:  map 100% reduce 100%
   2023-05-18 20:06:43,136 INFO mapreduce.Job: Job job_1683438782910_0008 completed successfully
   2023-05-18 20:06:44,118 INFO mapreduce.Job: Counters: 54
   ...
   ```
   
   
6. 作业任务运行完成后，进入Hive Beeline命令行，查询t2表数据内容，查看数据分析结果。 
   **select \* from t2;**
   ```
   +----------+----------+
   | t2.col1  | t2.col2  |
   +----------+----------+
   | 1        | 2        |
   | 2        | 2        |
   | 3        | 1        |
   +----------+----------+
   ```
   
   
 
