1.1 业务场景
模拟使用Loader工具将客户移动电话系统产生的历史数据从原始数据库Mysql导入到Hive中,进行离线分析。
1.2 操作步骤
1.2.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 结果分析
- 查询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