Sqoop+Hive+DataX数仓数据导入开发和产出
一、 Sqoop安装和配置
1. 前期准备
检查服务器集群环境hadoop,hive,jdk,python等环境是否都安装及其全部启动
下载对应的安装包和准备所需要依赖的jar
Sqoop-1.4.7linux安装包:https://archive.apache.org/dist/sqoop/1.4.7/
依赖的jar包:sqoop-1.4.7.jar和mysql-connector-java-5.1.35-bin.jar
/org/apache/sqoop/sqoop/1.4.7/sqoop-1.4.7.jar
2. 安装配置
sqoop安装配置
#从官网下载对应的安装包上传服务器并解压到指定路径
tar -zxvf /tmp/sqoop-1.4.7.tar.gz -C /home/hadoop/sqoop-1.4.7.jar
把mysql驱动复制到sqoop的lib目录下
cp /home/hive-3.1.2/lib/mysql-connector-java-5.1.9.jar /home//hadoop/sqoop-1.4.7/lib/
#修改sqoop/conf/下的sqoop-env.sh文件
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop /hadoop-3.1.3
export HADOOP_MAPRED_HOME=/home/hadoop /hadoop-3.1.3
export HIVE_HOME=/home/hadoop /hive-3.1.2
export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.5.7
#配置环境变量
vim /etc/profile
#追加sqoop路径
export SQOOP_HOME=/home/hadoop/sqoop-1.4.7
export PATH=$PATH:$SQOOP_HOME/bin
- 测试
查看对应的版本号:sqoop version
#/home/Hadoop/sqoop-1.4.7/目录下测试mysql链接
./bin/sqoop list-databases --connect jdbc:mysql://192.168.100.1:3306/ --username hive --password 密码
- 注意事项
需要将mysql的渠道和sqoop驱动放到对应的目录下:
cp mysql-connector-java-5.1.36.jar /home/hadoop/sqoop-1.4.7/lib/
上传的sqoop-1.4.7.jar也放到sqoop-1.4.7/bin目录下
并修改对应的配置文件vim sqoop-1.4.7/bin/sqoop文件最后一行,参考如下
source ${bin}/configure-sqoop "${bin}"
exec ${HADOOP_COMMON_HOME}/bin/hadoop jar ${SQOOP_HOMEn}/bin/sqoop-1.4.7.jar org.apache.sqoop.Sqoop "$@"
二、 数据接入
- Mysql数据全量同步到hdfs
a) 前置准备工作
部分脚本依赖复制:
cp /home/hadoop/hive-3.1.2/lib/hive-common-3.1.2.jar /home/hadoop/sqoop-1.4.7/lib/
启动hiveserver2服务
启动hiveserver2服务,并创建mysql对应的hive映射表。
控制台启动:hiveserver2
后台启动并日志写入到指定文件:
nohup ./hiveserver2 > /home/hadoop/hive-3.1.2/server.log 2>&1 &
连接服务创建库及其对应的表
Beeline连接:
beeline
!connect jdbc:hive2://192.168.100.1:10000
客户端连接:jdbc:hive2://192.168.100.1:10000
有库时选择要导入数据的库没库时创建对应的数据库
选库:use database_name;
创建库:create database ods_test;
b) 配置映射同步脚本
为了数据库的安全性,数据库的账号信息单独配置到数据库对应的脚本中,表数据同步单独为一个个脚本
数据库配置脚本命名:对应数据库类型_数据库名.sh(mysql_test_db.sh)
脚本内容:
#/bin/sh
jdbc=jdbc:mysql://192.168.100.1:3306/test_db
username=root
password=12345678
table=tb_name
hive-database=ods_test
数据同步脚本命名:hive中ods库中对应的表名.sh(ods_person_external.sh)
#/bin/sh
source /home/hadoop/bigdata/mysql_test_db.sh
/home/hadoop/sqoop-1.4.7/bin/sqoop import \
--connect ${jdbc} \
--username ${username} \
--password ${password} \
--target-dir '/user/hive/warehouse/ods_test.db/ods_person_count_d' \
--query 'select area_code,area_name,peo_sum from person_count where id>20 and $CONDITIONS' -m 1
报错:sqoop Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/avro/LogicalType
解决:下载jar包(avro-1.8.1.jar)放入到sqoop/lib路径下
https://org/apache/avro/avro/1.8.1/
c) 测试脚本可行性
执行 sh ods_person_external_d.sh
然后创建mysql对应的hive映射表:
create external table ods_person_external_d (
area_code string comment ‘区域编码’,
area_name string comment ‘区域名称’,
peo_sum string comment ‘区域数量’
)
row format delimited fields terminated by ‘,’
stored as textfile
location ‘/user/hive/warehouse/ods_test.db/ods_person_external_d’;
查询hive中表数据:
- Mysql数据增量同步到hdfs
三、 Hive开发
Hive开发为不同层级之前的数据清洗和粒度维度统计计算
比如从ods层清洗或者统计的数据同步到dw层,dw层汇总到ads应用指标层
前提准备:ads层建立对应的表
CREATE TABLE if not exists ads_test.ads_hz_area_info_d (
`area_code` string COMMENT '区域编码',
`parent_code` string COMMENT '区域父级编码',
`address_name` string COMMENT '区域名称',
`full_name` string COMMENT '区域全称',
`type_level_code` string COMMENT '维度类型编码',
`dt` string
) COMMENT '苏州市行政区划分';
根据数据清洗或者业务指标口径计算相关的指标
insert overwrite TABLE ads_test.ads_hz_area_info_d
select area_code,parent_code,address_name,full_name,1 as type_level_code,'20200818' AS type_level_code
FROM ods_test.ods_hz_area_info_d_tmp LIMIT 20
最后将相关的计算代码封装到脚本中,分发脚本到集群的所有机器,最后上调度定时执行
相关脚本的封装参考代码为
ads_hz_area_info_d.sh
#! /bin/sh
source /etc/profile
hive -e "insert overwrite TABLE ads_test.ads_hz_area_info_d
select area_code,parent_code,address_name,full_name,1 as type_level_code,'20220818' AS type_level_code
FROM ods_test.ods_hz_area_info_d_tmp LIMIT 20"
文件同步分发到集群脚本命令为;sh /home/hadoop/scp_all.sh bigdata/*
执行权限问题找运维解决
四、 DataX安装和配置
解压datax到对应目录:
tar -zxvf datax202205.tar.gz -C /home/hadoop
配置对应数据同步脚本配置文件ads_hz_area_info_d.json
具体内容参考如下:
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/ads_test.db/ads_hz_area_info_d",
"defaultFS": "hdfs://192.168.100.1:8020",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "string"
},
{
"index": 2,
"type": "string"
},
{
"index": 3,
"type": "string"
},
{
"index": 4,
"type": "string"
},
{
"index": 5,
"type": "string"
}
],
"fileType": "text",
"encoding": "UTF-8",
"fieldDelimiter": "\u0001"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password": "12345678",
"column": [
"area_code",
"parent_code",
"address_name",
"full_name",
"type_level_code",
"dt"
],
"session": [
"set session sql_mode='ANSI'"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.100.1:3306/test_db?useUnicode=true&characterEncoding=utf-8&useSSL=false",
"table": [
"ads_hz_area_info_d"
]
}
]
}
}
}
]
}
}
执行数据同步命令:
Python /home/hadoop/datax/bin/datax.py /home/hadoop/bigdata/ads_test/datax_conf_test/ads_hz_area_info_d.json
五、 数据产出
默认用datax同步,现在服务器datax版本有问题,暂时用sqoop同步替代
Hive中ads应用层数据存在hdfs中导出到应用库的mysql中,具体操作如下
Mysql中创建和hive中ads层要同步表对应的表结构
Hive中对应的表结构
CREATE TABLE if not exists ads_test.ads_hz_area_info_d (
`area_code` string COMMENT '区域编码',
`parent_code` string COMMENT '区域父级编码',
`address_name` string COMMENT '区域名称',
`full_name` string COMMENT '区域全称',
`type_level_code` string COMMENT '维度类型编码',
`dt` string
) COMMENT '苏州市行政区划分';
mysql中对应的表结构
CREATE TABLE `ads_hz_area_info_d` (
`area_code` varchar(255) DEFAULT NULL COMMENT '区域编码',
`parent_code` varchar(255) DEFAULT NULL COMMENT '区域父级编码',
`address_name` varchar(128) DEFAULT NULL COMMENT '区域名称',
`full_name` varchar(255) DEFAULT NULL COMMENT '区域全称',
`type_level_code` varchar(255) DEFAULT NULL COMMENT '维度类型编码',
`dt` varchar(255) DEFAULT NULL COMMENT '分区'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ads层苏州市行政区划分';
然后配置相应的数据同步映射脚本
[hadoop@hadoop1 ads_test]$ cat export_ads_hz_area_info_d.sh
source /home/hadoop/bigdata/mysql_test_db.sh
/home/hadoop/sqoop-1.4.7/bin/sqoop export \
--connect ${jdbc} \
--username ${username} \
--password ${password} \
--export-dir /user/hive/warehouse/ads_test.db/ads_hz_area_info_d -m 1 \
--table ads_hz_area_info_d \
--fields-terminated-by '\u0001'
注意事项说明,字段切分fields-terminated-by不要用’\t’和’,‘,hive默认分割为’\u0001’
执行sh export_ads_hz_area_info_d.sh即可同步hive中ads层的数据到mysql应用库中。
六、 任务调度
根据截图中的顺序配置1234来配置对应的项目
点击创建的项目进入到工作流界面
点击创建工作流拖拽对应的shell到画布进行配置
参考页面
对应配置如下
Import_start脚本内容为
echo “start”
ods_hz_area_info_d脚本内容为
sh /home/hadoop/bigdata/ods_test/ods_hz_area_info_d.sh
etl-ads_hz_area_info_d脚本内容为
sh /home/hadoop/bigdata/ads_test/ads_hz_area_info_d.sh
export_ads_hz_area_info_d脚本内容为
sh /home/hadoop/bigdata/ads_test/export_ads_hz_area_info_d.sh
所有脚本保存选择hadoop租户
对应定时调度配置,上线,下线在对应工作流右边
对应成功和失败如下(工作流实例中查看)
失败的工作流右击对应的几点可以查看对应的报错日志
修改对应的配置或者脚本内容,测试通过后然后文件分发到集群之后可以恢复失败来重跑工作流实例