一、数据倾斜专题
1.数据倾斜的表现
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
2.数据倾斜的原因
1)、key分布不均匀、比如null值太多
2)、某些SQL语句本身就有数据倾斜
3)、关联字段类型不一致
3.数据倾斜的解决方案
3.1 参数调节
1)hive.map.aggr = true
Map 端部分聚合,相当于Combiner
2)hive.groupby.skewindata=true
数据倾斜的时候进行负载均衡,当项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
3.2 sql语句优化
1)大小表Join:
使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.
2)大表Join大表,但是0值或空值过多:
把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。比如按userid进行join的情况,userid会有空值
3)Join时关联条件的数据类型不同,如int型的id和string类型的id
把数字类型用cast转换成字符串类型
4)将count(distinct)换为两次group by
二、hive调优
开启并行(多个union all时可提升性能)
设置每个map或reduce能申请的内存
--倾斜处理
--合并小文件
--开启动态分区、分区数据进行合并
--开启mapjoin
1.Join中需要将大表写在靠右的位置
2.尽量使用UDF而不是transfrom
3.大表join小表时,使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.(hive2.0以后默认自动开启map join)
4.将count(distinct)换为两次group by
5.先查出子查询,然后从查询结果中继续查询,避免从全量数据中查询
6.尽量把子查询中的group by移到外层进行
7.先过滤后排序效率相对较高
8.不写select* 而要指明字段
9.将子查询落临时表也算优化
二十一、sparkstreaming调优
1.协调Kafka读取速率、每批次时间、数据处理所需时间,使得每个task 都能在批处理时间内及时处理完 Partition 内的数据
2.对一些经常使用到的rdd,可以调用rdd.cache()来缓存rdd
3.视情况调节用于缓存rdd的内存和用于shuffle的内存
三、CDH搭建过程:
安装操作系统,配置固定ip
永久关闭每台机器的防火墙\SELinux
为每台机器配置ssh免秘钥登录
安装jdk\MySql
配置NTP
Cloudera -Manager Server 和Agent
通过CM安装CDH
四、有监督学习
有监督的学习,即存在目标变量,需要探索特征变量和目标变量之间的关系,在目标变量的监督下学习和优化算法。例如,信用评分模型就是典型的有监督学习,目标变量为“是否违约”。算法的目的在于研究特征变量(人口统计、资产属性等)和目标变量之间的关系。
1.分类算法
分类算法和预测算法的最大区别在于,前者的目标变量是分类离散型(例如,是否逾期、是否肿瘤细胞、是否垃圾邮件等),后者的目标变量是连续型。一般而言,具体的分类算法包括,分类决策树、KNN、朴素贝叶斯、svm等。
分类决策树
1.给定一个训练数据集(数据集中的数据包含划分属性和决策属性,即:“当满足哪些划分属性时,可以给出什么样的决策结果)
比如:我们想知道在什么天气条件下适合户外运动”
2.那么划分属性包含:天气、温度、适度、风力
决策属性包含:是否可以进行户外运动
3.可以根据分类纯度(熵)来指定分类规则,最终将数据分类成决策树的形式
KNN
1、给定一个训练集数据,每个训练集数据都是已经分好类的。
2、设定一个初始的测试数据a,计算a到训练集所有数据的欧几里得距离,并排序。
3、选出训练集中离a距离最近的K个训练集数据。
4、比较k个训练集数据,选出里面出现最多的分类类型,此分类类型即为最终测试数据a的分类。
2.回归算法
预测类算法,其目标变量一般是连续型变量。常见的算法,包括线性回归、逻辑回归、svm等。
线性回归
先给定一个训练集,根据这个训练集学习出一个线性函数
然后测试这个函数是否足够拟合训练集数据
然后挑选出最好的线性函数(代价函数越小,说明我们线性回归的越好,和训练数据拟合的越好)
五、无监督学习
无监督学习,即不存在目标变量,基于数据本身,去识别变量之间内在的模式和特征。例如关联分析,通过数据发现项目A和项目B之间的关联性。例如聚类分析,通过距离,将所有样本划分为几个稳定可区分的群体。这些都是在没有目标变量监督下的模式识别和分析。
1)聚类分析
聚类的目的就是实现对样本的细分,使得同组内的样本特征较为相似,不同组的样本特征差异较大。常见的聚类算法包括kmeans、密度聚类等。
kmeans
(1)、设定数字k,从n个初始数据中随机的设置k个点为聚类中心点。
(2)、针对n个点的每个数据点,遍历计算到k个聚类中心点的距离,最后按照离哪个中心点最近,就划分到那个类别中。
(3)、对每个已经划分好类别的n个点,对同个类别的点求均值,作为此类别新的中心点。
(4)、循环(2),(3)直到最终中心点收敛。
2)关联分析
关联分析的目的在于,找出项目(item)之间内在的联系。常常是指购物篮分析,即消费者常常会同时购买哪些产品(例如游泳裤、防晒霜),从而有助于商家的捆绑销售。如Apriori算法等
Apriori
首先设定最小支持度与最小可信度两个门槛值,满足以上两个条件的前提下,根据这些组合最终推出我们的关联规则
支持度:比如在1000次的商品交易中同时出现了啤酒和尿布的次数是50次,那么此关联的支持度为5%
可信度:在数据集中已经出现A时,B发生的概率
六、hive命令专题:
1.创建内部hive表,然后导入数据
CREATE TABLE t_hive (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
补充:通过stored as parquet可以将数据保存为parquet格式
从本地导入数据到hive表
LOAD DATA LOCAL INPATH '/home/cos/demo/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
从Hive表导出数据到本地文件系统
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/t_hive' SELECT * FROM t_hive;
从HDFS导入数据到hive表
LOAD DATA INPATH '/user/admin/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
从Hive表导出数据到HDFS
INSERT OVERWRITE DIRECTORY '/user/admin/t_hive' SELECT * FROM t_hive;
从其它hive表导入数据到hive表
INSERT OVERWRITE TABLE t_hive2 SELECT * FROM t_hive ;
**也可创建hive表的同时,从其它hive表导入数据:
CREATE TABLE t_hive AS SELECT * FROM t_hive2
2.创建外部hive表
create external table ext_student(id int ,name string) row format delimited fields terminated by '\t' location '/datax';
3.创建分区表
CREATE TABLE t_hft(
SecurityID STRING,
tradeTime STRING,
PreClosePx DOUBLE
) PARTITIONED BY (tradeDate INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
导入分区数据
load data local inpath '/home/BlueBreeze/data/t_hft_1.csv' overwrite into table t_hft partition(tradeDate=20130627);
查看分区表
SHOW PARTITIONS t_hft;
4.正则匹配表名
show tables '*t*';
5.增加一个字段
ALTER TABLE t_hive ADD COLUMNS (new_col String);
6.重命令表名
ALTER TABLE t_hive RENAME TO t_hadoop;
7.仅复制表结构不导数据
CREATE TABLE t_hive3 LIKE t_hive;
8.删表
drop table if exists t_hft;
增加分区:
ALTER TABLE book add PARTITION (category = 'zazhi') location '/user/hive/warehouse/datax.db/book/category=zazhi';
删除分区:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
重命名表:
ALTER TABLE table_name RENAME TO new_table_name
修改列名:
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
增加/替换列:
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
查看表名,部分匹配
SHOW TABLES 'page.*';
SHOW TABLES '.*view';
查看某表的所有Partition,如果没有就报错:
SHOW PARTITIONS page_view;
查看某表结构:
DESCRIBE invites;
查看分区内容
SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
七、杂项专题:
hive调用hql脚本
./hive -d key value -f HQL文件
客单价:
下单数:
过滤下单时间,对order_code进行去重统计
下单金额:
过滤下单时间,对cash_pay进行求和
支付订单数:
过滤支付时间、支付状态,对order_code进行去重统计
支付订单金额:
过滤支付时间、支付状态,对quantity*refund_amount求和
支付取消、退货退款:
除了过滤的时间不同,其余逻辑同上
7、按照需求使用spark编写一下程序?
A、当前文件a.text的格式如下,请统计每个单词出现的个数和第四列每个元素出现的个数
A,b,c,d
B,b,f,e
A,a,c,f
sc.textFile(“a.text”).flatMap(_.split(“,”)).map((_,1)).ReduceByKey(_+_).foreach(println)
sc.textFile(“a.text”).map(line=>{(line.split(",")(3),1)}).reduceByKey(_+_).foreach(println)
guass系统表:
pg_tables
pg_stat
pg_locks
pg_patitions
pg_proc
pg_get_tabledef
字段即使有索引也不一定会走索引:
因为当数据量比较小时,全表扫描比索引扫描更快,因此会自动选择全表扫描
行转列:
1.用union all将各列数据拼接到一列多行
列转行:
1.用case when then 将各行数据提取到多列一行
八、项目专题
华为商城:
简述、分层、数据流、负责的技术和业务、技术栈
之前的数据流:
flink (_cs)/ roma (_rt )/ DAYU (guass中处理, SDI - DWRDIM -DWD-DWS-DM -页面sql)/API服务
现在的数据流:
flink (_cs )/ xdata (_rt )/lts (离线hive处理, DWI-DWRDIM- DMD宽表-DM- guass建外表取hive 上DM层数据-guass上创建存储过程;实时guass处理,流程不变)/ BIDS
大数据中心项目
数据源:集体企业业务系统
技术栈:sqoop、infa、ets、cdh、hive、oracle
业务:经营类业务
视频软件后台数据分析项目
这个app主要是做一对一视频聊天和短视频的,通过对用户、主播的行为分析以及对app浏览日志的分析,为产品的迭代、产品运营状况提供数据支持
搜索关键词:
数据仓库、数仓、etl、大数据、数据开发、大数据工程师、hive、bi、sql、报表、数据可视化、数据分析
标准:
一定 离家距离最多1.5h以内要能到,越少越好
一定 工作内容 用 sqI 的大数据类工作,不找平台开发了
一定 公司规模 大于200人
一定 工作氛围 好
公司性质 国企>私企
一定 是否外包 非外包,实在不行至少是长期项目
一定工资水平1.5+
公司行业 传统行业>互联网行业
一定 加班问题 至少双休,一周最多3天晚上
一定 项目组人数 不算领导不少于3人
一定 最关键的是看看氛围及领导
个人技能:
熟悉电商零售主题域中行为及订单类业务
熟悉性能调优
熟悉hive、guass等olap数据仓库
熟悉postgresql、orcle、mysql等oltp数据库
熟悉数仓建模、数仓分层设计
华为云、天翼云各种服务的使用包括
1.熟悉CDH大数据平台及相关组件的搭建使用
2.熟悉数据收集工具Informatic、ETS、Flume、Sqoop的使用
3.熟悉大数据存储技术,包括HDFS、Kafka、Kudu
5.熟悉大数据处理技术及其底层原理,包括Hive、MapReduce、Spark
6.能使用Scala开发Sparkstreaming任务,对业务数据进行实时处理分析
7.能使用Java开发MapReduce任务及Hive的自定义函数
8.了解Linux系统的基本使用命令
9.了解Hbase、Storm、SparkSQL、Impala、clickhouse、keepalived等大数据平台相关技术
了解Docker技术及数据挖掘常用算法
项目概述
1.华为/荣耀商城项目
项目描述:
本项目是面向华为/荣耀商城的数仓(离线+实时),整合了多种异构数据源,为运营报表的数据分析提供数据支持
责任描述:
1.负责整个离线数仓中各层的数据开发
2.负责零售主题域中用户行为和订单的业务开发
3.负责与产品需求对接,并拆分需求给组内成员