网络知识 娱乐 大数据面试常见问题(四)——ETL部分

大数据面试常见问题(四)——ETL部分

目录

1、什么是映射

2、什么是etl

3、kettle抽数一般遇到什么问题,你们是怎么解决的?

4、如果抽取的数据有重复,怎么解决

5、etl脚本开发以后,怎么运维

6、一张特别大的表,几千万,几亿 的表,怎么通过etl工具同步

7、数据同步以后,源系统的表结构发生了改变,比如源系统的表增加了字段,你的kettle脚本是否会报错?

8、有一张表下午5点才出数据,依赖的表早上十点就已经跑完了,是什么原因导致表这么慢出数据(从数仓同步数据,本来早上9点就要出结果,结果一直到下午4点才出结果)

9、有一个job前一天执行成功了,第二天再执行失败了,请分析失败的原因

10、kettle工具的运用

11、sqoop和kettle的区别

12、sqoop抽取异常

13、Kettle转换常用组件

14、Sqoop和Kettle取数性能对比

15、Kettle性能调优

16、ETL测试主要包括:


1、什么是映射

在etl过程中,源表和目标表的对应关系就是一种映射关系

在逻辑模型中,表和表之间的关系也叫映射。

mapping = 映射

2、什么是etl

etl,英文名称是extract—transform—load的缩写,用来描述将数据从来源端经过抽取,转换,加载至目标端的过程。

3、kettle抽数一般遇到什么问题,你们是怎么解决的?

kettle在不同的数据库抽取数据时,有时会出现中文乱码问题

解决方法:如果数据设置正确仍然中文乱码,则可能是因为有的客户端数据库默认的编码集不是utf-8,我们只需要在输出时对数据库行编码设置

如果还不行,可以打开options,添加参数characterencoding,设置值为gbk/utf8

4、如果抽取的数据有重复,怎么解决

在kettle的核心组件里,有一个字段选择,里面有一个 去除重复记录(uniq rows(hashset))的控件,在抽数的时候,可以通过这个控件对数据进行去重。

具体操作:创建几个核心对象,分别是输入—>表输入,将数据根据字段排序,数据去重,将去重好的数据输出到另一个表中,这里需要注意,数据去重前必须要根据相关字段排序

5、etl脚本开发以后,怎么运维

我们会定期巡检,一般2周做一次检查,检查etl脚本跑数是否正常,是否报错,分析脚本跑数的时间,是否越跑越慢,在这种情况下,需要分析脚本和目标表,比如目标表是否后来建了索引,导致更新表的时候越来越慢,索引会影响更新表的效率。如果是这种情况,可以先删除目标表的索引,更新完了以后在重新创建索引,这样可以提高跑数效率

6、一张特别大的表,几千万,几亿 的表,怎么通过etl工具同步

在etl工具中,我们插入数据的时候,可以设置批量提交,比如10万记录提交一次,而不是一次性提交。

另外如果特别慢的话,还要考虑是否锁表了,比如对目标表进行更新的时候,转换的状态一直不变,可能是目标表产生了排它锁,导致无法更新,这个要具体分析一下。

7、数据同步以后,源系统的表结构发生了改变,比如源系统的表增加了字段,你的kettle脚本是否会报错?

不会。因为我们抽数的时候,对源表和目标表的每个字段都做过映射,所以源系统的表增加了字段,我们的脚本是不会报错的。

但是如果这些新增的列,也需要同步到数仓,那我们会对ods层表的结构进行变更,然后修改kettle的脚本,然后重新跑数。

8、有一张表下午5点才出数据,依赖的表早上十点就已经跑完了,是什么原因导致表这么慢出数据(从数仓同步数据,本来早上9点就要出结果,结果一直到下午4点才出结果)

首先我会看一下调度日志,再次检查一遍是否所有的前置job都跑完了,排除因某一个前置job没跑完,导致目标表的job一直在等待。

排除上面的问题后,在分析是否是性能问题,检查监控日志,看下跑数时间,如果确实是目标表更新慢,在进一步分析慢的原因。比如:检查是否是在目标表上建了过多的索引导致更细慢,

另外,我们平时也要定期(每周或者每2周对之前的跑数job进行检查)检查job是不是越来越慢,可能因为数据量过大导致的,数据量过大的原因可以通过创建索引或者通过分区表的方式进行优化。

在分析问题的过程中我们要关注sql的执行计划,必要的时候也可以使用优化器进行sql优化

9、有一个job前一天执行成功了,第二天再执行失败了,请分析失败的原因

一种是报错,一种是不报错,但是没有结果

报错,可以查看日志,分析错误原因。如果报主键冲突。说明更新的sql逻辑有问题,我们可以查下代码,更改原来的同步逻辑即可

不报错,看调度任务是否执行,日志中如果有开始,但是没有完成时间,说明一直在等待,这时候需要查询一下是否锁表。我会查下锁表的进程,然后杀死该进程。

10、kettle工具的运用

