一、Linux
1、常用的高级命令
ps -ef top iotop netstat df -h free tar rpm
2、查看磁盘使用情况 查看内存 查看端口号
df -h top jmap -heap 进程号 netstat
二、Shell
1、常用工具
awk sed sort cut 知道对应名称 =》 python
关注尚硅谷教育公众号 回复 python 前端 java
区块链 安卓 运维 ui
大数据
2、手写过哪些脚本
1)分发
2)启动停止
#!/bin/bash
case $1 in
"start")
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "绝对路径"
done
;;
"stop")
;;
esac
3)与mysql的导入导出 datax
4)数据层级内部
ods => ads
#!/bin/bash
定义变量 (app= gmall)x
获取时间 (如果输入时间,按照输入时间走;如果没有输入时间,T+1)
sql ="具体逻辑 遇到时间换成$do_date 遇到表 库名.表 自定义函数 库名.自定义函数"
执行sql
3、'' ""
'' 不解析里面变量的值
"" 解析里面变量的值
嵌套:看谁在最外层。
三、Hadoop
1、入门
1)常用的端口号
2.x 50070 8088 19888 9000/8020
3.x 9870 8088 19888 9820/9000/8020
2)常用配置
2.x core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves
3.x core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml workers
2、HDFS
1)HDFS读写流程 笔试题里面出现 有没有朋友
2)小文件的危害
(1)存储
默认情况 一个文件块 不管多小都会占用NN 150字节左右。
128m 一个文件块 =》 150字节
1字节 =》 150字节
小文件过多 浪费 NN的存储内存
128g的内存 能存储多少文件块
128g * 1024m * 1024k * 1024 字节 / 150字节 = 9.1亿
(2)计算
默认情况的切分规则 ,每个文件单独切片。
1字节 =》 1个maptask => 1g内存
128m => 1个maptask => 1g内存
3)小文件怎么解决
(1)har归档 本质减少 NN的存储压力
(2)JVM重用(10次)
开始 3s
干活 2s
.......
干活 2s
结束 3s
(3)combineTextinputformat 解决计算问题
将多个文件放到一起统一切片,减少了maptask的个数,进而减少了集群内存
(10个小文件)
4)默认副本数
3个
5)块大小
1.x 64m
2.x 3.x 128m
本地 32m 1.1 倍
企业 128m 256m 512m
块大小取决于什么?
磁盘的读写速度 普通的机械硬盘 100m/s 左右 =》 128m
普通的固态硬盘 200-300m/s => 256m
高级的固态硬盘 500-600m/s => 512m
3、mr
shffle 及其优化
map方法之后,reduce方法之前 ,混洗的过程 叫shuffle
4、yarn
1)yarn的工作机制
2)调度器
(1)FIFO 、容量、公平
(2)FIFO特点
支持单队列 任务执行顺序 先进先出 在企业中几乎不用
(3)容量特点
支持多队列 资源不够的时候可以借资源 执行任务的顺序,优先满足先进入任务的资源
(4)公平特点
支持多队列 资源不够的时候可以借资源 执行任务的顺序,每个任务公平享有队列资源
按照缺额分配。
(5)在生产环境中应该怎么选择
如果对并发度要求比较高 ,选择公平 中大型公司
如果对并发度要求比较低,选择容量 中小型公司 我们的公司。
(6)默认的队列有几个
默认就一个default
按照框架引擎:hive spark flink mr 用的不多
部门 =》 业务线
用户域 √
流量域 x
交易域 x
互动域 x
工具域 x
一个队列 公司来了一个菜鸟 写了一个递归死循环 整个数仓全部瘫痪
11.11 6.18
四、zookeeper
1、选举机制 半数机制
2、安装什么数台 安装奇数台
3、经验值:
10台服务器安装多少zk 3台
20台服务器安装多少zk 5台
50台服务器安装多少zk 7台
100台服务器安装多少zk 11台
100台服务器安装多少zk 11台
zk台数越多好处:可靠性高; 坏处 效率低
4、常用命令
create get ls delete deleteall
五、flume (三件事)
1、组成
1)taildir source
(1)断点续传、多目录
(2)CDH1.6 apache 1.7 => 自定义source 实现断点续传
(3)重复:
自身想方法 自己采用事务
兄弟帮忙:下游处理 hive dwd spark flink redis 建议采用
2)channel
(1)file channel 磁盘 可靠性高 效率低
(2)memory channel 内存 可靠性低 效率高
(3)kafka channel kafka (磁盘) 可靠性高 效率 高
kafka channel 》 memory channel + kafka sink
apache 1.6版本产生的 当时没有火 1.7之后火了
event(header ,body )
在生产环境中怎么选择:
如果下游是kafka ,优先选择 kafka channel
如果下游不是kafka ,如果追求可靠性 选择flie channel 和钱相关的
如果追求效率,选择memory channel 普通的日志
3)hdfs sink
小文件 : 控制大小 128m
控制时间 30分钟
2、三个器
1)拦截器
ETL拦截器。判断json是否完整
可以不要,下游解析就可以。
时间戳拦截器:解决零点漂移问题。
自定义拦截器步骤:定义类 实现interceptor 重写四个方法 初始化、关闭、单event、多event
静态内部类 builder
打包 上传到flume/lib 在配置文件中 全类名$builder
2)选择器
replicating 默认 把数据发往下一级所有通道
mul ... 把数据选择性发往指定通道
3)监控器
g 如果发现 尝试提交的次数 远远的大于最终 成功的次数。 说明发生了回滚。
增加flume内存
flume-env.sh 4-6g 默认内存非常小
找兄弟帮忙
增加flume台数
日志服务器配置 8g 16g 32g
3、挂了 及其优化
挂了:
如果是memory channel 有可能丢失数据 100个event
优化:
1)hdfs sink
小文件 : 控制大小 128m
控制时间 30分钟
2)增加flume内存
flume-env.sh 4-6g 默认内存非常小
找兄弟帮忙
增加flume台数
六、Hive(10件事)
1、组成
2、与mysql 等关系数据库的区别
mysql hive
数据量 小 大
速度 小 增删改查 大 查询
除了语法接近以外,其他都不一样
3、内部表和外部表区别
元数据 原始数据
删除内部表:元数据 原始数据
删除外部表:元数据
在企业中 绝大多数情况创建外部表;
只有自己使用的临时表,会创建内部表。
4、4个by
order by 全局排序 容易OOM
sort by 排序
d by 分区 sort by + d by => 分区内有序
c by 用的比较少
5、系统函数
date_add date_sub next_day dateformat lastday
get_json_object
split substring
explode concat concat_ws collect_list collect_set
map array string
6、自定义函数
1)UDF 一进一出 map
定义类 继承G..UDF 重写里面核心方法 evaluate
2)UDTF 一进多出 flatmap
定义类 继承G..UDTF 重写里面三个方法 初始化(校验返回值类型及名称) 关闭 process (核心逻辑)
3)UDAF 多进一出 sum
打包 上传到 HDFS路径 在hive客户端注册 如果自定义函数在脚本中出现,需要在自定义函数前面加上库名
7、窗口函数
over ()
rank
手写代码 =》 http://139.198.163.91:8083/#/list
8、优化
1)mapjoin默认打开不用关闭 大小表join
2)提前进行行列过滤 (谓词下推)
join where => where join
3)创建分区表,防止后续全表扫描
创建分桶表,不是必须的。 是在 对海量未知的数据,提前采样,主要用来防止数据倾斜
4)小文件处理
(1)Combinehiveinputformat => combinetextinputformat
将多个文件放到一起统一切片,减少了maptask的个数,进而减少了集群内存
(2)JVM重用 =》 mr中 jvm重用 道理一致 本周减少JVM开关的时间
(3)merge 如果maponly 任务默认打开,如果是mr任务需要手动打开。
单独开启一个mr,将小于16m的文件合并到256m
5)采用压缩
map (压缩 快 snappy) reduce 减少磁盘IO
6)列式存储
id name age
1 zs 18
2 lishi 19
行:1 zs 18 2 lishi 19
列:1 2 zs lishi 18 19
select name from user
7)可以提前进行 combiner at,1 at,1 => at,2
8)合理的设置map个数和reduce个数
128m 数据 =》 1g内存 1CU 1CPU =》 4G内存
map个数 = 切片个数 切片 =max (0, min(块大小,long的最大值))
reduce个数 直接设置
9)更换引擎
mr => spark
9、数据倾斜
1)groupby
(1)map-side 开启 相当于在map阶段提前预聚合
(2)开启 skewindata 在reduce阶段自动帮你 底层二次聚合
(先加随机数 之后 将随机数去掉 再聚合)
2)join
(1)如果是 大表 和小表join =>mapjoin
(2)大表 大表 => skewjoin =true 默认 10万个相同key进入一个reduce
(3)大表 大表 =》 SMBjoin 要求两张表必须是 分桶 且有序的表
(4)大表 大表 =》 不是分桶表 左表随机 右表扩容
累积型快照事实表
10、杂七杂八
七、Kafka 33件事
1、组成 生产者 broker 消费者 zk 4张图
2、分区器分配策略:
1)如果指定了分区,那就把数据发送到指定的分区
2)如果没有指定分区,指定了key,按照key的hashcode值%分区数
3)如果没有指定分区,也没有指定key ,按照粘性分区处理
底层采用的是随机
3、acks 应答
1)0 生产者发送过来的数据,不需要应答,一直发送。在生产环境中几乎不用
2)1 生产者发送过来的数据 ,Leader收到后,进行应答
3)-1 生产者发送过来的数据,Leader和isr里面所有的Follower都收到后,应答。
4、isr
follower和Leader如果在规定的时间30s 能够正常通信一次,该follower就会加到isr里面
超过30s,该follower会进入到osr
5、如何保证数据可靠
acks = -1 + isr里面最小副本数 》=2 + 副本数大于等于2
isr (Leader follower) 有退化为acks=1
6、如何提高吞吐量
1)32m缓存 =》 64m
2)批次大小默认16k => 32k
3)linger.ms 默认是0ms => 5-100ms
4)采用压缩 snappy zstd
7、如何保证数据有序
单分区内有序
我希望 将mysql中某张表 发送到指定分区 key=表名
8、乱序问题
inflightrequest = 1
幂等性 + inflightrequest 《=5
9、重复数据处理
幂等性 + 事务
幂等性(《pid,分区号,序列号》)
pid每次kafka重启后都会重新分配pid, 那也就是一旦kafka重启后,就不能保证数据不重复了
幂等性只能保证 单会话内数据不重复。
事务 (事务开启的前提是幂等性开启) 5个api
初始化事务、启动事务 、提交事务、事务终止、offset相关
10、Leader选举规则
在isr里面活着,按照ar的顺序进行分配
11、Kafka底层怎么存储数据的
1)segment 1g
.log .index (稀疏索引 每4kb数据记录一条索引) .time ...
12、删除策略
数据默认保存时间 7天
1)delete 超期删除(segment中所有数据全部过期 删除)
2)压缩 key v1 v2 v3 .... => key v1
13、kafka如何做到高效读写的
1)kafka本身是集群 同时支持分区
2)采用稀疏索引 每4kb数据记录一条索引
3)底层采用顺序读写 能达到 600m/s
4)零拷贝和页缓存
14、消费策略
7个分区 3个消费者
1)range
针对某一个topic
如果topic数比较多 容易产生数据倾斜
2)roundbin
针对所有的topic
采用轮询的方式, 能够减少数据倾斜
3)粘性 (协作者粘性)
在企业中 range + 粘性
roundbin + 粘性
在触发再平衡后,粘性策略可以保证 不改变原来的消费分区。 性能要好一些
15、再平衡条件
1)如果消费者 和消费者组协调器 通信时间超过 45s 会触发再平衡
2)如果消费者 消费谋批数据的时间超过了 5分钟,会触发再平衡
16、每批次最大拉取的数据量 50m
处理数据,一次最大处理500条
17、Kafka里面数据积压了怎么办
1)增加分区数 同时要求消费者 增加 对应的CPU核数
2)增加消费者 50m => 60m
每批次处理的条数 500条 =》 1000 -3000条
18、如何提高Kafka吞吐量
1)32m缓存 =》 64m
2)批次大小默认16k => 32k
3)linger.ms 默认是0ms => 5-100ms
4)采用压缩 snappy zstd
1)增加分区数 同时要求消费者 增加 对应的CPU核数
2)增加消费者 50m => 60m
每批次处理的条数 500条 =》 1000 -3000条
19、kafka消费数据时
从头消费 --from-beginnging
从当前最新位置消费 默认
我想从任意位置消费
seek(offset 50)
20、可以按照时间进行消费
可以将时间转换为offset 再调用 seek(offset 50)
21、安装多少台
2 * (生产者峰值生产速率 * 副本 / 100) + 1 = 3台
22、压测:生产者峰值生产速率、消费者峰值消费速率
23、副本:默认副本 1个 =》 生产环境中 2-3 个 2个居多
副本多 好处: 可靠性高 坏处:存储资源增加了 降到传输效率
24、速率
100万日活 每人每天产生 100条左右日志
100万日活 * 100条 = 1亿条
1亿条 / (24小时 * 3600s) = 1150条/s
1条日志多大 0.5k -2k 1k
1m/s 峰值速率 20m -30m/s
中午小高峰 7-12点
26、Kafka 默认保存 7天 =》 3天 1天 -》 3年
27、Kafka是否做了监控
kafka eagle manager montor
28、kafka挂了怎么办?
1)重启 zk 是否启动
2)查看日志 磁盘不够(df -h ) 查看内存 (jmap -heap )
查看端口号(netstat ) 查看CPU(top)
3)如果是某个节点误删 了
可以重写服役
29、硬盘选择
选择机械硬盘 底层是顺序读写 可以 600m/s '
30、内存选择
kafka 默认内存 1g =》 10g -15g
linux系统要留一部分内存 (页缓存)
31、网络带宽
20m -30m/s
100m带宽 =》 12.5m/s
需要买千兆带宽
32、CPU核数选择
建议 购买 32核 及以上的服务器
33、分区设置多少
期望吞吐量 100m/s t
生产者峰值生产速率 20m/s tp
消费者峰值消费速率 40m/s tc
分区数 = t / min(tp, tc) = 100/ 20 = 5个分区
企业中通常 3-10个分区
34、设置topic
进可能满足所有消费者 也要用适当的聚合操作
35、自动创建主题
36、Kafka单条日志传输大小
传输超过1m大小的日志 会卡住
调整三个值大小 大于1m 2-10m
标签:note1,分区,默认,kafka,内存,数据,channel
From: https://www.cnblogs.com/siyenvwang/p/18288950