一、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 hadoop104dossh $i "绝对路径"done;;"stop");;esac3)与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 64m2.x 3.x 128m本地 32m 1.1 倍企业 128m 256m 512m 块大小取决于什么?磁盘的读写速度 普通的机械硬盘 100m/s 左右 =》 128m普通的固态硬盘 200-300m/s => 256m高级的固态硬盘 500-600m/s => 512m3、mr shffle 及其优化map方法之后,reduce方法之前 ,混洗的过程 叫shuffle 4、yarn1)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 在配置文件中 全类名$builder2)选择器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个byorder by 全局排序 容易OOMsort by 排序d by 分区 sort by + d by => 分区内有序c by 用的比较少5、系统函数date_add date_sub next_day dateformat lastdayget_json_object split substring explode concat concat_ws collect_list collect_set map array string 6、自定义函数1)UDF 一进一出 map 定义类 继承G..UDF 重写里面核心方法 evaluate2)UDTF 一进多出 flatmap定义类 继承G..UDTF 重写里面三个方法 初始化(校验返回值类型及名称) 关闭 process (核心逻辑)3)UDAF 多进一出 sum打包 上传到 HDFS路径 在hive客户端注册 如果自定义函数在脚本中出现,需要在自定义函数前面加上库名7、窗口函数over ()rank手写代码 =》 http://139.198.163.91:8083/#/list8、优化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 减少磁盘IO6)列式存储id name age 1 zs 182 lishi 19行:1 zs 18 2 lishi 19列:1 2 zs lishi 18 19select name from user 7)可以提前进行 combiner at,1 at,1 => at,28)合理的设置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 + 副本数大于等于2isr (Leader follower) 有退化为acks=16、如何提高吞吐量1)32m缓存 =》 64m 2)批次大小默认16k => 32k 3)linger.ms 默认是0ms => 5-100ms4)采用压缩 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-100ms4)采用压缩 snappy zstd1)增加分区数 同时要求消费者 增加 对应的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 -15glinux系统要留一部分内存 (页缓存)
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
八、maxwell
同步数据:
实时同步 : maxwell canal flink cdc ogg d...
批量同步 : datax sqoop
mysql =》 hdfs / kafka
1、为什么选择 maxwell 1)支持断点续传2、 为什么不选择flink cdc flink cdc 1.0 有bug 锁表 =》 2.0以上解决了这个问题 2022年初 才升级完毕。3、maxwell 底层原理mysql 的主从复制 模拟的从表
九、datax
批量同步 : datax sqoop
1、为什么选择datax 阿里开源的一个版本
datax 底层: 一个进程 多个线程 单节点
datax处理的数据量 相对来说要小一些
sqoop底层:4个map 分布式框架 sqoop 处理的数据量,相对来说要大一些sqoop 在apache中已经不在维护了。咱们属于中小公司,数据量不是很大 业务数据每天1-2g 2、在使用datax过程中遇到哪些问题 怎么解决的空值问题mysql hdfs/hive null \N datax :改源码让hive建表时候处理sqoop: 直接配置参数hive mysql \N null datax :配置参数sqoop:配置参数3、datax怎么调优的增加内存 增加线程数4、datax每天同步多少数据业务数据:100万日活 =》 10万人下单(50-100元) 10万 * 10-20条日志 * 1k = 1-2g 加购、下单、支付、物流、每天同步时间:业务数据:00:10 同步 10-20分钟就结束了。
十、ds 海豚调度器
目前非常火(中国人参与的多一些) 当前最新版本 3.x (数据质量监控) 咱们上课用的 2.x
1、什么实时执行业务数据:00:10分 开始执行用户行为数据:00:30分 开始执行2、调度器里面的指标挂了怎么办?集成故障报警:邮件、钉钉、微信、电话 睿象云(第三方报警平台)起床 =》 打开电脑 =》 远程连接公司服务器 =》 看一下任务 以及挂的日志=》 手动重写执行该任务 =》 是否有小文件、是否有数据倾斜。=》 如果短时间内不好解决,可以把该任务停止掉。 =》 第二天解决
3、调度器 自身挂了 重启 查看日志:检查磁盘、CPU、内存、。。。4、调度器里面每天执行多少任务平时 不搞活动 100个左右如果搞活动 150-200之间 元旦、春节、元宵节、情人节(365天)、3.8、清明节、端午节、中秋节、5.1 6.1 7.1 8.1 10.1 1024 11.11 6.18 12.12 星期四 星期五 周末
十一、spark
1、入门
1)spark是解决什么问题的? 海量数据的 计算问题
hadoop是解决海量数据的存储和计算
2)spark为什么有自己的调度器 yarn 产生的比spark晚 3)spark的运行模式(1)local 本地调试 测试(2)standalone 在国内用的少 一般对效率要求比较高的场景(3)yarn 国内大量使用(4)m 不会 (5)k8s 是趋势 只不过目前bug非常多,不建议使用。4)常用端口号(1)4040 spark shell(2)7077 内部通信端口 8020/9000/9820(3)8080 8088任务调度(4)18080 19888 历史服务器5)手写spark wordcount =》 flink wordcount 2、sparkcore 1)代码是在哪运行的 D E (和算子紧密相关的)2)rdd五大属性 一般在笔试题中出现(1)标记数据是哪个分区的(2)对数据计算 (3)分区器(4)血缘依赖(5)移动数据不如移动计算3)转换算子(1)单valuemapmappmappwflatmap filter c true 执行shuffle false 不执行shffle 缩减分区repartition true 执行shuffle 重新分区(2)双value交并差 zip 拉链(3)key value partitionby groupbykey 没有预聚合reducebykey 有预聚合reducebykey 没有初始值 分区内和分区间逻辑相同foldbykey 有初始值 分区内和分区间逻辑相同agg..bykey 有初始值 分区内和分区间逻辑可以不相同combinebykey 有初始值(可以变换结构) 分区内和分区间逻辑可以不相同sortbykey mapvalues 4)行动算子take first collect foreach foreachp5)序列化KRYO6)血缘依赖有shuffle 宽依赖没有shuffle 窄依赖7)cache 不改变血缘 数据存储在内存 或者 磁盘中checkpoint 改变血缘 数据存储在 第三方数据库cache + checkpoint 8)任务怎么切分的(1)app spark context (2)job 行动算子个数(3)stage 宽依赖个数 + 1 (4)task 每个阶段 最后一个算子对应的分区数9)广播变量10)累加器3、sparkSQL1)rdd df ds 2) 元数据 计算引擎 语法hive on spark mysql rdd hivespark on hive mysql df ds spark 内置hive derby 外置hive mysql4、sparkstreaming(1)SparkStreaming是纯流式处理框架吗? 他的抽象是谁?(2)背压机制原理(3)Receiver和Direct模式原理(4)kafka的offset维护在什么位置( 0.10)__consumeroffset(5)transform算子里面的代码都在什么端执行(6)UpdateStateByKey状态保存在什么位置? 有什么缺点(7)window有三个概念 用wordcount案例画图说明5、内核 6、优化hive on spark 数据倾斜:1)group by (1)map-side (2)skewindate2)join (1)大小表 join => mapjoin (2)大表大表 skewjoin (3)smbjoin (有条件:分桶有序表)(4)左表随机 右表扩容 (5)建模上 采用累积快照事实表小文件:1)combinehiveinputformat 2)merge 谓词下推CBO
十二、从0到1
现在我是项目经理 兼 产品经理 不懂大数据
招聘你来 负责大数据相关任务。你给我出一套详细的解决方案。出计划的周期 3天。1、具体需求统计日活、新增、留存 等需求 2、数据 业务数据mysql用户行为数据 文件 日志服务器 3、目前就你1个 你可以招聘
4、预算 50万元5、前期离线 兼顾实时6、平时每天 100g左右数据7、项目周期 1个月(3个月 -6个月) 建模(2周的数据调研 搭建 2-3天 =》 2-3天写sql => 其他预留时间)8、数据保存多久 3年苟富贵勿相忘