『随笔』写在新学年伊始
嗯…如你所见,我最近停更了好久,因为暑假发生了一堆的事情,让我的心态很差
而且,我也没能完成我的暑假开始立的 Flag
我本来写了很长一段话想说明情况,但是最后还是删掉了,还是不提了吧
已经浪费了太多时间,就更要抓紧现在的时间,赶紧让生活步入正轨,去做更多有意义的事情
来聊些轻松些的吧!比如最近还发生了哪些正面的事情呢?
最近的好事情
考试顺利通过
暑假的时候,得知自己六级裸考过了,还是挺高兴的
六级的话,不要太焦虑就行了,我四六级一张卷子都没做过,就考前 B 站上找些视频看看就去考了
这东西越早考越好,其实高考一考完就去考,我不相信有人过不了,毕竟我的英语水平也好不到哪里去,这东西越往后拖越难考
另外一个就是驾照了,我把科目三考过了
科目三就是好好记路线+不要紧张就行了,考试前一晚自己在脑海里过一边路线,看看有没有地方没记住的
把每个细节都拿捏住了,基本就没有什么大问题
青训营顺利结营
第四届字节跳动青训营顺利结束了,虽然没有拿到大项目的奖,但是也能拿到结营证书,这也算是一件好事情
至少有个交代嘛,而且这东西最后也就大概 50 个人拿到了
而且前几天,我也拿到上一届的证书和纪念品了
这东西在我放暑假回家了才送到学校,所以只能放同学那里,等开学再过来拿(
重装了系统
细心的你肯定已经发现了,我现在用的不是 Windows 了
那是 Mac OS 嘛?其实不是,只是我的 Ubuntu 装了个 Mac 的主题
最近我装了个 Windows + Linux 双系统,并开始把 Linux 作为主力使用,只有打游戏的时候才用 Windows
Windows 和 Linux 各 ...
『Go』使用 Redis 搭建简易分布式锁
本篇总结于 Go + Redis 实现分布式锁
鄙人最近在参加分布式存储的项目时学习了本内容,特此记录
为什么要用到分布式锁
先从本地的锁开始吧,在 Golang 中可以对本地的某一资源进行加锁(如变量等),以保证你在使用该资源的时候不会被其他协程更改
而在分布式系统中,若各个节点要同时使用某一个公共资源(比如说交易要修改用户存款,进程修改日志文件等),很容易就会有读写冲突、写写冲突。这时就需要一种抢占资源的机制,在你使用的时候锁住资源,保证你在使用的时候其他人不会捣乱,确保并发安全
而一种简单的实现方法就是使用 Redis 搭建分布式锁
简单的原理
这东西听上去很高大上,但是其实非常简单
就是你在访问资源前,先尝试在 Redis 处做个标记
例如你欲编辑 /file/hello.txt ,就尝试将 ["/file/hello.txt"] = 1 写入 Redis
而其他人也想做标记的时候,就会发现你已经做过了,就知道你已经抢占了资源,要等你释放
项目实践
本人的项目地址:https://github.com/tiktok-dfs/dfs
首先肯定要初始化 Redis ,因为项目是本地单机测试的,所以就以单机服务为例
1234567891011var RedisDB *redis.Client// InitRedis 初始化redis,用于分布式锁func InitRedis() { RedisDB = redis.NewClient(&redis.Options{ Addr: "localhost:6379& ...
『Go』gRPC + Protocol Buffers 简易上手指南
鄙人最近在参加青训营的项目,要完成一个分布式存储系统,里面就用到了 gRPC 框架,学习之后有所收获,所以特此记录
理论知识
什么是 RPC
要知道什么是 gRPC ,先要了解 RPC(Remote Procedure Call,远程过程调用)
什么叫做远程过程调用捏?比如说,你在写程序的时候,可以很方便地调用你本地写的函数,但是,如果你想调用其他程序的函数,那该怎么办呢?
答案是使用 RPC ,它做到这一点,即使目标函数的程序跑在地球的另一边,都没有问题
什么是 gRPC
gRPC 是一个出名的 RPC 框架,它速度很快,而且支持多种语言,它允许你可以在 Go 中调用 Java 乃至 Python 中的函数
多语言支持是怎么做到的呢?那中间必然是要借助某种通用介质,在这里就是 Protocol Buffers
什么是 Protocol Buffers
Protocol Buffers 是谷歌搞的一种数据交换格式(就类似于 JSON ,XML 之类的),常被简写成 protobuf
但是与 JSON 之类不同的是,Protocol Buffers 不是明文存储的,而是压缩打包成二进制的,这也就是 gRPC 选择 Protocol Buffers 的原因,毕竟传输起来方便
你要先通过 .proto 文件定义好你的数据结构和调用函数,然后用编译器编译出 xxxxx.pb.go 文件(里边有一堆打包和解包相关的函数方法)和 xxxxx_grpc.pb.go (里边是关于 RPC 的函数方法),之后在你的项目里调用就好了
上手实践
准备环境
根据官网上的教程,你有两件事要做:安装 ...
『字节青训营-4th-大数据』L20:大数据可视化理论与案例分析
相关链接🎶 学员手册:【大数据专场 学习资料七】第四届字节跳动青训营 - 掘金
定义
什么是可视化
什么是数据可视化
静态/不可交互 -> 动态/可交互
数据可视化作用
拿破仑进攻/撤退图,粗细表示军队人数,与下面的温度图表有很强的关联性
统计学特征
原理
数据
定义
数据和数据集
表格
多维表格
网络图和树图
场
几何数据
属性分类
编码
认知
图元
通道
编码
举例
编码有效性
交互
分类
(几个gif)
案例
这个太经典了
这个也经典,后面销量其实是下降的
历史上的传染病人口死亡规模
很多人没有达到预测年龄就被枪击死亡了(动图)
学习
综合
理论
编程
前沿
实践
我们在做的事情
课程总结
『字节青训营-4th-大数据』L19:用户数据分析理论与最佳实践
相关链接🎶 学员手册:【大数据专场 学习资料七】第四届字节跳动青训营 - 掘金
P1:基础篇
为什么要做用户数据分析
数据分析的各个环节
数据分析全景图
指标体系和指标分级
手游业务指标体系示意
口径:你怎么算出来的
搭建指标体系的价值
数据分析的各个环节
埋点简介
常见的分析工具
维度:分组项(日期和操作系统),指标:设备去重数
聚和,最大最小…
可以,但一般会先划分
数据可视化
选择合适的
数据分析的流程和案例
分析流程
案例
获取
激活
思考各个环节,哪些是要重点改进的地方
留存
收入
可以得出结论,这个游戏就是靠头部用户来维持运营的,来指导产品经营
数据分析常见的问题
总结&思考
P2:进阶篇
机器学习概览
为什么要机器学习
什么是机器学习
例:垃圾邮件过滤程序
开发者自己从现有的样本提取特性信息,对于新的样本又要手动增加过滤规则
使用机器学习,自动总结、添加规律
机器学习算法有哪些
机器学习的挑战有哪些
特征工程
概述
流程
数据理解
结构化/非结构化
定量/定性
数据预处理
衡量数据质量
准确性
完整性
一致性
时效性
可信性
解释性
主要步骤
数据清洗
缺失值
异常值
噪声
数据集成
实体识别
冗余
数据值冲突
数据规约
维度规约
维度变换
数据交换
规范化
离散化
稀疏化
特征构造
聚合
转换
特征选择
Filter 方法(过滤式)
Wrapper方法(封装式)
Embedded方法(嵌入式)
(这些在学习资料 ...
『字节青训营-4th-大数据』L18:数据中心建设实践思路与企业实践
相关链接🎶 学员手册:【大数据专场 学习资料六】第四届字节跳动青训营 - 掘金
企业数据架构
数据集成
业务数据收集
CDC
Log
系统间同步传输
数据生产 - 离线&实时
数据服务
数据中心案例
核心业务指标
数据查询要求
实时数据生产
数据分析
数据产出目标
数据生产可行性
计算分析
目标
计算架构 - Lambda
数据产出
查询的时候把离线和实时合并后返回
问题
过去的离线数据在今天发生变更,这是一个问题
计算架构 - 全量计算
问题解决
全量计算问题
计算架构 - 架构选择
计算难点
全量数据获取 - Hybrid Source
准确 - 处理去重&更新
准确 - Join 乱序问题场景
效率 - 聚合
效率 - Join
数据质量
任务稳定性
数据持续正确性
计算总结
数仓建设
数据组织方案
元数据管理
数据服务
查询快
引擎选择
怎么做
列存的重要性
筛选
分区
主键构建
主键查找
原始信息关联
计算向量化
执行计划
应用优化
宽表构建
提升信息密度
稳定
数据管理
课程总结
『字节青训营-4th-大数据』L17:深入理解 K8S 资源管理和调度
相关链接🎶 学员手册:【大数据专场 学习资料六】第四届字节跳动青训营 - 掘金
Kubernetes 简介
为什么要 k8s
k8s 是什么
k8s 核心概念
Pod
spec:pod的核心配置,可以配置多个 containers
Volume/PV/PVC/StrorageClass
Volume 太老了直接跳过
Deployment
template 就是一个 pod 的声明
StatefulSet
Node
k8s 设计准则
声明式而不是命令式:告诉 k8s 最终想要什么状态,而不是具体要做什么做什么
控制循环:怎么生成中间步骤呢?通过控制循环
简单
模块化
向下兼容
开放
k8s 架构
k8s 核心通信机制 List-Watch
这里老师讲得真的很清楚,而且认为这个机制是 k8s 最大的特色
k8s 核心功能
资源管理
资源上报
节点资源样例
资源分配
状态维护
资源回收
调度
资源申请
request和limits:底线和上限
调度流程
示例
MySQL
WordPress
优化实践
k8s 还可以更好
字节的一些工作
资源管理
功能增强
性能优化
调度质量
k8s 和 Yarn 的一些不同
k8s:拿着应用找节点
yarn:拿着节点找应用
k8s的调度质量高,但是性能差
课程总结
『字节青训营-4th-大数据』L16:走进 Yarn 资源管理和调度
相关链接🎶 学员手册:【大数据专场 学习资料六】第四届字节跳动青训营 - 掘金
YARN 概述
初识调度系统
场景导入
一种简易分配模型
优化的分配模型
调度系统演进
调度系统发展的背景
调度系统解决的问题
调度系统预达的目标
调度系统模型
主要是前两者用的比较多
YARN 设计思想
演化背景
离线生态
面临挑战
YARN 整体架构
系统架构
任务运行生命周期核心流程
这里视频里讲得很清楚
Client 把任务提交到 Resource Manager,然后 RM 会拉起 AM
AM 再用心跳交互资源的申请和分配,再去拉起对应的节点
运行中,AM 会监控,运行结束后 AM 会向 RM 注销
核心模块
Resource Manager
整体架构
主要职责
状态机管理
RMApp 状态机
RMAppAttempt
RMContainer
RMNode
调度器分析
任务/资源组织
调度流程
典型调度器
Node Manager
整体架构
主要职责
状态机管理
Application
Container
LocalizedResource
节点健康检测机制
重要机制
调度策略
Fair Share 调度策略背景
Instantaneous Fair Share 定义
Instantaneous Fair Share 计算逻辑
DRF 调度策略
DRF 调查策略描述
DRF 调度策略计算逻辑
事件机制
状态机管理
事件处理模型
容错机制
公司实践
Gang 调度器
为什么要开发 Gang 调度器
...
『字节青训营-4th-大数据』L15:浅谈分布式一致性协议
相关链接🎶 学员手册:【大数据专场 学习资料六】第四届字节跳动青训营 - 掘金
分布式系统
分布式系统面临的挑战
理想中的分布式系统
从 HDFS 开始
案例 - KV
小结
一致性与共识算法
从复制开始
最好不要都接受请求,应设置一个主一个从
如何复制
两种策略,但是第一种的代价太高了
关于读操作
什么是一致性
复制协议
当失效发生
小结
共识算法
小结
从 Raft 入手
Paxos
Raft
复制状态机(RSM)
Raft 角色
客户端向 s2 发送请求
s2 把请求转成 log ,然后发送给 follower
多数完成,就回复客户
旧 leader 无响应后,发现的节点发起投票,获得半数投票即成为新 leader
Raft 日志复制
小箭头:确认已经提交了的 log
Raft 从节点失效
没有真正对比 log 的内容,只需要对比 term 和 index
Raft Term
Raft 主节点失效
Raft Leader failure
格子上面的数字是几号 term
为什么第一个状态 s1 的 term 都是 1 ?可以想象之前 s1 是 leader,然后突然卡死了,选了 s2 是新 leader
此时 s2 挂了,然后 s3 请求成为 leader ,s1 的 term 后面也变成了 3
状态是怎么复制的呢?一直往前检查,如果有冲突就从节点服从主节点
Raft 安全性
同 Term
跨 Term
小结
实现细节以及未来
案例 - KV
为什么读操作不能直接读的问题
回到共 ...
『字节青训营-4th-大数据』L14:LSMT 存储引擎浅析
相关链接🎶 学员手册:juejin.cn
LSMT 与存储引擎介绍
LSMT 的历史
LSMT 是什么
存储引擎是什么
LSMT 存储引擎的优势与实现
LSMT 与 B+ Tree 的异同
但 LSMT 是追加写,然后后台择机合并
二者在逻辑上实际是等价的
为什么要采用 LSMT 模型?
LSMT 存储引擎的实现
Write
Snapshot & Supervision
Get & BloomFilter
又是熟悉的 BloomFilter(
Compact
用读放大的增加换取写放大的减小
LSMT 模型理论分析
云原生的 LSMT 存储引擎 - HBase
LSMT 模型算法复杂度分析
Level
这个失效率的推导非常复杂
Tier
思考题
这里建议看原视频,鄙人一直在听天书(
总结
LSMT 存储引擎调优案例与展望
TerarkDB
TerarkDB& Abase & ByteGraph
Flink
新硬件
新模型
新参数 / 新工况
这个是最复杂的
总结
『字节青训营-4th-大数据』L13:Parquet 与 ORC:高性能列式存储
相关链接🎶 学员手册:【大数据专场 学习资料五】第四届字节跳动青训营 - 掘金
列存 vs 行存
数据格式层概述
分层视角下的数据形态
两种数据查询分析场景:OLTP vs OLAP
OLTP:行式存储格式
OLAP:列式存储格式
总结
Parquet 原理解释
Parquet 简介
Parquet in Action
DDL
Spark
Parquet vs Text Format
做了压缩,而且性能反而还会有提升
Dremel 数据模型
数据布局
编码 Encoding
列基数不大:去重后的数据不多
压缩 Compression
索引 Index
这东西在第一节课也出现了
排序 Ordering
过滤下推 Predicate PushDown
Spark 集成 - 向量化读
深入 Dremel 数据模型
老师说听不懂没关系,哈哈哈
小结
ORC 详解和对比
ORC 简介
数据模型
数据布局
ACID 特性简介
AliORC
索引增强
小列聚合
异步读取
思考
Parquet vs ORC
性能
选择
小结
列存演进
数仓中的列存
存储侧下推
Column Family 支持
总结
『字节青训营-4th-大数据』L12:从 Kafka 到 Pulsar:数据流演进之路
相关链接🎶 学员手册:【大数据专场 学习资料四】第四届字节跳动青训营 - 掘金
消息队列概述
消息队列的应用场景
上下游解耦
MQ 消息通道
Eventbridge 数据总线
Data Platform 流数据平台
主流消息队列的相关介绍
Kafka 详解
架构介绍
Zookeeper
Broker
Controller
选举
作用
Coordinator
高可用
副本 ISR 机制
写入 ACK 机制
如何保证消息不丢
ACK = -1 并且 最少 ISR = 2
先看左下角,只有一个 leader 而没有 follwer 的情况,然后再看上面
结合右侧概念解释理解
第一个策略更注重一致性
第二个更注重可用性
集群扩缩容
扩容步骤
扩缩容问题
未来演进之路
运维/调优经验介绍
单机吞吐
in_sync_replica 看业务重要性,2或3
集群参数配置
扩缩容优化
指标可视化
Pulsar 详解
Pulsar 架构介绍
Pulsar Proxy
非必须,但是作用很大
Pulsar Broker
Pulsar Storage
Pulsar IO
Pulsar Function
Bookkeeper 介绍
整体架构
基本概念
Bookkeeper Ledger
Bookkeeper 新建 Ledger
Quorum 写:副本之间没有主从概念,例如 3 副本同时写,2 副本完成就算完成
Bookkeeper Ledger 分布
写一致性
读一致性
读写分离
Bookkeeper with p ...
『字节青训营-4th-大数据』L11:数据湖三剑客:Delta Lake、Hudi 与 Iceberg 详解
相关链接🎶 学员手册:【大数据专场 学习资料四】第四届字节跳动青训营 - 掘金
发展历史
数据湖发展阶段1 - Hadoop
数据湖发展阶段2 - Hive
数据湖发展阶段3 - 湖仓一体
存储计算不分离、结构化数据
业界三大数据湖
关于“数据湖”
核心技术
文件结构
Time travel
Transaction
原子性
事务隔离
Schema Evolution
各有所长
Iceberg
Well-designed Metadata Layer
s1 比 s0 多的就是最右边的一个 manifest file,而对应的就是最右边的 data files
Data File Filter
Hidden Partition
Hudi
Timeline Service & Upsert & Incremental
这里建议看原视频,讲的还是很清楚的
Copy On Write
更新的时候把所有列读到内存,改完再塞回去
Merge On Read
更新的时候把变动放到旁边,然后读的时候再合并
Delta Lake
流批一体
总结场景
三个数据湖的异同
三个数据湖的热度
技术选型
字节场景举例
课程总结
『字节青训营-4th-大数据』L10:深入浅出 HBase 实战
相关链接🎶 学员手册:【大数据专场 学习资料四】第四届字节跳动青训营 - 掘金https://juejin.cn/post/7124948585614934029#heading-0)
HBase 适用场景
什么是 HBase
HBase 和关系型数据库的区别
HBase 数据模型
这种类 JSON 的格式看上去也是很清晰的
使用场景
典型应用
半结构化 / 字典序有序索引的数据
“近在线” 海量分布式 KV / 宽表存储
写密集的高吞吐场景
HBase 数据模型的优缺点
架构设计
HBase 架构设计
HMaster 主要职责
RegionServer 主要职责
ZooKeeper 主要职责
ThriftServer 主要职责
大数据支撑
HBase 在大数据生态的定位
水平扩展能力
Region 热点切分
切分点选取
切分过程
流量设计
Region 碎片整合
流程设计
Region 负载均衡
调度策略
其他策略
故障恢复机制
HMaster
RegionServer
Distributed Log Split 原理
具体流程
优化空间
最佳实践
Rowkey 设计策略
Column Family 设计策略
参数调优经验
ByteTable - 字节跳动自研分布式表格存储系统
总结
『字节青训营-4th-大数据』L9:HDFS 高可用和高扩展机制分析
相关链接🎶 学员手册:【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金
元数据高可用
高可用的需求
服务高可用的需求
高可用的衡量
故障度量的指标
MTTR(Mean Time To Repair):平均修复时间,系统能多快恢复。
MTTF(Mean Time To Failure):平均失效时间,运行到故障间的时间,一般用于不可修复的系统(制造业)
MTBF(Mean Time Between Failures):平均无故障时间,两次故障间的间隔,一般用于可修复的系统(软件)
可用性的年化
高可用的形式
HDFS 主备同步实现
HDFS NameNode 高可用架构
理论基础 - 状态机复制和日志
NameNode 操作日志的生产消费
NameNode 块状态维护
HDFS 自动主备切换
分布式协调组件 - ZooKeeper
自动主备切换流程 - Server 侧
脑裂问题:多个节点都认为自己是 active,都会去写日志
Fence 机制:会阻止多个节点同时写日志
自动主备切换流程 - Client 侧
过去,只存一个 ND 的地址,但现在会存一组,然后依次轮询,如果是 Standby 就一直往后找,直到找到一个 active
日志系统 BookKeeper 简介
BookKeeper 架构
Quorum 机制
BookKeeper Quorum
BookKeeper Ensemble
数据存储高可用
单机存储的数据高可用机制
RAID
RAID 方案讲解
(梦回中学时代了属于是,之前 B 站见过讲了所有 RAID 的视频 ...
『字节青训营-4th-大数据』L8:HDFS 原理与应用
相关链接🎶 学员手册:【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金
HDFS 基本介绍
HDFS: Hadoop Distribute File System,是 Hadoop 的一个组件
Windows 单机文件系统
Linux 单机文件系统
分布式文件系统
分布式存储系统
HDFS 功能特性
演示环境
前面两个组件是为了高可用的,本节课主要放在 NameNode 和 DataNode 上
(一个演示视频)
架构原理
HDFS 组件
Client 写流程
Client 读流程
元数据节点 NameNode
知道 NameNode 很重要就可以了(
数据节点 DataNode
关键设计
NameNode 目录树维护
思考题:为什么不直接在硬盘上修改 fsimage ?
NameNode 数据放置
(一个关于 block 的演示视频)
DataNode
后面两个绿框里面的编号是通过哈希算出来的
HDFS 写异常处理
Lease Recovery
租约(Lease)就是一个锁
Pipeline Recovery
这是非常复杂的一部分
Client 读异常处理
旁路系统
异步地解决积累的问题
控制面建设
应用场景
使用 HDFS 的公司
初窥大数据生态
演示:PySpark 读写 HDFS 文件
(一个演示视频)
ETL
OLAP 查询引擎
查询引擎很多种,但是都是要对 HDHS 提供支持
HBase
机器学习
通过存储应用