
# 使用Hive加载HDFS数据并分析图书评分情况
#### 应用场景
MRS离线处理集群，可对海量数据进行分析和处理，形成结果数据，供下一步数据应用使用。
离线处理对处理时间要求不高，但是所处理数据量较大，占用计算存储资源较多，通常通过Hive/SparkSQL引擎或者MapReduce/Spark2x实现。
本实践基于华为云MapReduce服务，用于指导您创建MRS集群后，使用Hive对原始数据进行导入、分析等操作，展示了如何构建弹性、低成本的离线大数据分析。
#### 方案架构
Hive是建立在Hadoop上的数据仓库框架，提供大数据平台批处理计算能力，能够对结构化/半结构化数据进行批量分析汇总完成数据计算。提供类似SQL的Hive Query Language语言操作结构化数据，其基本原理是将HQL语言自动转换成MapReduce任务，从而完成对Hadoop集群中存储的海量数据进行查询和分析。
Hive主要特点如下：
- 海量结构化数据分析汇总。
- 将复杂的MapReduce编写任务简化为SQL语句。
- 灵活的数据存储格式，支持JSON、CSV、TEXTFILE、RCFILE、SEQUENCEFILE、ORC等存储格式。
Hive作为一个基于HDFS和MapReduce架构的数据仓库，其主要能力是通过对HQL（Hive Query Language）编译和解析，生成并执行相应的MapReduce任务或者HDFS操作。
图1Hive结构   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002009390693.png "点击放大")
- **Metastore**：对表，列和Partition等的元数据进行读写及更新操作，其下层为关系型数据库。
- **Driver**：管理HQL执行的生命周期并贯穿Hive任务整个执行期间。
- **Compiler**：编译HQL并将其转化为一系列相互依赖的Map/Reduce任务。
- **Optimizer**：优化器，分为逻辑优化器和物理优化器，分别对HQL生成的执行计划和MapReduce任务进行优化。
- **Executor**：按照任务的依赖关系分别执行Map/Reduce任务。
- **ThriftServer**：提供thrift接口，作为JDBC的服务端，并将Hive和其他应用程序集成起来。
- **Clients**：包含WebUI和JDBC接口，为用户访问提供接口。
 
#### 操作流程
本实践以某图书网站后台用户的点评数据为原始数据，导入Hive表后通过SQL命令筛选出最受欢迎的图书。
基本操作流程如下所示：
1. [步骤1：创建MRS离线查询集群]
2. [步骤2：将本地数据导入到HDFS中]
3. [步骤3：创建Hive表]
4. [步骤4：将原始数据导入Hive并进行分析]
 
 #### 步骤1：创建MRS离线查询集群
