1.分布式计算
1.1 分布式计算概念
分布式计算的方法主要包括传统的离线计算、批量计算,还有较新的增量计算和流式计算。离线计算和批量计算侧重于吞吐量,而增量计算和流式计算侧重于实时性。对于物联网等实时性要求较高的行业,增量计算和流式计算有着较大的优势。
1.1.1 分布式计算范式
1.1.1.1 数据收集
数据收集方式包括拉和推两种方式。
拉表示分布式计算集群主动从外部获取数据,比如从Kafka、HBase、HDFS中拉取数据。但是由于分布式计算可能会有回退的情况,需要第三方系统授权回退,比如Kafka的Offset表示消息当前的位置。
推表示被动从外部接收数据,需要实现HTTP处理模块。
1.1.1.2 Shuffle机制
Shuffle是任意两节点之间的通信机制,比如把map阶段RDD的数据都抽离出来,然后按照一定规则分发给reduce阶段RDD。Shuffle机制也同样有两种方法,也就是拉(Pull)和推(Push)。顾名思义,拉是下游节点主动拉去上游节点的数据,而推是下游节点被动获取上游节点推送的数据。
1.1.1.3 计算
LongLive
流式计算不同于离线计算,流式计算是一个长进程模式。不同于离线计算的调度方式,不同的消息机制
容错
任务跟踪机制
有状态计算
中间状态的存储方式;容错
分布式挑战
- 拓展能力
- 集群规模的上限是多少,比如最多可以有多少个单集群(利用率也要超过60%)
- 计算作业是否可以线性增加
- 数据倾斜
- 用户可以重新定义等价的DAG(DAG全程有向无环图)来避免数据倾斜(牺牲性能),也就是一台设备过慢可能会托慢整个系统的计算
- 倾斜带来超时和雪崩,比如节点计算超时,上游节点发送更多的数据到下游造成更加严重的拥塞(所以流控机制非常重要)
- 数据动态的变化,实时调整
- 服务化需求
- 数据高可靠,数据中间状态的可靠性
- 服务可用性,集群扩容、系统代码升级时是否需要停止服务;单节点故障是否会导致整体服务的不可用
- 通用需求
- 多租户管理:鉴权管理,资源隔离
- 计量计费、安全体系、运维体系等
增量语义
f(x + delta) = g(f(x),delta)
-
阿里提出的MRM(Map-Reduce-Merge)
Map作为Local计算;Reduce作为本批内的Aggregate计算;Merge进行跨批全局聚合操作。
以WordCount举例,map将单词变成k是单词名,v是1的键值对;Reduce进行求和操作;Merge实现将本次和之前的结果的聚合。
MRM的M和R兼容传统的Map和Reduce,而Merge实现了将旧的数据和新的数据进行合并。
void map(BatchInfo batchInfo, Record recore, Emitter<X, Y> emitter){} void reduce(X key, List<Y> values, Emitter<Z> emitter){} T merge(T oldValue, X key, Z Value, State state, Emitter emitter)()
有状态计算-增量
加、乘可以实现简单的增量;开方等不可以。可以增量的计算不需要将所有的历史数据都保存,而不可以增量的计算需要保存历史数据。这个时候就需要辅助存储设备,需要考虑到容错、存储等问题。storm和Kinesis系统将状态处理问题抛给了用户(问题是对于用户而言太过复杂),而MillWheel系统则将状态存储在Bigtable(Google技术)中(问题是Bigtable也有吞吐上限)。阿里采用存储与计算合一的方法,
1.1.1.4 Batch
-
Batch是系统跟踪数据和时效性处理的最小单位
-
一个可以scale的概念,两个极端:
- 退化为全量计算
- 一条数据处理一次
1.1.1.5 消息机制
-
消息丢失问题
-
消息源头重发
优点:无故障情况下运行特别流畅
缺点:DAG大,加剧网络拥堵,错误恢复时间长
-
节点内部重发
优点:错误恢复雪崩问题缓解
缺点:每一步都要落地
-
上述两种方法自动选择(alibaba)
DAG部分源头重发,部分父亲节点重发
-
2.分布式存储
欢迎关注我的微信公众号
互联网矿工