数据清洗
(1)空值去除
(2)过滤核心字段无意义的数据,比如支付记录表中支付id为null之类的
(3)对手机号、身份证号等敏感数据脱敏
文件格式
压缩采用Snappy,存储采用orc,压缩比是100g数据压缩完10g左右。
Algorithm remaining Encoding Decoding
GZIP 13.4% 21 MB/s 118 MB/s
LZO 20.5% 135 MB/s 410 MB/s
Snappy 22.2% 172 MB/s 409 MB/s
Tez引擎优点
Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。
集群规模
2019Q1日活达到100万
原始数据100G,snappy压缩后为20G,5个副本30%留存和2倍冗余后为260G,则每天新增数据为260G
服务器选用256G内存和10T硬盘,满足一年使用不扩容,则集群规模=260 * 365 / 10240 =10台
3台zookeeper
Hadoop宕机
(1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
(2)如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。
beyond physical memory
1.查看yarn为每个container分配的内存区间
hive>set yarn.scheduler.minimum-allocation-mb;
2.查看每个map,reduce默认使用内存的配置大小
hive>set mapreduce.map.memory.mb;
hive>set mapreduce.reduce.memory.mb;
数据倾斜
先预判断是什么问题造成的倾斜,常见的有group by 、count(distinct ) 、 join等情形产生。
1、如果是group by产生的,则可考虑设置如下属性:
set hive.map.aggr=true
set hive.groupby.skewindata=true
2、count(distinct)产生的
如果数据量非常大,执行如select a,count(distinct b) from t group by a;类型的SQL时,会出
现数据倾斜的问题。
使用sum…group by代替。如select a,sum(1) from (select a, b from t group by
a,b) group by a;
3、join 产生的
找出产生倾斜的key(单个key达到100000),然后对倾斜的key进行处理
法一、 将倾斜的key单独提出来,然后进行单独处理,然后在用union all连接处理
法二、 给空值分配随机的key值,保证业务不会受影响,然后在进行join
数据导出到mysql
Ads层数据用Sqoop往MySql中导入数据的时候,如果用了orc(Parquet)不能导入,需转化成text格式
Null存储一致性
Sqoop中导入导出Null存储一致性问题:
Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。
在导出数据时采用–input-null-string和–input-null-non-string两个参数。
导入数据时采用–null-string和–null-non-string。
多任务导出一致性问题
当Sqoop导出数据到MySql时,使用4个map怎么保证数据的一致性
因为在导出数据的过程中map任务可能会失败,可以使用—staging-table –clear-staging
sqoop export \
--connect jdbc:mysql://192.168.27.111:3306/bilibili \
--username root --password 123456 \
--table app_cource_study_report \
--columns watch_video_cnt,complete_video_cnt,dt \
--fields-terminated-by "\t" \
--export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysis_${day}" \
--staging-table app_cource_study_report_tmp \
--clear-staging-table \
--input-null-string '\N'
任务执行成功首先在tmp临时表中,然后将tmp表中的数据复制到目标表中(这个时候可以使用事务,保证事务的一致性)