kettle主要是用到了转换和作业两个不同的功能,使用转换进行ETL数据的处理,主要是处理表格或者数据等结构化的数据,或者接口这样的半结构化数据等,然后对数据进行格式的统一,和数据的有效筛选或者是数据的计算等等,然后将数据增量或者全量的保存到数据表格中。

使用作业主要是进行脚本的定时任务的操作等,作业我们是在windows上进行编辑,然后上传到kettle的linux服务器,使用crontab结合kettle的指令进行数据的定时调度。

11、sqoop和kettle的区别

Sqoop是一款开源的工具,主要用于在Hadoop与传统的数据库间进行数据的传递,可以将一个关系型数据库。

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定

12、sqoop抽取异常

1.指定了n为sqoop导入的换行符,mysql的某个string字段的值如果包含了n, 则会导致sqoop导入多出一行记录

sqoop导入时删除string类型字段的特殊字符

-hive-drop-import-delims     Drops n, r, and 1 from string fields when importing to Hive

2.sqoop导入数据时间日期类型错误

hive只支持timestamp类型,而mysql中的日期类型是datetime, 当datetime的值为0000-00-00 00:00:00的时候,sqoop import成功,但是在hive中执行select语句查询该字段的时候报错。

解决方法是在创建hive表时用string字段类型。

3.sqoop 从mysql导入hive的字段名称问题

hive中有些关键字限制,因此有些字段名称在mysql中可用,但是到了hive就不行。

比如order必须改成order1, 下面列出了我们发现的一些不能在hive中使用的字段名称

order => order1

sort => sort1

reduce => reduce1

cast => cast1

directory => directory1

13、Kettle转换常用组件

计算器、剪切字符串、字段选择、排序记录、去除重复记录、过滤记录、关联、列转行、合并记录、分组

计算器:利用一系列的函数组合,来创建新的字段,并且可设置新的字段是否移除。

剪切字符串:剪切字符换可以对字段中字符串进行剪切,索引位置从0开始,例如:截取至索引位置6,也就是 012345。

字段选择:字段选择有3个标签页,【选择和修改】,【移除】,【元数据】
选择和修改:可以实现对字段的改名
移除字段:设置字段是否要移除
元数据:可以修改字段类型。
注意:移除字段一定要在选择和修改页面包含,否则会报找不到字段的错误

排序记录:按照指定字段对记录进行升序或者降序排列,可以对多个字段进行组合排序。

去除重复记录:去除重复记录之前需要排序

过滤记录:对记录进行过滤,过滤的结果可以进行两个输出,符合条件的一个输出,不符合条件的另一个输出,可以添加多个过滤条件,并且可以选择条件之间的逻辑关系。

关联:从多个数据源中取值并进行关联。关联之前需要进行排序

列转行:列转行之前也需要进行排序

合并记录:合并记录可以对旧纪录与新纪录进行合并,并可对数据的新增,修改和删除进行标记。主要用于新旧数据的对比。

分组:分组就是按照一定的分类对数据进行分类统计,如按照班级对成绩进行统计,按照性别进行统计,班级和性别就是分组的依据。

14、Sqoop和Kettle取数性能对比

因为sqoop底层调用的是mapreduce,所以小数据量性能会受到限制。

十万,百万千万级别kettle有优势。

亿级别的数据sqoop优势明显。

15、Kettle性能调优

1)调整JVM大小进行性能优化,修改Kettle根目录下的Spoon脚本。

(2)调整提交(Commit)记录数大小进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000

(3)尽量使用数据库连接池;

(4)尽量提高批处理的commit size;

(5)尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);

(6)Kettle是Java做的,尽量用大一点的内存参数启动Kettle;

(7)可以使用sql来做的一些操作尽量用sql;

Group , merge , stream lookup,split field这些操作都是比较慢的,想办法避免他们.,能用sql就用sql;

(8)插入大量数据的时候尽量把索引删掉;

(9)尽量避免使用update , delete操作,尤其是update,如果可以把update变成先delete, 后insert;

(10)能使用truncate table的时候,就不要使用deleteall row这种类似sql合理的分区,如果删除操作是基于某一个分区的,就不要使用delete row这种方式(不管是deletesql还是delete步骤),直接把分区drop掉,再重新创建;

(11)尽量缩小输入的数据集的大小(增量更新也是为了这个目的);

(12)尽量使用数据库原生的方式装载文本文件(Oracle的sqlloader, mysql的bulk loader步骤)。

16、ETL测试主要包括:

1、数据量测试。这个应该不用多说,你从源头拿来多少,存到目标表里又是多少,是否一致,是否正确

2、数据转换测试。主要是对数据格式的合法性进行验证。测试参考点主要包含:

时间、数值、字符等数据的处理,是否符合数据仓库规则,是否进行统一的转换 是否有超出维表或者业务值域的范围

是否捕获字段空值,或者需要对空值进行替换为其他含义值的处理

主键是否唯一

特殊符号或者乱码符号的处理规则

脏数据的处理

3、抽样测试。在转换完成之后要对转换之后的关键字段验证,还有源表和目标表的映射是否正确

4、etl加载策略测试。包含:全量加载(先清空再插入)和增量加载(目标表仅更新源表变化的数据)