1. 进入[购买MRS集群页面](https://console.huaweicloud.com/mrs/?#/clusterCreate/quick)。
2. 选择"快速购买"，填写软件配置参数，以"按需计费"为例。 
   表1软件配置（以下参数仅供参考，可根据实际情况调整） 
   | 参数名称       | 参数说明                                                                              | 取值样例                                    |
   |:---|:---|:---|
   | 计费模式       | 选择待创建的MRS集群的计费模式。                                                                 | 按需计费                                    |
   | 区域         | 选择区域。 不同区域的云服务产品之间内网互不相通。请就近选择靠近您业务的区域，可减少网络时延，提高访问速度。 | 华北-北京四                                  |
   | 集群名称       | 待创建的MRS集群名称。                                                                      | MRS_demo                                |
   | 集群类型       | 待创建的MRS集群类型。                                                                      | 选择"自定义"                                 |
   | 版本类型       | 待创建的MRS集群版本类型。                                                                    | 普通版                                     |
   | 集群版本       | 待创建的MRS集群版本。                                                                      | MRS 3.1.0                               |
   | 组件选择       | 选择待创建的MRS集群配套的组件。                                                                 | Hadoop分析集群                              |
   | 可用区        | 选择集群工作区域下关联的可用区。                                                                  | 可用区1                                    |
   | 虚拟私有云      | 选择需要创建集群的VPC，单击"查看虚拟私有云"进入VPC服务查看已创建的VPC名称和ID。如果没有VPC，需要创建一个新的VPC。                | vpc-01                                  |
   | 子网         | 选择需要创建集群的子网，可进入VPC服务查看VPC下已创建的子网名称和ID。如果VPC下未创建子网，请单击"创建子网"进行创建。                  | subnet-01                               |
   | 集群节点       | 配置集群节点信息。                                                                         | 保持默认值。                                  |
   | Kerberos认证 | 登录Manager管理页面时是否启用Kerberos认证。                                                     | 不开启                                     |
   | 用户名        | Manager管理员用户，目前默认为admin用户。                                                        | admin/root                              |
   | 密码         | 配置Manager管理员用户的密码。                                                                | 设置密码登录集群管理页面及ECS节点用户的密码，例如：Test!@12345。 |
   | 确认密码       | 再次输入Manager管理员用户的密码。                                                              | 再次输入设置用户密码                              |
   | 企业项目       | 选择集群所属的企业项目。                                                                      | default                                 |
   | 通信安全授权     | 若不开启通信安全授权，MRS将无法创建集群。                                                            | 勾选授权                                    |
      
   
   
3. 单击"立即购买"，等待MRS集群创建成功。
 
 #### 步骤2：将本地数据导入到HDFS中
1. 在本地已获取某图书网站后台图书点评记录的原始数据文件"book_score.txt"，例如内容如下。 
   字段信息依次为：用户ID、图书ID、图书评分、备注信息。
   例如部分数据节选如下：
   ```
   202001,242,3,Good!
   202002,302,3,Test.
   202003,377,1,Bad!
   220204,51,2,Bad!
   202005,346,1,aaa
   202006,474,4,None
   202007,265,2,Bad!
   202008,465,5,Good!
   202009,451,3,Bad!
   202010,86,3,Bad!
   202011,257,2,Bad!
   202012,465,4,Good!
   202013,465,4,Good!
   202014,465,4,Good!
   202015,302,5,Good!
   202016,302,3,Good!
   ...
   ```
   
   
2. 登录对象存储服务OBS控制台，单击"并行文件系统 \> 创建并行文件系统"，填写以下参数，单击"立即创建"。 
   表2并行文件系统参数 
   | 参数名称     | 参数说明                                                                                                                                                                                                                       | 取值样例     |
   |:---|:---|:---|
   | 区域       | 桶所属区域。                                                                                                                                                                                                                     | 华北-北京四   |
   | 数据冗余存储策略 | - 多AZ存储：数据冗余存储至多个可用区（AZ），可靠性更高。  - 单AZ存储：数据仅存储在单个可用区（AZ），成本更低。   | 单AZ存储    |
   | 文件系统名称   | 文件系统的名称，需全局唯一，不能与已有的任何文件系统名称重复。                                                                                                                                                                                            | mrs-hive |
   | 策略       | 文件系统的读写权限控制。                                                                                                                                                                                                               | 私有       |
   | 归档数据直读   | 通过归档数据直读，您可以直接下载存储类别为归档存储的对象，而无需提前恢复。                                                                                                                                                                                      | 关闭       |
   | 企业项目     | 将桶加入到企业项目中统一管理。                                                                                                                                                                                                            | default  |
   | 标签       | 可选。标签用于标识OBS中的桶，以此达到对OBS中的桶进行分类的目的。                                                                                                                                                                                        | -        |
      
   等待文件系统创建好，单击文件系统名称，选择"文件 \> 上传文件"，将数据文件上传至OBS并行文件系统内。
   
   
3. 切换回MRS控制台，单击创建好的MRS集群名称，进入"概览"，单击"IAM用户同步"所在行的"同步"，等待约5分钟同步完成。 
   图2同步IAM用户   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000001423257572.png "点击放大")
   
   
4. 将数据文件上传HDFS。 
   1. 在"文件管理"页签，选择"HDFS文件列表"，进入数据存储目录，如"/tmp/test"。 "/tmp/test"目录仅为示例，可以是界面上的任何目录，也可以通过"新建"创建新的文件夹。
      
   
   2. 单击"导入数据"。
      - OBS路径：选择上面创建好的OBS并行文件系统名，找到"book_score.txt"文件，勾选"我确认所选脚本安全，了解可能存在的风险，并接受对集群可能造成的异常或影响。"，单击"确定"。
      
      - HDFS路径：选择"/tmp/test"，单击"确定"。
      
      
      图3从OBS导入数据到HDFS   
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002149530068.png) 
   
   3. 单击"确定"，等待数据导入成功，此时数据文件已上传至MRS集群的HDFS文件系统内。
   
   
   
   
 
 #### 步骤3：创建Hive表
1. 下载并安装集群全量客户端，例如在主Master节点上安装，客户端安装目录为"/opt/client"，相关操作可参考[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_24212.html)。
   
   也可直接使用Master节点中自带的集群客户端，安装目录为"/opt/Bigdata/client"。
   
   
