day22笔记(数仓分层+Hue操作+Oozie+sqoop导数据操作)

1.数仓分层

数仓分层的目的:
	1)功能划分更明确
	2)维护方便
宽泛的数仓分层一共有三层:
	ODS层:源数据层
		作用:对接源数据,将数据源中的数据加载到HDFS中,形成一张张表,和原数据库中保持同样的颗粒度
		主要用于存放事实表和少量的维度表。在数据导入到ODS层的过程中,可能会对数据进行清洗(但并不一定会做这个操作)
		原因:1、如果数据源来源于数据库,这个时候数据本身就是结构化数据
				   2、如果数据来源于各种文件,如日志文件等,可能需要对数据进行清洗,将数据转化为结构化数据
	DW层:
		作用:进行数据的分析工作,数据来源于ODS层
		细化分层:
		DWD层:明细层
			根据要分析的主题, 从ODS层抽取相关的数据, 对数据进行清洗转换处理工作, 然后将数据加载到DWD层, 一般将此层称为 大聚合层, 一般将所有相关的数据全部糅杂在一个表中, 在此过程中, 可以进行一定的维度退化操作
		DWM层:中间层
			作用: 主要是用于对DWD层进行进一步聚合操作, 同时此层可以进行维度退化的操作, 此层的表一般就是周期快照事实表
		DWS层:业务层
			作用:主要对DWM层或者DWD层数据, 进行再次细化的聚合统计操作,  在此层需要针对各个维度都进行聚合统计结构了, 将所有维度统计的结果, 放置在一起, 形成宽表数据
			注意:这层一般就是数据分析的最终结果
	APP层:数据应用层
		- 作用: 主要是用于存储DW层分析之后的结果数据, 用于对接后续的应用(图表, 机器学习, 推荐 .....)
		- 注意: 如果不需要在针对DWS层, 在此进行统计工作, 注意DWS层就是最终结果数据
		- 什么时候需要使用APP层: 
			当DWS层统计结果, 被划分在多个不同结果表, 需要对DWS层数据进行再次的统计工作, 此时需要将统计的结果存储在APP层
	DIM层:维度层
		作用:用于放置维度表
		说明:当维度表数量较多时,一般放置在维度层

2.Hue相关操作

什么是HUE? hadoop的用户体验
 HUE主要的作用将Hadoop中各种相关的软件的操作界面. 给融合在一起, 形成一个统一的操作界面
 HUE是一个大集成者

如何进入到HUE操作界面呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. OOZIE调度工具

3.1 oozie的基本介绍

Oozie 是一个开源的工作流和协作服务引擎,基于 Apache Hadoop 的数据处理任务.

什么是工作流? 业务过程的部分或整体在计算机应用环境下的自动化

工作流具有特点:

    1. 整个流程可以被分为多个节点
    1. 各个节点存在依赖关系(前序没有干, 后续就无法执行)
    1. 此流程需要周而复始不断的干

总结: 如果以后发现有个任务满足了以上三个特征, 那么就可以尝试使用工作流来解决

请问, 大数据的开发流程, 是否可以使用工作流呢? 一定是可以的
如何来实现工作流呢? apache oozie 和 领英公司 azkaban

  • 单独使用角度: azkaban比oozie更加的方便
    • azkaban: 是由领英提供的一款工作流的调度工具, 其内部主要采用通过配置类似于properties文件来定义工作流, 此定义方式更加的方便, 而且领英宣称 只要是能够使用shell命令执行的软件, 统统都可以使用azkaban完成调度, 所以说azkaban本质上就是一个shell调度客户端
    • oozie: apache旗下的, 出现时间较早, 是大数据一款工作流的调度工具, oozie采用xml方式来完成工作流调度, oozie在单独使用下, 配置是极其复杂的, 而且oozie所提供管理界面 异常难用, 比较慢
      所以说, 从单独使用角度上, azkaban前景要优于oozie
  • 如何是结合HUE来使用呢?
    • azkaban: 由于azkaban是由领英公司开源, 并不属于apache环境, 所以HUE对其是不支持的, 如果需要使用azkaban, 需要单独维护一套azkaban调度环境
    • ooize: 是由apache开源, 属于apache怀抱下产品, 同时HUE也是apache旗下的, HUE如果要整合一款调度工具, 必然会选择自家产品 , 所以HUE是可以直接和oozie进行整合, 整合之后, 用户只需要通过鼠标点一点方式即可完成工作流的配置
      此时: ooize要比azkaban更加方便,同时也是同源产品, 兼容性也会更好, 不需要单独维护

4.sqoop的相关内容

4.1 sqoop的基本介绍

sqoop是一款apache开源产品, 主要是用于数据的导入导出的工具, 负责将数据在RDBMS和hadoop之间数据导入导出

导入: 从RDBMS到hadoop  

导出:从Hadoop到RDBMS

4.2 使用sqoop完成数据导入操作

1、查看mysql中所有的数据库

sqoop list-databases --connect jdbc:mysql://hadoop01:3306 --username root --password 123456

2、查看mysql中某个库下所有的表

sqoop list-tables --connect jdbc:mysql://hadoop01:3306/scm --username root --password 123456

3、从mysql中将数据导入到HDFS(全量导入)

	命令1:
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

4、使用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表的字段名称保持一致

5、使用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'"

6、使用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"

7、使用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 DEFA

第二步: 执行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.4sqoop的相关参数

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值