数仓工具
1、ETL
1.1ETL介绍
ETL(Extract-Transform-Load)是将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,ETL较常用的数据仓库,从数据源抽取出来所需要的原始数据,经过数据清洗,最终将清洗后的数据加载到数据仓库中去。
1.2数据抽取
数据抽取是从数据源抽取需要的原始数据,抽取的方式多种多样,要根据数据源的特点来确定,通常有如下几种数据抽取的方式:
1、从关系数据抽取数据
通过OLTP系统采用关系数据库存储业务操作数据,从关系数据库抽取操作型数据是最多一种数据抽取方式。
数据从关系数据库抽取后通常会先以文件存储到分布式文件系统中(例如HDFS),方便ETL程序读取原始数据。也有的是将抽取后的数据直接存储到数据仓库中,采用第二种方法需要提前在数据仓库创建与原始数据相同结构的数据仓库模型。
2、从日志文件抽取
OLTP系统通过日志系统将日志的操作日志、系统日志等存储在OLTP服务器上,由专门的采集程序从服务器上采集日志文件信息。
3、从数据流接口抽取
OLTP系统提供对外输出数据的接口(比如telnet),采用系统与该接口对接,从数据流接口抽取需要的数据。
1.3 数据转换
数据转换也叫数据清洗转换,是将采集过来的原始数据(通过原始数据存在一定的脏数据)请洗(过滤)掉不符合要求的脏数据,根据数据仓库的要求进行转换,经过数据清洗转换后是符合数据仓库要求的数据。
要清洗的脏数据的形式有:
1、错误的数据
存在数据内容错误的信息,比如学生选课信息中课程标识错误或选课日志非法等。
2、不完整的数据
是指信息不完整,比如学生选课信息中缺少学生或者缺少课程的信息,这类信息是不符合学生选课数据模型的要求的。
3、重复数据
第三类数据是要根据具体的业务进行单独去重新操作,比如:同一个课程学习会话中只允许有一条学生学生记录,这里就要根据会话ID对数据进行去重操作。
数据转换的形式有:
1、数据格式转换
对数据的格式进行转换,通常转换后数据内容是不变的,比如:数据仓库要求的日期格式是yyyymmdd,而采集过来的数据格式是yyyy-mm-dd,这里需要将yyyy-mm-dd的格式转换为yyyymmdd。
2、数据内容转换
对数据内容进行转换,通常数据内容转换后是不会改变原始数据内容的意义的,比如:数据仓库要求存储用户所在区域,这里就需要根据采集过来的用户IP地址从ip库中查找出用户的ip地址所对应的区域信息,这里根据IP地址换换为区域就是数据内容并的转换。
1.4数据加载
数据加载就是清洗转换后的数据存储到数据仓库中,数据加载的方式包括:全量加载、增量加载。
全量加载:
全量架子啊相当于覆盖架子啊的方式,每个架子都会覆盖原始数据将数据全部加载到数据仓库,此类加载方式通常用于维度数据。
增量加载:
增量加载按照一定的计划(通常是时间计划)逐步的一批一批的将数据加载到数据仓库,此类加载方式通常用于OLAP的业务操作数据。
1.5 ETL工具
1.5.1有哪些工具
我们常用的ETL工具有Sqoop、Kettle、Nifi。
1.5.1.1 Kettle
kettle是一款国外开源的ETL工具,纯java编写,可以在Windows、Linux、Unix上运行,数据抽取与传输高效稳定,纯java编写,无需安装。
官网地址:https://community.hitachivantara.com/docs/DOC-1009855
优点:
a、最大的优点是开源免费。
b、部署简单
c、转换过程比较灵活,可以是手工编写的SQL语句、Java代码、正则表达式等。
d、kettle支持广泛的数据库、数据文件等,同时支持扩展。
缺点
a、由于是基于JVM的,所以当处理大数据量的时候瓶颈问题比较突出。
b、客户端和服务端在一起,耦合性太强导致其跨平台能力较差。
c、监控日志粒度比较粗、问题比较难追踪。
1.5.1.2 NiFi
Apache NiFi是一个易于使用,功能强大且可靠的系统,用于处理和分发数据。可以自动化管理系统间的数据流。它使用高度可配置的指示图来管理数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。NiFi原来是NSA的一个项目,目前已经代码开源,是Apache基金会的顶级项目之一。
NiFi是基于Java的,使用Maven支持包的构建管理。NiFi基于web方式工作,后台在服务器上进行调度。用户可以将数据处理定义为一个流程,然后进行处理,Nifi后台具有数据处理引擎、任务调度等组件。
简单的说,Nifi就是为了解决不同系统间数据自动流通问题而建立的。
优点
A、可视化的UI界面,各个模块组件之间高度可配置,且每个流程都有监控,可以通过界面直观的看到各个数据处理模块之间的数据流转情况,分析出程序性能瓶颈。
B、数据流可以在UI界面自由拖拽和扩展,各模块之间相互独立,互不影响。
C、可以在处理耗时时的地方创建多个处理模块并行执行,提升处理速度。类似于代码中加入了多线程,但是对于修改代码,界面配置操作十分简单。
D、修改方便,任意模块都可以在处理流转过程中随时启停,处理任务模块都可以实现热插拔。数据流向随时可变。
E、Nifi的对处理模块有对应的retry机制和错误分发机制,且可配置性强。
缺点
各个步骤中间结果落地导致磁盘io称为NIFI的瓶颈,这个缺点在数据冗余量越大的时候表现的越明显。
1.5.1.3 Sqoop
Sqoop是Apache下的顶级项目,用来将Hadoop和关系型数据库中的数据相互转移,可以将一个关系型数据库(例如:Mysql、Oracle、PostgreSQL等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中,目前在各个公司应用广泛,且发展前景比较乐观。其特点在于:
- 专门为Hadoop而生,随Hadoop版本更新支持程度好,且原本即是CDH版本孵化出来的开源项目,支持1) CDH的各个版本号。
- 它支持多种数据库,比如mysql、oracle、postgresql。
- 可以高效、控制的利用资源,可以通过调整任务数来控制任务的并发度,可以指定按某个字段进行拆分并行化导入过程。
- 可以自动的完成数据映射的转换。由于导入数据库是有类型的,它可以自动根据数据库中的类型转换到Hadoop中,当然用户也可以自定义它们之间的映射关系。
- 大部分企业还在使用sqoop1版本,sqoop1能满足公司的基本需求。
- 自带的辅助工具比较丰富,如sqoop-import、sqoop-list-databases、sqoop-list-tables等。
1.5.2 项目选型
知行教育大数据平台,ETL的数据量较大,但是数据来源的类型简单(mysql),由此:
- kettle虽然功能比较完善,但是处理大数据量的时候瓶颈问题比较突出,不适合此项目;
- nifi的功能强大,且支持大数据量操作,但是NiFi集群是独立于Hadoop集群的,需要独立的服务器来支撑,强大也就意味着有上手门槛,可以作为备选方案;
- Sqoop专为关系型数据库和Hadoop之间的ETL而生,支持海量数据,符合项目的需求,且操作简单门槛低,因此选择Sqoop作为ETL工具。
Sqoop详细资料见 《Home\讲义\第2章 数据仓库与工具\sqoop\sqoop教程.docx》。
2. Hue操作HDFS
2.1进入HDFS管理界面
2.2 HDFS新建文件夹
2.3新建文件
2.3.1进入文件夹
2.3.2 新建文件
2.3.3 创建成功
2.4 上传文件
2.4 .1 选择文件
2.4.2 上传成功
2.5 查看HDFS文件内容
2.6 编辑HDFS文件
2.7 删除文件
2.8 更改文件权限
3. Hue操作Hive
3.1 进入Hive面板
3.2 测试
3.2.1 创建数据库
create database if not exists 'test'
with dbproperties('creator'='itcast','create_date'='2020-05-05')
3.2.2 创建表
create table test.test.table(
id int,
name string comment '姓名'
)
comment '测试表'
row format delimited fields terminated by '\t';
3.2.3 插入数据
insert into test.test_table values (1, '张三');
3.2.4查询数据
select * from test.test_table;
3.2.5 调整区域大小
4. 调度
大数据常用的调度工具有:Oozie和Azkaban。
4.1 对比
- Oozie是基于Hadoop系统进行操作,而Azkaban是基于命令行操作。使用hadoop提供的第三方包JobClient比直接在低层跑shell命令开发成本小,可能遇到的坑也小(一个是基于Hadoop平台,一个是基于Linux系统)。
- Oozie的操作是放在Hadoop中,而Azkaban的运行是服务器运行shell命令。为保证服务器的稳定,使用Oozie靠谱点。
- Ooize提供查询任务执行状态,Azkaban查询的是进程执行的结果,如果某进程执行的shell命令出错,其进程扔展示为成功,混淆了任务输出。
- Oozie将任执行的状态持久化到数据库中,Azkaban将任务存储在服务器内存中,如果掉电,则Azkaban会丢失任务信息。
- Oozie中定义的action类型更为丰富,而Azkaban的依赖较为简单,当面对复杂的逻辑时Oozie执行的比较顺畅。
- 两者均可以通过WEB界面进行配置操作,Azkaban和Oozie均自带WEB,而Oozie同时还被HUE集成,通过hue集成管理,可以更加方便的在web页面上完成workflow的启动、停止、恢复。
- CDH原生支持Oozie,而Azkaban还需要额外的编译及安装配置。
4.2 项目选型
基于以上对比,本采用ClouderaManager和Hue所支持的Oozie来进行调度。
4.3 Oozie使用案例
4.3.1 查看已有的oozie程序
4.3.2 新增oozie程序
4.3.3 提交任务
4.3.4 修复异常
org.apache.oozie.action.ActionExecutorException: JA009: Invalid resource request! Cannot allocate containers as requested resource is greater than maximum allowed allocation. Requested resource type=[memory-mb], Requested resource=<memory:2048, vCores:1>, maximum allowed allocation=<memory:1024, vCores:4>, please note that maximum allowed allocation is calculated by scheduler based on maximum resource of registered NodeManagers, which might be less than configured maximum allocation=<memory:1024, vCores:4>
这是内存分配过小导致的错误,需要设置内存并重启Yarn
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>526</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4086</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4.1</value>
</property>
4.3.5 修改后重启服务
- 执行成功