简介
Apache Hadoop是一个开源的基于集群的分布式处理大数据的计算框架。 它用于将一个机器处理的问题切分为若干提供存储和计算资源的机器共同处理的问题,对于集群来说, 集群中的任何机器都可能失效,它提供基于应用层的异常处理功能。
Apache Hadoop项目分为三个子项目
- [Hadoop Common]
hadoop主要克隆了Google运行系统的框架,包括
- 文件系统HDFS
- 计算框架MapReduce
- 结构化数据处理HBase
基于此的其他开源项目
- Pig
- Zookeeper
- HIVE
大数据存储和访问
关系型数据库和MapReduce差异
网格计算
大规模分布式的主要问题是处理失效和错误
MapReduce简介
一种用于数据处理的编程模型,本质是并行的 分为两个阶段
- Map
- Reduce
分支化
- map任务
- reduce任务
两种类型节点控制作业执行
- jobtracker
- tasktracker
输入输出流
Apache Hadoop 提供了API允许除JAVA外语言运行MapReduce,
分布式文件系统
HDFS设计
特点
- 针对超大文件而设计的文件系统
- 流式数据访问
- 商用硬件
缺点
- 低延迟访问(如果需要低延迟HBase更好)
- 大量小文件
- 多用户写入,任意修改
HDFS概念
块
- 默认64M
名称节点和数据节点
- 管理者 命名空间
- 工作者 定位块
命名空间损坏会造成系统失效,保证其可用有以下两种方式
- 复制组成文件系统元数据的持久文件
- 二级名称节点
命令行接口
- hadoop fs -help
- hadoop fs -copyFromLocal input/docs/qu.txt hdfs://localhost/user/tom/qu.txt
- md5 input/docs/qu.txt qu.copy.txt
- hadoop fs -mkdir books
- hadoop fs ls
接口
- Thrift
- libhdfs
- fuse
- webdav
- http
- ftp
Java接口
数据流
hadoop的I/O
序列化
writable是MapReduce数据路径的核心。
序列化框架
基于文件的数据结构
SequenceFile
key/value结构
MapFile
sorted SequenceFile
MapReduce开发
大致流程
- 编写map, reduce函数
- 单元测试
- 运行驱动作业
- 集群运行
- 调试错误
- 调整性能
配置环境
单元测试
本地运行
集群运行
不需要修改,直接打包后运行
拥有网络观察界面
调试方法,日志解析方法
调优列表
- mapper数量
- reducer数量
- 是否利用combainer
- 中间值
- 自定义序列
- shuffle运行
MapReduce工作流
高级语言
- Pig
- HIHV
- Cascading
MapReduce工作原理
运行作业
- 提交作业
- 作业初始化
- 任务分配
- 任务执行
- 进度状态更新
- 作业完成
失败的处理
作业调度
早期FIFO使用整个
后来优先级队列
Fair Scheduler
shuffle和排序
shuffle– 系统排序的过程
优化的关键
很多时候是MapReduce的核心
任务的执行
MapReduce类型和格式
key/value输入输出
java本身问题导致的类型摩擦
输入格式
大量小文件会降低MapReduce性能,因为会增加seek操作,而且每次新map会造成性能损失,MapReduce最佳处理速度最好与数据在集群中传播速度 相同。所以将大量的小文件打包成一个整块的文件
hadoop擅长处理结构化的数据
文本和文件格式的输入
数据库输入
输出格式
一个分区对应一个固定的分区不好,导致分区不均。
让很多reducer去做较轻的工作也不佳,更好的是用少量的reducer,每个做更多的活,这样便于管理reducer.
MapReduce特性
- 计数器
- 排序
- 数据集链接
对数据排序是MapReduce的核心。
HBase
分布式的面向列的存储系统。对于实时写和随机访问大的数据有效。
公认的用例是webtable。
背景
最初由Powerset的chad walter等从2006年开发,基于google的论文”Bigtable; A distributed Storage System for structured Data”. 最初是haddop的一部分,2008年成为apache的一个子项目。
概念
数据模型
表的行作为主键,被排序
列被分为列族
所有列族成员被存储在一起
区域
自动横向切分区域
区域是分散在hbase内的单元
锁定
行的更新是原子的
实现
一个主节点和多个区域服务器
依赖于zookeeper
运行
-ROOT-和.MEAT.目录表
客户端缓存已知的-ROOT-和.MEAT.
安装
解压
设置路径
1 2 |
|
运行
1
|
|
测试驱动
1
|
|
客户端
java
REST thrift
同RDBMS比较
- HBase:分布式,面向列,hdfs上读写,自动横向分区和复制。
- RDBMS:满足ACID的,面向行的,通过SQL查询,
HBase特点
- 无真正索引
- 自动分区
- 创建新节点时自动线性扩展
- 商用硬件
- 容错性
- 批处理性
实践
缺点
- 文件描述信息块耗尽”Too many open files”
- 数据节点线程用尽
- 不良块
用户界面
web界面,默认60010端口
度量
架构
类似RDMBS,但是单元有版本,行排序
参考
Zookeeper简介
分布式协调管理
特性
- 简易
- 易表达
- 高可用
- 简化松耦合
- 开源库
安装运行
解压
设置路径
单机版测试
联机版测试
范例说明
znode
watcher
服务
数据模型
- znode ACL
- 临时znode
- 序号:全局唯一
- watch
- API绑定
操作
- create
- delete
- exists
- getACL, setACL
- getChildren
- getData, setData
- sync
watch触发
ACL
运行
集群内多数可用即可,5台容忍坏2台,6台允许坏2台,所以一般选择奇数个机器组成 集群
采用了zab协议
- 领导者选举 200ms
- 原子广播
一致性
- zxid
- 顺序一致性
- 原子性
- 单系统映像
- 容错性
- 合时性
内存提供读写操作
sync只能被异步调用
会话
和临时znode相关
time参数
- tick time: 基本时长
状态
使用
配置服务
读写,监视
可恢复的应用
- InterruptedException
- KeeperException
锁服务
- znode下创建, znode-child-x
- 获取znode的children并设置watch
- 如果步骤1中的路径名和步骤2中的路径名的最小值相同,得到锁,否则等待或退出
- 一旦znodechildren改变则被watch到,继续步骤3的比较
集群影响问题
解决:提高发送消息的条件,不是每次都发送。
可恢复的异常
创建锁的客户端异常,没有释放。则死锁。
解决:在znode名称中嵌入标识符。
不可恢复的异常
WriteLock
其他分布式协议
BookKeeper
日志模块
工业中的Zookeeper
- 集群限制在单一的数据中心
- Zookeeper单独运行在服务器上,不合其他服务竞争资源
- 配置Zookeeper保存不同磁盘上的快照驱动的日志。
- 进程与磁盘进行交换。性能受影响。通过设置java堆大小和减少物理机器内存避免。