01
并发工具包复习重点
- 阻塞队列 ArrayBlockingQueue,LinkedBlockQueue。
- ConcurrentHashMap 和HashTable对比。线程安全,性能高。
老版本引入分段锁(桶)机制(16)。
新版本引入CAS(无锁算法 Compare And Swap)+链表变为红黑树。 - CountDownLatch 线程递减锁(闭锁)。
- 线程池ThreadPool。小池子大队列,大池子小队列的应用场景。
- RetreenLock重入锁。底层支持公平锁和非公平锁机制。
- 原子性类型,AtomicInteger,AtomicDouble,AtomicBoolean。
zookeeper复习重点
- 了解Zookeeper的应用场景。
- 集群管理,比如集群中某台服务器宕机了,能够知道。
客户端启动时向zookeeper注册自己的临时节点。当此客户端宕机后,则对应的临时节点删除。zookeeper监听节点被删除的事件,从而获知服务器的状态变化。
综上,Zookeeper是通过:临时节点+监听机制来管理集群
- 做一的命名服务
需要确保命名的唯一性。所以可以利用zookeeper的路径唯一性来实现这个需求。
比如服务器1:/server/01
服务器2:/server/02 - 协调服务通知
- 实现分布式锁服务
通过顺序节点,判断最先抢注的服务器,从而分配浆糊。
如果要褥现公平锁机制:根据顺序饕的大小分配。
如果要实现非公平锁机制:重新抢注。
- 提供信息的发布和订阅
监听节点数据发生变化的事件。
- 综上,Zookeeper可以提供很多中心服务,套路是:各类型节点+监听
Zookeeper的节点类型
- create /park
普通持久节点 - create -e /park
临时节点 - create -s /park
顺序节点 - create -e -s /park
临时顺序节点
复习Zookeeper的选举机制
Zxid 最大事务id
选举id
过半选举。
- 分布式数据 一致性及相关的算法
- 2PC 算法 二阶段提交协议算法
- 3PC 算法 三阶段提交协议算法
- Paxos 算法 过半性算法,当时Google一篇论文用到了该算法。
Zookeeper就是借鉴了这篇论文做的开源实现。
02
Zookeeper重点
-
ZAB协议,Zookeeper Atomic Broadcast,原子广播协议。
- 实现分布式数据一致性
- 支持崩溃恢复
Leader收到事务请求后,会为些事务分配一个全局递增的事务id。
Leader将事务写入到本地的事务log里
Leader将事务发给各个Folloower
Follower收到事务之后,执行事务。(执行事务,指的是将事务写入到本地事务log里,如果写入成功,表示事务执行成功,如果写入失败,执行事务失败)
Leader收集反馈的信息,如果满足过半,就发起提交事务的指令。(提交事务,指的是将事务引起的变更在内存中更新(客户端是从Zookeeper的内存中获取数据))
挂Follower再次启动时,会找自己所拥有的最大事务id,并发送给Leader。
Leader收到后,确定事务同步点。并创建对应的事务队列,将事务放到队列汇总。
Follower做事务恢复,在恢复未完成之前,是不提供读服务,避免脏读情况。
-
Zookeeper是通过何种机制防止脑裂?
脑裂指的是一个集群中出现多个Leader,造成事务同步的紊乱。
Zookeeper通过EpochId机制来防止脑裂。即每当选举产生一个新Leader,EpochI都会递增+1.Follower只接收EpochId最大的Leader发来的事务。
Hadoop
Hadoop的优势:廉价,高效。
推荐的书籍
- zookeeper:<从Paxos到Zookeeper:分布式一致性原理与实践> 看第4章
- hdfs<深度剖析Hadoop HDFS>看第一章
- yarn<Hadoop技术内幕:深入解析YARN架构设计与实现原理>看第2章
MapReduce重要组件
- Mapper组件
- Reducer组件
- Partitioner组件(Hadoop默认用的是HashPartitioner,会按Mapper输出key的Hash分区,从而确保相同的Mapper输 出key落到同一个分区里)分区指的是ReduceTask
- Combiner组件(先在Map端合并后再发给ReduceTask)
作用:- 减少reduceTask的合并负载
- 减少网络数据传输,节省带宽
- InputFormat组件。更改Mapper的输入Key,输入value
- OutputFormat组件。更改输出到结果文件的格式。
MapTask和ReduceTask的任务数量
- MapTask数量=Job的文件切片数(文件切片不是文件切块)
文件切片=InputSplit,属于逻辑切块,通过对象来描述,包含path start length
所以文件切片中没有文件数据
文件切t块=当把文件上传到HDFS时,会被物理切块,存到DataNode上。 - ReduceTask数量,和切片没有关系,默认就1个。通过代码进行设定(job.setNumReduceTasks(3))
- MapReduce的排序
MR会对Mapper的输出排序,具体如何排序,取决于Mapper输出key类型里的compare方法 - MRjob执行流程
- 在领取Maptask时,满足数据本地化策略。避免通过网络传输数据,节省带宽。
- MapReduce Shuffle过程 (重点)
- MapReduce的Join,可能会引起数据倾斜,如何解决。
上图演示的是reduce-side-join。这种join方式可能引起数据倾斜。
所以,可以采用map-side-join来实现
上图演示的是map-side-join的思想,将小表数据加载到每个MapTask缓存中,然后在MapTask完成Join。可以避免产生数据倾斜。 - Yarn(重点)
Yarn的三种高度器
- FIFO调度器(先来先服务调度器):优先将集群的全部资源运行第一个来的job1。待job1运行完之后,再运行job2。
应用场景:当遇到一个优先级很高的job,想快速完成,可以使用此调度器。 - Fair调度器(公平调度器)
集群只运行一个job1,此时用的内存:16GB
如果再次提交一个job2,此时这两个job用的内存:8GB
依次类推,会根据job的任务平均分配资源。 - Capacity调度器(容器调度器,默认的)
引入Container概念封装资源。
MapReduce如何处理小文件
- 开启JVM重用机制
- 将多个切片合成一个切片或少量切片
job.setInputFormatClass(CombineTextInputFormat.class);
默认合成切片的大小是128MB
Flume
核心组件
-
Source
- Avro(重要且常用)
- Http
- NetCat
- SpoolDir(本地目录数据源)
- Exec
-
Channel
- Memory
- File
- Jdbc
- 内存溢出通道
-
Sink
- Hdfs
- Logger
- Avro
- Kafka
- File_roll Sink
- HiveSink
-
Interceptors(拦截器,绑定在source上)
- TimeStamp
- Host
- Static
- UUID
- Regex_replace
-
Selector
- replicating复制模式(模式)
- multiplexing路由模式
-
Process
- 失败恢复
- 负载均衡
数据仓库的概念
- OLTP 在线联机事务系统(数据库)
- OLAP 在线联机分析系统(数据仓库)
- ETL(Extract-Transform-load) 数据提取、转换、加载
- Hive的表类型:
- 内部表,外部表
- 内部表和外部表都可以是分区表。
- 分区相关指令。创建分区表partitioned by。为一个表添加分区信息 add partition。删除分区 drop partition。修改分区 rename to。
- 分桶表
HIVE
- Hive常用的字符串操作函数
- UDF
- Hive的各种join操作
left semi join - Hive如何解决数据倾斜问题
- group by 分组操作可能会产生数据倾斜.比如word count 单词上次统计案例.解决思想,将一个MRJob拆解成两个Job.ob做随机分区.第二个Job做最终的分组统计 set hive.groupby .skewindata=true
- join 连接操作可能会产生数据倾斜.解决思想:小表-大表做joim->利用map side join,把小表写在左边.大表-大表join->利用分桶表
- count 全局计数可能会产生数据倾斜.解决思想:set hive.groupby.skewindata=true
- HIVE调优
- Sqoop
- HIVE JDBC
- HIVE 体系结构