数仓导入以及部分工具

作者: 八爪鱼下水 | 来源:发表于2021-02-21 20:38 被阅读0次

数据架构三层架构逻辑

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

简介:导入导出数据库的工具

  1. 查看mysql中所有的数据库
sqoop list-databases \
--connect jdbc:mysql://hadoop01:3306 \
--username root \
--password 123456
  1. 查看mysql中某个库下所有的表
sqoop list-tables \
--connect jdbc:mysql://hadoop01:3306/scm \
--username root \
--password 123456
#注意:
  #  当忘记某个属性的时候, 可以通过使用  --help方式查询
  1. 从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
  1. 使用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表的字段名称保持一致
  1. 使用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'"
  1. 使用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"
  1. 使用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

相关文章

网友评论

    本文标题:数仓导入以及部分工具

    本文链接:https://www.haomeiwen.com/subject/ywaqfltx.html