ETL工程师知识点

前言

由于笔者很荣幸的参与了目前所在公司的登月计划,整个登月计划过程中收获也颇丰,在此之前,完全没有和数据打交道的经验,所以一些基本问题需要总结出来,以供自己日后参考;
1、作为一名开发人员,我们不仅要懂得技术的实现要点,也需要懂得自己所处工作组的业务逻辑;
2、作为处理数据的工程师,不仅要懂得写基本的SQL,还需要懂得怎么去用日常的许多基本工具;
3、作为数据开发和同步人员,我们往往有必要懂得如何分析基本的数据;

正文

1、同步数据的过程中,有sa层数据、sda层数据、rda层数据,那么这三种数据层的差异在哪里?
首先,简单说明一下数据来源,sa层的数据来源于sqoop直接抽取mysql数据库的数据,属于一个全量的非实时的数据;
sda层数据则是结合了sa层数据+binlog操作日志,组合成为了一个全量的t-1的实时数据;
binlog数据来源,通过阿里的开源框架canal,模仿mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议,从而收集binary log给slave,得到binlog的字节流日志;
目前同步方式为binlog->Kafka->Spark Streaming->hdfs->Impala刷新;
rda层数据=sda的t-1数据+binlog的t数据,组合成为一个全量的实时数据,保证业务方使用到的数据都是实时的;
2、为什么会有这么多层数据产生,sda层相对于sa层解决了什么,rda层相对于sda层的优点又在哪里?
(1)sda层数据的出现,主要是因为通过sqoop抽取的sa数据,可能会因为sqoop进程启动的时候晚了10分钟,导致最终sa的数据,可能是t-2的数据加上多余10分钟的数据;
为了解决这多处10分钟的数据问题,我们加上binlog的t-1的数据,由于binlog只取最新的数据,所以即使sa有多余10分钟的数据,也最终会被binlog最新的数据给替换,所以组成全新的完整的没有多余数据的t-1数据;
(2)rda层相对于sda层数据的优点在于它是一个实时(t)的数据,同样用sda层数据+binlog数据,是为了避免多余10分钟数据的情况出现,由sda+binlog的数据,又能保证数据是实时的数据;
3、hue平台的使用总结,我们在很多时候会通过hue添加一些大数据组件,其中就有hive和impala,那么两者的区别和各自优势?
在底层表结构和数据变更的时候,hive的实时响应比impala要快很多,所以如果刚刚同步完一张表,如果没有进行refresh或者INVALIDATE METADATA的话,那么hive可能很快能查得到这张表的表结构和同步数据,而impala需要几分钟以后才能开始使用这张表;
impala的查数速度快于hive,这是因为hive的底层查数使用缓慢的MapReduce批处理,而impala直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,大大降低了延迟;
4、表结构变更和表数据刷新:refresh table、INVALIDATE METADATA;
5、在删除表的时候出现外健级联的时候,无法drop table之后:
SET foreign_key_checks = 0; // 先设置外键约束检查关闭
drop table table1; // 删除表,如果要删除视图,也是如此
SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性
6、union all的用法:
select count(*) from test.table where etl_tx_dt=20181226 union all
select count(*) from test.table1 where etl_tx_dt=20181226 union all
select count(*) from test.table2 where etl_tx_dt=20181226 union all
.......
7、删除表分区、显示表所有分区:
alter table test.table drop partition (etl_tx_dt='2019-02-27');
show partitions test.table1;
8、sql验数的经验分析:
(1)计算字段的时候,int、bigint、decimal类型的字段用sum,string、timestamp类型的用count;
(2)当某张表出现数据条数不对的时候,首先要检查基础表数据条数对不对;
(3)当总条数对上,字段条数对上以后,需要去底层分析哪一个字段出现不对,有可能是因为不同的平台,同步数据的方式不同,假设a平台的数据默认null和''为空,都计算为一个字段,而b平台同步完以后,只计算null的条数,而不计算''的条数,这就会导致某一个字段同步完以后,条数对应不上;
解决办法:case when xxx='' then null end as xxx ;
(4)当null也对的上的时候,就需要去定位id,逐步缩小数据失误的范围,最终找到某条id的数据,如:
select floor(id/1000) id,
count(*),max(id),min(id)
FROM test.table
where etl_tx_dt=20190227
group by floor(id/1000)

参考资料

猜你喜欢

转载自www.cnblogs.com/haoxinchen/p/10459432.html