新电商项目中遇到的一些问题分享

数据清洗

(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表中的数据复制到目标表中(这个时候可以使用事务,保证事务的一致性)

你可能感兴趣的:(新电商项目中遇到的一些问题分享)