数据架构三层架构逻辑
1)ODS层
简介:对源数据进行完整拷贝,抽取,可能对数据进行简单处理(清洗)
2)DW层
简介:对来源于ODS层的数据进行分析,可细分为三部分
3)DA层(app层)
简介:存储DW层的结果数据,对接后续应用, (推荐算法 / 机器学习 / 图标)
4) DIM层(维度层)
作用:
1.存储维度表的
2.维度数据多将数据放到DIM层
3.对接app层
什么时候使用app层?
DW层的结果被分配到不同的结果表, 需要将Dw层进行需要统计.
2.2DW层细化为四个部分。
2.2.2DWD层(明细层)
1.对接ODS层,大聚合层,把所有数据合并到一起,清洗/转换/最终合并一个表。可以进行一定维度的退化操作。
2.2.3DWM层(中间层)
1.对DWD层数据进行进一步聚合操作,同时此层也可以进行维度退化的操作.此层的表,都是周期快照事实表
举例:可以按照小时进行聚合
2.2.4DWS层 (业务层)
1.对各个维度的统计结果进行储存,形成一个宽表,最终结果数据
注意: 此层一般就是最终分析结果的数据了
4) HUE
简介:hadoop 的用户体验, 把Hadoop的相关软件操作界面,融合在一起, 形成一个统一的操作界面,大集成者.
5) OOZIE
简介:工作流调度工具,业务整体在计算机环境下的自动化,流程被分为多个节点,多个点存在依赖关系,此流程需要周而复始不断干
6) SQOOP
简介:导入导出数据库的工具
- 查看mysql中所有的数据库
sqoop list-databases \
--connect jdbc:mysql://hadoop01:3306 \
--username root \
--password 123456
- 查看mysql中某个库下所有的表
sqoop list-tables \
--connect jdbc:mysql://hadoop01:3306/scm \
--username root \
--password 123456
#注意:
# 当忘记某个属性的时候, 可以通过使用 --help方式查询
- 从mysql中将数据导入到HDFS(全量导入)
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password 123456 \
--table emp
通过测试发现, 只需要指定输入端,
即可将数据导入HDFS中, 默认情况下,
将数据导入到所操作用户对应家目录下,
建立一个与导入表同名的目录,
同时发现表中有几条数据,
sqoop默认就会启动几个map来读取数据,
默认分割符号为 逗号
如何减少map的数量呢? 只需要添加 -m的参数即可
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password 123456 \
--table emp \
-m 1
如果想使用两个map呢? 建议添加--split-by 表示按照那个字段进行分割表数据
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password 123456 \
--table emp \
--split-by id \
-m 2
想要修改其默认的分割符号: 更改为 空格
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password 123456 \
--table emp \
--fields-terminated-by ' ' \
--split-by id \
-m 2
想要指定某个目的地:
--target-dir (指定目的地)和
--delete-target-dir(目的地目录存在,先删除)
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password 123456 \
--table emp \
--fields-terminated-by ' ' \
--target-dir '/sqoop_emp' \
--delete-target-dir \
--split-by id \
-m 2
- 使用sqoop导入到hive中(全量导入)
第一步:
create database sqooptohive;
use sqooptohive;
create table sqooptohive.emp_hive(
id int,
name string,
deg string,
salary int ,
dept string
) row format delimited fields terminated by '\t' stored as orc;
第二部: 执行数据导入操作: HCataLog
sqoop import \
--connect jdbc:mysql://192.168.52.150:3306/test \
--username root \
--password 123456 \
--table emp \
--fields-terminated-by '\t' \
--hcatalog-database sqooptohive \
--hcatalog-table emp_hive \
-m 1
属性说明:
--hcatalog-database 指定数据库名称
--hcatalog-table 指定表的名称
注意: 使用此种方式, 在hive中建表的时候,
必须保证hive表字段和对应mysql表的字段名称保持一致
- 使用where条件的方式, 导入数据到HDFS(条件导入)
sqoop import \
--connect jdbc:mysql://192.168.52.150:3306/test \
--username root \
--password 123456 \
--table emp_add \
--target-dir /sqoop/emp_add \
--delete-target-dir \
-m 1 \
--where "city = 'sec-bad'"
- 使用SQL方式将数据导入到HDFS(条件导入)
sqoop import \
--connect jdbc:mysql://192.168.52.150:3306/test \
--username root \
--password 123456 \
--query 'select phno from emp_conn where 1=1 and $CONDITIONS' \
--target-dir /sqoop/emp_conn \
--delete-target-dir \
-m 1
注意:
1)当采用SQL的方式来导入数据的时候,
SQL的最后面必须添加 $CONDITIONS 关键词
2) 整个SQL如果使用 "" 包裹的
$CONDITIONS 关键词前面需要使用\进行转义
"select phno from emp_conn where 1=1 and \$CONDITIONS"
- 使用SQL方式将数据导入hive(条件导入) -- 增量导入方式
sqoop import \
--connect jdbc:mysql://192.168.52.150:3306/test \
--username root \
--password 123456 \
--query "select * from emp where id>1205 and \$CONDITIONS" \
--fields-terminated-by '\t' \
--hcatalog-database sqooptohive \
--hcatalog-table emp_hive \
-m 1
4.3 使用sqoop完成数据导出操作
需求: 将hive中emp_hive表导出到mysql中(全量导出)
- 第一步: 需要在mysql中创建目标表 (必须操作)
CREATE TABLE `emp_out` (
`id` INT(11) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`deg` VARCHAR(100) DEFAULT NULL,
`salary` INT(11) DEFAULT NULL,
`dept` VARCHAR(10) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
第二步: 执行sqoop的导出操作:
sqoop export \
--connect jdbc:mysql://192.168.52.150:3306/test \
--username root \
--password 123456 \
--table emp_out \
--hcatalog-database sqooptohive \
--hcatalog-table emp_hive \
-m 1
4.4 sqoop的相关参数
参数 | 说明 |
---|---|
--connect | 连接关系型数据库的URL |
--username | 连接数据库的用户名 |
--password | 连接数据库的密码 |
--driver | JDBC的driver class |
--query或--e <statement> | 将查询结果的数据导入,使用时必须伴随参--target-dir,--hcatalog-table,如果查询中有where条件,则条件后必须加上CONDITIONS关键字。 如果使用双引号包含sql,则CONDITIONS前要加上\以完成转义:\$CONDITIONS |
--hcatalog-database | 指定HCatalog表的数据库名称。如果未指定,default则使用默认数据库名称。提供 --hcatalog-database不带选项--hcatalog-table是错误的。 |
--hcatalog-table | 此选项的参数值为HCatalog表名。该--hcatalog-table选项的存在表示导入或导出作业是使用HCatalog表完成的,并且是HCatalog作业的必需选项。 |
--create-hcatalog-table | 此选项指定在导入数据时是否应自动创建HCatalog表。表名将与转换为小写的数据库表名相同。 |
--hcatalog-storage-stanza 'stored as orc tblproperties ("orc.compress"="SNAPPY")' \ | 建表时追加存储格式到建表语句中,tblproperties修改表的属性,这里设置orc的压缩格式为SNAPPY |
-m | 指定并行处理的MapReduce任务数量。 -m不为1时,需要用split-by指定分片字段进行并行导入,尽量指定int型。 |
--split-by id | 如果指定-split by, 必须使用$CONDITIONS关键字, 双引号的查询语句还要加\ |
--hcatalog-partition-keys --hcatalog-partition-values | keys和values必须同时存在,相当于指定静态分区。允许将多个键和值提供为静态分区键。多个选项值之间用,(逗号)分隔。比如: --hcatalog-partition-keys year,month,day --hcatalog-partition-values 1999,12,31 |
--null-string '\N' --null-non-string '\N' | 指定mysql数据为空值时用什么符号存储,null-string针对string类型的NULL值处理,--null-non-string针对非string类型的NULL值处理 |
--hive-drop-import-delims | 设置无视字符串中的分割符(hcatalog默认开启) |
--fields-terminated-by '\t' | 设置字段分隔符 |
sqoop的增量导入
check-column (col)
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似。
注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时-- check-column可以去指定多个列。incremental (mode)
append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录last-value (value)
指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--merge-key id
- 由于merge-key模式是进行了一次完整的mapreduce操作,
因此最终我们在lastmodifiedresult文件夹下可以看到生成的为part-r-00000这样的文件,会发现id=1的name已经得到修改,同时新增了id=6的数据。
更新导出操作
bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table allowinsert \
--export-dir /allowinsert_2/ \
--update-key id \
--update-mode allowinsert