高并发基础
!!NIO - NIO的概念和作用 粘包问题 常见协议 基本概念
Connect Accept Read Write
BIO - 面向流操作字节字符
NIO - 面向通道操作缓冲区
Buffer Channel Selector
Buffer
capacity position limit
Channel
SocketChannel ServerSocketChannel
Selector
select()
粘包问题
使用协议约定传输规则
固定长度数据
约定分隔符
使用特定格式传输
公有协议/私有协议
BIO 同步阻塞
NIO 同步非阻塞
AIO 异步非阻塞
阻塞 非阻塞 - 线程
同步 异步 - 参与并发的双方的协调机制是否需要互相等待
!!Concurrent - java的并发包 - jdk5 - 大量的工具类
!!!BlockingQueue - 阻塞式队列 - 生产者消费者问题
!!!!!!ConcurrentMap - 线程安全的Map - 锁更加的精细 - 读写锁
!!!CountDownLatch - 闭锁
CyclicBarrier
Exchanger
Semaphore
!!!!!!!!!ExecutorService - 执行器服务 - 线程池
手动创建线程池 - ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
shutdown
shutdownNow
通过工具类创建线程池
Executors
!!!!!!Lock - 锁 - 线程同步 - Synchronized
lock()
unlock()
tryLock()
-ReadWriteLock
读锁和读锁可以共存
写锁和任何锁都不能共存
Atomic
!序列化反序列化 - 概念 应用 常见都序列化反序列化技术 为什么不用java序列化反序列化
将内存中动态对象信息 固定为 确定字节信息 - 序列化
将序列化都对象信息 恢复为内存中都对象信息 - 反序列化
持久化
RPC
java原生都序列化反序列化
GoogleProtoBuffer
Thrift
AVRO
!RPC - 掌握概念 - 不需要掌握实现过程
java远程方法调用 是java分布式程序的基础
并不是一项新的技术 而是对若干技术对整合 是一种解决方案
序列化反序列化 网络通信 代理技术。。
!!!Zookeeper
概念
分布式资源协调 分布式环境下的数据的一致性保证
数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能
离线分析
!!!hadoop
Google三篇论文 GFS MapReduce BigTable
Apache开源实现 HDFS MapReduce HBase
Hadoop -> HDFS MapReduce Yarn
HDFS - hadoop分布式文件系统
Block - 块
128MB --> 如果数据不足128MB,存储该数据的Block该多大就多大,128MB是最大大小
默认3个副本
NameNode
存储元数据信息
在内存和文件(FsImage Edits FsTime)中同时存在
[/aaa/bbb/x.txt [b1,b2] 3 b1:DN01 DN02 DN03 b2:DN02 DN04 DN05]
内存:文件及目录结构 组成文件的块的信息 副本数量信息 块和DataNode的映射关系
[/aaa/bbb/x.txt [b1,b2] 3]
文件:文件及目录结构 组成文件的块的信息 副本数量信息
SecondaryNameNode
帮助NameNode来合并元数据的
什么时候合并
时间条件
如果距离上一次合并超过指定时长(3600秒),会触发合并
大小条件
如果edits文件达到来64MB会触发合并
怎么合并
达到合并条件时
NN生成edits.new文件,不再想edits文件中写入新的日志
SNN复制NN中的fsimage和edits文件 将edits合并到fsimage文件中 得到fsimage.ckpt
将该文件复制回NN中,删除edits,将edits.new重命名为edits,删除fsimage,将fsimage.ckpt重命名为fsimage
DataNode
真正存储数据的节点,以Block为单位来存储数据,DataNode并不知道也不关系Block属于哪个文件,只是根据要求以Block为单位处理数据。
和NameNode保持心跳 告知自己的存活状态,并在心跳包的响应中接受NameNode的指令
副本存放策略:
如果当前上传者就是一个DataNode节点,则自己传自己
如果不是则挑选一个空闲DataNode上传
选择和当前DataNode不在同一个机架的节点复制数据
和第二个节点相同机架的节点
再多久随意放
HDFS重要流程
合并流程
写流程
读流程
删流程
启动流程
NameNode启动 合并edits和fsimage得到最新的fsimage 并回复到内存中
NameNode接着等待DataNode的节点的心跳,并根据DataNode报告的持有的block的信息在内存中回复出 块和DataNode的映射关系
并且在需要时会复制或删除Block
等到有足够数量的DataNode后,NameNode开始对外提供服务
这个启动过程可能需要耗费一定的时间,这段时间内HDFS无法对外通服务,称之为HDFS处在安全模式下
遇到安全模式 - 等一会 - 检查无法退出安全模式的原因,通常是DataNode启动的数量不足 - 强制退出安全模式,但是非常不推荐这样做,可能损坏元数据
MapReduce
海量数据分布式计算框架
map阶段 reduce阶段
分而治之 然后汇总
ResourceManager NodeManager
基本原理
执行流程
序列化机制 - Writable WritableComparable
分区机制 - Partitioner - k2.hashCode() % rnums
排序机制 - mr自带排序能力,可以实现海量数据的排序
合并机制 - Combiner - 在map阶段先做一个reduce操作 - Combiner无论用或不用 无论执行几次,都应该不影响最终计算的结果
shuffle流程
map阶段
split input map buffer(100MB 0.8) spill(partition sort combiner) merge(partition sort combiner*)
reduce阶段
fetch merge(combiner*) grouping sort reduce output
mr的输入控制
InputFormat - FileInputFormat
MultipleInputs
mr的输出控制
OutputFormat - FileOutputFormat
MultipleOutpus
GroupingComparator SortComparator
小文件处理 - har机制
小文件的问题:
hdfs来说大量占用来NameNode的内存控制
mr来说,默认一个block对应一个split对应一个Mapper,大量小文件对应大量block对应大量split对应大量Maper,处理时大量mapper同时启动容易内存溢出
若干小文件打成har包 har包可以直接在hdfs中访问
数据倾斜
mr在处理数据时比较容易遇到的问题
如果是简单的分区数据不均,则通过自定义Paritionoer来解决
如果是数据本身就存在倾斜的特点,建议通过多步骤处理减轻数据倾斜带来的危害
hadoop完全分布式安装配置
多NameNode互为热备 - JN集群
flume - 会用即可 - 没有太多面试的点
分布式日志收集框架 - 从不同来源收集日志传输到不同的目的地
Agent
Source
..
Channel
MemoryChannel FileChannel SpillableMemoryChannel
Sink
..
Selector - 选择器
Interceptor - 拦截器
Processor - 处理器
!!!!hive
基于hadoop的数据仓库工具
数据库
线上系统 实时数据存取 增删改查 避免冗余
数据仓库
线下系统 实现离线数据存储处理 一次写入多次查询不支持行级别的增删改 人为制造冗余提高效率
原理:
在hadoop的基础之上 增加来sql操作的接口 使我们可以通过sql来操作hdfs中的数据
!!hive的元数据库 - 存储hive的元数据信息 - 库 表 列 相关的信息 - Derby - mysql
|- DBS TBLS ColumnsV2 SDS
!!!内部表
先有表后有数据 数据存储到表对应的文件夹中
删除内部表时 元数据和数据都会被删除
!!!外部表
先有数据后有表 表关联到数据存放的位置来管理数据
删除外部表时 只删除元数据 数据本身不会被删除
external location
!!!分区表
hive表还可以进行分区操作 基于分区分开存放数据 提升根据分区字段查询的效率
所谓的分区本质上就是一层文件夹,数据根据分区字段分文件夹存储 后续按照分区字段查询时 效率比较高
partition by
!分桶表
hive表还可以进行分桶,根据指定列的值计算hash模余桶的数量,决定数据分配到哪个桶
通过分桶表可以实现数据的抽样
clustered by
!hive的内置函数
hive内置来大量函数 大大的增强来hive的处理能力
!!!hive的UDF - hive的自定义函数
写一个类集成UDF
在类中写一个方法evaluate 接受任意参数 返回任意类型的返回值
将该项目达成jar 上传
add jar 增加到hive中
create temporary function fname as '类的全路径名';
!hive的UDAF - hive的自定义函数 - 聚合函数
hive的语法
!!!!hbase
给予hadoop的数据库工具
nosql数据库
面向列
存储半结构化非结构化的数据
适合存储稀疏数据
实时的增删改查
海量数据存储
没有严格的事务能力
!!!!逻辑结构
行键
列族
列
时间戳
单元格
命令行操作
不支持sql 有自己的语法
!!!!!hbase的原理
HBase中的数据按照行键的字典顺序排序后存储
HBase表在水平方向上切分成多个HRegion
HRegion是HBase进行分布式存储和负载均基本单位
HRegion内部还有若干store,一个列族对应一个store
store内部必然有一个memStore,还有0个或多个StoreFile
storeFile其实是存在hdfs中的文件 也叫hfile
hbase写入数据流程
hbase读取数据流程
HFile文件结构
hbase的region寻址
hbase的理论基础 - LSM树
hash存储 - HashMap
B+树存储
LSM树存储
HBase架构
HMaster
HRegionSever
Client
Zookeeper
HBase为什么可以很快
HBase为什么可以存很多数据
HBase为什么可靠
HBase和 hive 和 mysql比较
!!!!HBase的表设计
列族
列族不宜过多 - 不超过3个 越少越好
经常要一起查询的列要设计到同一个列族中
如果设计列多个列族要考虑好列族间数据均匀的问题
行键
必须唯一
最好有意义
最好是字符串
最好具有固定长度
不宜过长
64KB - 10~100字节 - 16字节
散列原则
如果数据存在热点 应该合理的设计行键 将热点数据分开存储
有序原则
如果经常要查询大段的数据 可以通过设计行键 将这些数据连续的存放 可以提高查询的效率
sqoop
联系关系型数据库和hdfs的桥梁 可以双向的导入导出数据
!!!!电信日志分析 - zebra
知识点
Flume日志收集 --> flume脚本...
HDFS数据存储 -->
Hive清洗数据 处理数据 --> 创建外部分区表 数据清洗 处理。。
Sqoop导出数据 -->
数据可视化 -->
架构设计
略
业务背景
电信基站处理提供3g4g信后提供上网能力之外,还会记录经过基站的流量数据
希望能够收集并处理这些数据,得到其中隐含的价值信息
实时分析
kafka
分布式消息队列
大数据生产环境下的唯一的选择
Topic 主题
partition 分区
offset序号
replication 副本
Producer
Consumer
发布订阅 - 数据共享
队列模式 - 数据竞争
消费者组 - 组内竞争 组间共享
kafka的可靠性保证
kafka存储策略
kafka中的可靠性保障
storm
内存计算