2. 为主Master节点绑定一个弹性IP并在安全组中放通22端口，具体请参考[配置集群安全组规则](https://support.huaweicloud.com/mrs_faq/mrs_03_1234.html)，然后使用**root** 用户登录主Master节点，进入客户端所在目录并加载变量。
   
   **cd /opt/client**
   **source bigdata_env**
   
   
3. 执行**beeline -n 'hdfs'** 命令进入Hive Beeline命令行界面。
   
   执行以下命令创建一个与原始数据字段匹配的Hive表：
   **create table bookscore (userid int,bookid int,score int,remarks string) row format delimited fields terminated by ','stored as textfile;**
   
   
4. 查看表是否创建成功： 
   **show tables;**
   ```
   +------------+
   |  tab_name  |
   +------------+
   | bookscore  |
   +------------+
   ```
   
   
 
 #### 步骤4：将原始数据导入Hive并进行分析
1. 继续在Hive Beeline命令行中执行以下命令，将已导入HDFS的原始数据导入Hive表中。 
   **load data inpath '/tmp/test/book_score.txt' into table bookscore;**
   
   
2. 数据导入完成后，执行如下命令，查看Hive表内容。 
   **select \* from bookscore;**
   ```
   +-------------------+-------------------+------------------+--------------------+
   | bookscore.userid  | bookscore.bookid  | bookscore.score  | bookscore.remarks  |
   +-------------------+-------------------+------------------+--------------------+
   | 202001            | 242               | 3                | Good!              |
   | 202002            | 302               | 3                | Test.              |
   | 202003            | 377               | 1                | Bad!               |
   | 220204            | 51                | 2                | Bad!               |
   | 202005            | 346               | 1                | aaa                |
   | 202006            | 474               | 4                | None               |
   | 202007            | 265               | 2                | Bad!               |
   | 202008            | 465               | 5                | Good!              |
   | 202009            | 451               | 3                | Bad!               |
   | 202010            | 86                | 3                | Bad!               |
   | 202011            | 257               | 2                | Bad!               |
   | 202012            | 465               | 4                | Good!              |
   | 202013            | 465               | 4                | Good!              |
   | 202014            | 465               | 4                | Good!              |
   | 202015            | 302               | 5                | Good!              |
   | 202016            | 302               | 3                | Good!              |
   ...
   ```
   执行以下命令统计表行数：
   **select count(\*) from bookscore;**
   ```
   +------+
   | _c0  |
   +------+
   | 32   |
   +------+
   ```
   
   
3. 执行以下命令，等待MapReduce任务完成后，筛选原始数据中累计评分最高的图书top3。 
   **select bookid,sum(score) as summarize from bookscore group by bookid order by summarize desc limit 3;**
   例如最终显示内容如下：
   ```
   ...
   INFO  : 2021-10-14 19:53:42,427 Stage-2 map = 0%,  reduce = 0%
   INFO  : 2021-10-14 19:53:49,572 Stage-2 map = 100%,  reduce = 0%, Cumulative CPU 2.15 sec
   INFO  : 2021-10-14 19:53:56,713 Stage-2 map = 100%,  reduce = 100%, Cumulative CPU 4.19 sec
   INFO  : MapReduce Total cumulative CPU time: 4 seconds 190 msec
   INFO  : Ended Job = job_1634197207682_0025
   INFO  : MapReduce Jobs Launched: 
   INFO  : Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 4.24 sec   HDFS Read: 7872 HDFS Write: 322 SUCCESS
   INFO  : Stage-Stage-2: Map: 1  Reduce: 1   Cumulative CPU: 4.19 sec   HDFS Read: 5965 HDFS Write: 143 SUCCESS
   INFO  : Total MapReduce CPU Time Spent: 8 seconds 430 msec
   INFO  : Completed executing command(queryId=omm_20211014195310_cf669633-5b58-4bd5-9837-73286ea83409); Time taken: 47.388 seconds
   INFO  : OK
   INFO  : Concurrency mode is disabled, not creating a lock manager
   +---------+------------+
   | bookid  | summarize  |
   +---------+------------+
   | 465     | 170        |
   | 302     | 110        |
   | 474     | 88         |
   +---------+------------+
   3 rows selected (47.469 seconds)
   ```
   以上内容表示，ID为456、302、474的3本书籍，为累计评分最高的Top3图书。
   
   
 
