【场景案例】Load将Mysql数据导入Hive样例方案

1.1      业务场景

模拟使用Loader工具将客户移动电话系统产生的历史数据从原始数据库Mysql导入到Hive中,进行离线分析。

1.2      操作步骤

1.2.1        创建用户

  1. 进入FunsionInsight Manager界面,进去系统,创建本次测试用户,给予最大权限即可。

     

1.2.2        Loader准备工作

1.获取关系型数据库对应的驱动jar包保存在Loader服务主备节点的lib路径:“${BIGDATA_HOME}/FusionInsight_Porter_6.5.0/install/FusionInsight-Sqoop-1.99.3/FusionInsight-Sqoop-1.99.3/server/webapps/loader/WEB-INF/ext-lib”。

2.使用root用户在主备节点分别执行以下命令修改权限:

    chown omm:wheel jar包文件名

    chmod 600 jar包文件名

   

3.登录FusionInsight Manager系统,选择“集群 > 服务 > Loader > 更多 > 重启”,输入管理员密码重启Loader服务。

 

1.2.3        Mysql准备工作

1.登录事先安装好的Mysql数据库,方式如下:

    mysql –uroot –p Huawei@123

2.创建并使用数据库

        create database inform;

         use inform;

3.创建mysql数据表(模拟客户原始数据表)

        CREATE TABLE data_temp_demo (

              tel_num INT NOT NULL             #电话号码

              ,user_ip_addr VARCHAR(256)             #IP地址

              ,device_name VARCHAR(128)             #设备名

              ,rom_ver VARCHAR(128)                    #ROM版本

              ,hardware_ver VARCHAR(256)          #硬件版本

              ,app_name VARCHAR(256)                 #应用名称

              ,os_ver VARCHAR(256)                      #操作系统版本

              ,os_language VARCHAR(256)              #语言

              ,carrier VARCHAR(128)                      #运营商

              ,dt INT NOT NULL                              #日期

              ,mobile_color VARCHAR(256)             #颜色

              );

       备注:

4.使用脚本生成业务数据,方式如下:

 

  Java  -jar createDataTool.jar  100000   #100000表示数据条数

 

5.将生成的数据data.csv导入mysql中,方式如下:

   LOAD DATA LOCAL INFILE '/opt/data.csv' into table data_temp_demo FIELDS TERMINATED BY ',';

1.2.4        Hive准备工作

1.需要提前下载Hive客户端,在客户端节点引入环境变量,认证用户,如下所示:

   

2.创建Hive存放数据的HDFS目录,如下

  hdfs dfs -mkdir -p /data/mobilePhone/inform

3.进入Hive shell客户端,创建并使用数据库

  beeline

  create  database inform;

  use inform;

4.创建数据表dwd_evt_hota_device_log和result表(结果分析表)

   CREATE EXTERNAL TABLE IF NOT EXISTS inform.dwd_evt_hota_device_log(

    tel_num              int      

    ,user_ip_addr      VARCHAR(256)     

    ,device_name      VARCHAR(128)      

    ,rom_ver          VARCHAR(128)      

    ,hardware_ver      VARCHAR(256)     

    ,app_name         VARCHAR(256)     

    ,os_ver            VARCHAR(256)

    ,os_language       VARCHAR(256)      

    ,carrier            VARCHAR(128)     

    ,dt                int 

,mobile_color       VARCHAR(256)

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

LINES TERMINATED BY '\n'

STORED AS textfile

LOCATION '/data/mobilePhone/inform';

创建result表:

CREATE  TABLE IF NOT EXISTS inform.result

(

     tel_num              int      

    ,user_ip_addr      VARCHAR(256)     

    ,device_name      VARCHAR(128)      

    ,rom_ver              VARCHAR(128)      

    ,hardware_ver      VARCHAR(256)     

    ,app_name           VARCHAR(256)     

    ,os_ver                VARCHAR(256)

    ,os_language        VARCHAR(256)      

    ,carrier            VARCHAR(128)     

    ,dt                 int 

    ,mobile_color           VARCHAR(256)      

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

LINES TERMINATED BY '\n'

STORED AS textfile;

1.2.5        配置Loader任务

1.进入FunsionInsight Manager界面,点击Loader服务的主实例,进去loader任务配置界面,如下:

 

2. 进入Loader任务界面后,点击“新建作业”

 

3.进行基本信息配置,按照如下步骤进行设置

 备注:1.驱动程序类:com.mysql.jdbc.Driver

         2.连接URL:jdbc:mysql://96.6.10.1:3306/inform(IP地址是Mysql所在机器的,inform表示数据库)

         3.用户名和密码是mysql数据库的

         4.配置完成,点击测试,显示测试成功,表示可以成功访问Mysql。

4.进入输入设置界面,按照如下方式配置即可

5.进入“转换”设置,在左侧输入算子和输出算子分别选择“表输入”和“Hive输出”将其拖到右侧方格中,从表输入的

   方向连接至Hive输出,显示如下

6.表输入算子配置,双击表输入进行配置,点击自动识别可以直接识别mysql对应数据表的字段,如下:

 

7.Hive输出算子配置,双击“Hive输出”进行配置,点击关联可自动关联mysql字段,如下:

   

8.进行“输出设置”,按照如下步骤操作,保存并运行任务

9.查看任务运行结果,如下

1.3      查看结果

1.3.1        查看Hive表dwd_evt_hota_device_log查看结果

select count(*)  from inform.dwd_evt_hota_device_log;

select * from inform.dwd_evt_hota_device_log a limit 10;

1.3.2        结果分析

  1. 查询device_name名为iphone的数据并导入result表中,如下

insert into result select * from inform.dwd_evt_hota_device_log a where a.device_name='iphone';

1.4      FAQ

1.4.1        Loader任务Map数设置为20个,但在yarn上看到的实际Map数只有1,为什么?

答:hive导出是按照hive分区数进行划分的。

策略如下:
1、如果hive表实际分区数大于界面配置的map数,那么实际map数就是界面上配置的map数
2、如果hive实际分区数小于界面上配置的map数,那实际生效的map数就是实际的分区数

具体到你的环境,你的hive表应该是没有配置分区表,那分区数就是1

实际生效的map数也是1

1.4.2        Loader是否支持关系型数据库(Oracle)中存在Clob、Blob等大对象类型字段?

答:不支持。如果存在,建议将Clob引导成Long类型、Blob引导成Long row类型。

1.4.3        是否可以在URL中指定字符编码格式为UTF-8?

答:可以。

jdbc:mysql://96.6.10.1:3306/test?useUnicode=true&characterEncoding=UTF-8

1.4.4        Loader可以通过调大Map的个数,提升导入导出速度吗?

答:可以。一个Map数对应到HDFS上为一个文件。多个Map对应多个文件,表示并发写入。

1.4.5        Loader提升导入导出速率的方式?

答:1.设置多Map;2.使用Mysql或Oracle专用连接器;3.建议关系型数据库做分区,建索引。

1.4.6        Loader导入导出作业,运行一段时间后超时失败?

答:设置Loader自定义作业超时时间,保存重启Loader服务,然后重新执行任务。

mapreduce.task.stuck.timeout-ms 3600000

 

(完)