My Octopress Blog

life and I

Hadoop

| Comments

简介

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

名称节点和数据节点

  • 管理者 命名空间
  • 工作者 定位块

命名空间损坏会造成系统失效,保证其可用有以下两种方式

  1. 复制组成文件系统元数据的持久文件
  2. 二级名称节点

命令行接口

  • 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
$export HBASE_HOME=/home/hbase
$export PATH=$PATH:$HBASE_HOME/bin

运行

1
$hbase

测试驱动

1
$start-hbase.sh

客户端

java

REST thrift

同RDBMS比较

  • HBase:分布式,面向列,hdfs上读写,自动横向分区和复制。
  • RDBMS:满足ACID的,面向行的,通过SQL查询,

HBase特点

  • 无真正索引
  • 自动分区
  • 创建新节点时自动线性扩展
  • 商用硬件
  • 容错性
  • 批处理性

实践

缺点

  • 文件描述信息块耗尽”Too many open files”
  • 数据节点线程用尽
  • 不良块

用户界面

web界面,默认60010端口

度量

架构

类似RDMBS,但是单元有版本,行排序

参考

HBase技术介绍

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

锁服务

  1. znode下创建, znode-child-x
  2. 获取znode的children并设置watch
  3. 如果步骤1中的路径名和步骤2中的路径名的最小值相同,得到锁,否则等待或退出
  4. 一旦znodechildren改变则被watch到,继续步骤3的比较

集群影响问题

解决:提高发送消息的条件,不是每次都发送。

可恢复的异常

创建锁的客户端异常,没有释放。则死锁。

解决:在znode名称中嵌入标识符。

不可恢复的异常

WriteLock

其他分布式协议

BookKeeper

日志模块

工业中的Zookeeper

  • 集群限制在单一的数据中心
  • Zookeeper单独运行在服务器上,不合其他服务竞争资源
  • 配置Zookeeper保存不同磁盘上的快照驱动的日志。
  • 进程与磁盘进行交换。性能受影响。通过设置java堆大小和减少物理机器内存避免。

参考

Ubuntu上搭建Hadoop环境

Comments