• 1. Hadoop综述
  • 2. 主要内容2 第一篇HDFS 分布式文件系统 第二篇 MapReduce 第三篇 Hbase简单介绍
  • 3. 第一篇HDFS3 一: The Design of HDFS 二: HDFS Concepts 三:应用程序示例 四:Data Flow
  • 4. 第二篇 MapReduce 4一 :MapReduce基础 二:MapReduce数据流 三:MapReduce工作原理
  • 5. 第三篇 Hbase简单介绍5一 :简介 二:数据模型 三:行、列、时间戳、API
  • 6. 第一篇HDFS 分布式文件系统
  • 7. 1 The Design of HDFSVery large files 大数据集合为目标数 以千万计的文件 典型文件大小一般都在千兆至T字节 Streaming data access write-one-read-many访问模型 文件创建、写,关闭之后不需要改变简化数据一致性 适合MapReduce框架,或者web crawler Commodity hardware 错误检测和快速、自动的恢复是HDFS的核心架构目标
  • 8. 1 The Design of HDFSLow-latency data access 流式读为主 比之关注数据访问的低延迟,更关键在于数据访问的高吞吐量 arbitrary file modifications 严格要求在任何时候只有一个writer。 文件尾 在异构的软硬件平台间的可移植性移动计算 Java编写
  • 9. 2 HDFS Conceptsblocks Namenodes and Datanodes The Command-Line Interface 通信接口
  • 10. 2.1 HDFS Concepts-blocksfiles in HDFS are broken into block-sized chunks(64 MB by default) 减少元数据的量 有利于顺序读写(在磁盘上数据顺序存放) 副本的默认数目是3 a file can be larger than any single disk in the network. making the unit of abstraction a block rather than a file simplifies the storage subsystem.
  • 11. 2.2 HDFS Concepts-Namenodes and Datanodes Basic model Namenode DataNode 心跳机制
  • 12. 2.2.1 HDFS Concepts-Namenodes and Datanodes- Basic model Basic model: Master / Slaves / Client Corresponding implementation: Master– NameNode Slaves–DataNodes Client –DFSClient
  • 13. 2.2.1 HDFS Concepts-Namenodes and Datanodes- Basic model查看块信息hadoop fsck –files –blocks 部分运行结果
  • 14. 2.2.2 HDFS Concepts-Namenodes and Datanodes- NameNode manages the filesystem namespace 元数据信息包括: 文件信息,根目录 hdfs://master:9000/ 每一个文件对应的文件块的信息 每一个文件块在DataNode的信息 persistent state of the filesystem metadata. Namenode folders structure Namenode namespace映像文件及修改日志 客户端对文件的访问
  • 15. 2.2.2.1 HDFS Concepts-Namenodes and Datanodes- NameNode- manages the filesystem namespace将所有的文件和文件夹的元数据保存在一个文件系统树中。在硬盘上保存成以下文件: 命名空间镜像(namespace image) 修改日志(edit log) 心跳信号传递信息(并不存储在硬盘): 一个文件包括哪些数据块,分布在哪些数据节点上。系统启动的时候从Datanode收集而成的。 Datanode在Namenode的指挥下进行block的创建、删除和复制。
  • 16. 2.2.2.2 HDFS Concepts-Namenodes and Datanodes- NameNode- persistent state of the filesystem metadata对于任何对文件元数据产生修改的操作,Namenode都使用一个称为Editlog的事务日志记录下来。 例如,在HDFS中创建一个文件(打开、关闭、重命名文件和目录),Namenode就会在Editlog中插入一条记录来表示;同样,修改文件的replication因子也将往 Editlog插入一条记录。 整个文件系统的namespace,包括block到文件的映射、文件的属性,都存储在称为FsImage的文件中,这个文件也是放在Namenode所在系统的文件系统上
  • 17. 2.2.2.2 HDFS Concepts-Namenodes and Datanodes- NameNode- persistent state of the filesystem metadata块进行复制的形式放置,按照块的方式随机选择存储节点。 a副本的默认数目是3
  • 18. 2.2.2.3 HDFS Concepts-Namenodes and Datanodes- NameNode- Namenode folders structurenamespaceID=1232737062 cTime=0 storageType=NAME_NODE layoutVersion=-18VERSION文件是java properties文件,保存了HDFS的版本号。 layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。 namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。 cTime此处为0 storageType表示此文件夹中保存的是元数据节点的数据结构。
  • 19. 2.2.2.4 HDFS Concepts-Namenodes and Datanodes- NameNode-Namenode-Namenode文件系统命名空间映像文件及修改日志客户端操作(打开、关闭、重命名文件和目录) NameNode将对文件系统的改动追加保存到本地文件系统上的一个日志文件(edits) NameNode启动 从映像文件(fsimage)中读取HDFS的状态 接着应用日志文件中的edits操作 新的HDFS状态写入(fsimage)中 使用一个空的 edits文件开始正常操作。 写操作成功之前,修改日志都会同步(sync)到文件系统。 fsimage命名空间映像文件,是内存中的元数据在硬盘上的checkpoint NameNode只有在启动阶段合并fsimage和edits,日志文件会变大
  • 20. 2.2.3 HDFS Concepts-Namenodes and Datanodes- DataNodes文件存储的基本单元 保存Block的Meta-data 周期性地将所有Block信息发送给NameNode。 文件夹结构 blk_保存的是HDFS的数据块,其中保存了具体的二进制数据。 blk_.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum 目录中数据块到达一定数量,创建子文件夹
  • 21. 2.2.4 HDFS Concepts-Namenodes and Datanodes-心跳机制master启动,开一个ipc server slave启动每隔3秒向master发送 “心跳” 状态信息告诉master master通过心跳的返回值,向slave节点传达指令 周期性接收 “心跳”和Blockreport Datanode上所有block组成列表
  • 22. 2.3 HDFS Concepts-Namenodes and Datanodes- The Command-Line Interface interacting with HDFS hadoop fs –mkdir input hdfs://master:9000/user/coole 在hdfs://master:9000/user/coole下新建input目录
  • 23. 2.5 HDFS Concepts-Namenodes and Datanodes-通信接口对通信的对象进行序列化 自己的序列化系统。 org.apache.hadoop.io中定义可序列化对象,实现了Writable接口
  • 24. 3 Hadoop应用程序示例 //在hdfs://master:9000/user/coole目录下创建文件并写入内容 public class DFSOperator { public static void main(String[] args) { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); Path t = new Path("hdfs://master:9000/user/coole/dfs_operator.txt"); FSDataOutputStream os = fs.create(t,true); int i = 0; for (i = 0 ;i<5; i++) os.writeChars("test"); os.close(); } catch (IOException e) { e.printStackTrace(); } } }
  • 25. 3 Hadoop应用程序示例 打包 dfs_operator.jar 复制到hadoop/bin文件夹下 执行脚本: exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@“ 运行hadoop jar dfs_operator.jar DFSOperator Hadoop脚本选项参数一参数二elif [ "$COMMAND" = "jar" ] ; then CLASS=org.apache.hadoop.util.RunJar
  • 26. 4 Data Flow File Read File Write
  • 27. 4.1 Data Flow-File Read 4.1.1 基本过程 4.1.2 网络距离 4.1.3 优点
  • 28. 4.1.1 Data Flow-File Read-基本过程The client opens the file it wishes to read by calling open() on the FileSystem object Multiple DistributedFileSystem calls the namenode, using RPC, to determine the locations of the blocks for the first few blocks in the file
  • 29. 4.1.1 Data Flow-File Read-详细过程 For each block, the namenode returns the addresses of the datanodes that have a copy of that block (according to their proximity to the client据与客户端距离排序) 读完一个块,再找下一个块,读取连续流
  • 30. 4.1.2 Data Flow-File Read-网络距离1 2 3
  • 31. 4.1.3 Data Flow-File Read-优点客户端在Namenode指引下,直接联系数据结点
  • 32. 4.2 Data Flow-File Write 4.2.1 基本过程 4.2.2 副本放置
  • 33. 4.2.1 Data Flow-File Write-基本过程客户端通过DistributedFilesystem调用create()创建文件 FSDataOutputStream os = fs.create(t,true); 返回一个数据输出流,让客户写数据,控制一个DFSoutPutstream负责namenodet和datanode通信 DFSoutPutstream将数据分成一个个包写入数据结点
  • 34. 4.2.1 Data Flow-File Write-副本位置Hadoop’s strategy is to place the first replica on the same node as the client for clients running outside the cluster, a node is chosen at random, the system tries not to pick nodes that are too full or too busy
  • 35. 第二篇 MapReduce
  • 36. 1 MapReduce基础1.1 函数式编程 1.2 列表处理 1.3 mapping数据列表 1.4 reducing数据列表
  • 37. 1.1 MapReduce基础-函数式编程计算划到大量机器上 组件间不允许任意数据共享,避免保保持同步而产生的通信开销,所有在MapReduce上的数据不可变 节点间通信只在产生新输出
  • 38. 1.2 MapReduce基础-列表处理MapReduce程序转变输入数据元素列表成输出数据元素列表。
  • 39. 1.3 MapReduce基础- mapping数据列表MapReduce程序的第一步叫做mapping
  • 40. 1.4 MapReduce基础- Reducing数据列表Reducing把数据聚集在一起。 reducer函数接收来自输入列表的迭代器
  • 41. 2 MapReduce数据流2.1 概述 2.2 输入 2.3 Maper 2.4 Partiton&Shuffle 2.5 Reducer 2.6 输出
  • 42. 2.1MapReduce数据流-概述高层MapReduce工作流水线
  • 43. 2.1MapReduce数据流-概述mapping任务平等, Mapper无特定标识,处理任意输入 每个mapper本地进行 中间值交换,同键值送到同一个reducer。唯一的结点通信 数据传送由平台处理
  • 44. 2.2 MapReduce数据流-输入近距离观察
  • 45. 2.2 MapReduce数据流-输入输入文件:任务的初始存储地 输入格式:inputFormat定义了如何分割和读取输入文件。 选择对象 划分为inputSplits 每个InputSplit一个map任务 为RecordReader读取文件提供一个工厂方法 输入格式描述键值TextInputFormat默认格式,读取文件的行行的字节偏移量行的内容KeyValueInputFormat把行解析为键值对第一个tab字符前的所有字符行剩下的内容SequenceFileInputFormatHadoop定义的高性能二进制格式用户自定义用户自定义
  • 46. 2.2 MapReduce数据流-输入输入块InputSplit:文件拆分成块 Mapred-default.xml设置块大小 输入格式定义了组成mapping阶段的map任务列表,每个任务对应一个输入块。 据InputSplit地址分配任务(最大任务数mapred.tasktracker.map.tasks.maximum)
  • 47. 2.2 MapReduce数据流-输入RecordReader访问InputSplit 转换为适合mapper读取的kv对 RecordReader实例由输入格式定义的默认的输入格式 TextInputFormat提供LineRecordReader 偏移量-键;行-值 RecordReader会在输入块上被重复的调用直到整个输入块被处理完毕,每一次调用RecordReader都会调用Mapper的map()方法。
  • 48. 2.3 MapReduce数据流-Mapper给定一个键值对,map()方法会生成一个或多个键值对 OutputCollector对象collect()的方法,利用该方法把键值对送到作业的reduce阶段。
  • 49. 2.4 MapReduce数据流-Partiton&Shuffle Shuffle :移动map输出到reducer的过程叫做 Partitons:每一个reduce节点会分派到中间输出的键集合中的一个不同的子集合 Partitioner类决定键值对去向,默认分类器计算键哈希值
  • 50. 2.5 MapReduce数据流-Reduce 每个reduce任务都会创建一个Reducer实例 reducer的reduce()方法只会调用一次,它会接收一个键和关联到键的所有值的一个迭代器,迭代器会以一个未定义的顺序返回关联到同一个键的值。
  • 51. 2.6 MapReduce数据流-输出键值对通过OutputCollector被写到输出文件中,写入的方式由输出格式控制。 每一个reducer会把结果输出写在公共文件夹中一个单独的文件内,这些文件的命名一般是part-nnnnn,nnnnn是关联到某个reduce任务的partition的id输出格式描述TextOutputFormat默认的输出格式, 以 "key \t value" 的方式输出行SequenceFileOutputFormat输出二进制文件,适合于读取为子MapReduce作业的输入NullOutputFormat忽略收到的数据,即不做输出 
  • 52. 3 MapReduce工作原理
  • 53. 3 MapReduce工作原理3.1 基本概念 3.2 Job Submission 3.3 Job Initialization 3.4 Task Assignment 3.5 Task Execution
  • 54. 3.1 MapReduce工作原理-基本概念3.1.1The client 3.1.2 Jobtracker 3.1.3Tasktracker 3.1.4 The distributed filesystem 3.1.5 job
  • 55. 3.1.1 MapReduce工作原理-基本概念-客户端The client, which submits the MapReduce job
  • 56. 3.1.2 MapReduce工作原理-基本概念-jobtrackerThe jobtracker, which coordinates the job run. The jobtracker is a Java application whose main class is JobTracker
  • 57. 3.1.3 MapReduce工作原理-基本概念-taskrackerThe tasktrackers, which run the tasks that the job has been split into. Tasktrackers are Java applications whose main class is TaskTracker.
  • 58. 3.1.4 MapReduce工作原理-基本概念-distributed filesystemThe distributed filesystem (normally HDFS), which is used for sharing job files between the other entities.
  • 59. 3.1.5 MapReduce工作原理-基本概念-Job 一个mapreduce应用由三部分组成Maper,Reducer,JobConfJobClient.submitJob() JobTrackerCopy job resources
  • 60. MapReduce-1Job SubmissionAsks the jobtracker for a new job ID Checks the output specification of the job. Computes the input splits for the job. Copies the resources needed to run the job Tells the jobtracker that the job is ready for execution
  • 61. MapReduce-2Job Initializationjob scheduler initialize job creating an object to represent the job encapsulates its tasks, and bookkeeping information create the list of tasks retrieves the input splits creates one map task for each split. 它的输入往往是输入文件的一个数据块,或者是数据块的一部分,但通常,不跨数据块。 Create reduce tasks Tasks are given IDs at this point.
  • 62. MapReduce-3Task Assignmentheartbeat method calls to thejobtracker various scheduling algorithms (job select) a fixed number of slots for map tasks and for reduce tasks 作业被拆分成若干个Map任务后,会预先挂在jobtracker上的任务服务器拓扑树。这是依照分布式文件数据块的位置来划分的,比如一 个Map任务需要用某个数据块,这个数据块有三份备份,那么,在这三台服务器上都会挂上此任务,可以视为是一个预分配 两步:选作业,分任务。不同业务需不同分配算法,像yahoo等有自己算法。默认分配器,是JobQueueTaskScheduler Map task data locality considerations
  • 63. MapReduce-4Task ExecutionFirst, it localizes the job JAR by copying it from the shared filesystem to the tasktracker’s filesystem. It also copies any files needed from the distributed cache by the application to the local disk; it creates a local working directory for the task, and un-jars the contents of the JAR into this directory. it creates an instance of TaskRunner to run the task.
  • 64. 第三篇 Hbase分布式数据库
  • 65. Hbase简介 Hbase是一个类似Bigtable的分布式结构化数据库系统, Bigtable是 Google Style的数据库,使用结构化的文件来存储数据。
  • 66. Streamy 使用RDBMSstreamy.com 是一个实时新闻聚合器,使用PostgreSQL。 Streamy抓取上万RSS订阅,聚集千万条目。 除存储,复杂查询之一:从一个资源集合中读取按时间排序的所有条目列表。 为了保障数据库随扩展而保持速度,想尽办法(用尽所有RDBMS优势)。整个团队成为DBA。
  • 67. Streamy障碍一:大批量条目起初单条目表,大量二级索引使更新变慢 将条目分成一对一链接表 静态区域从动态区域分离出来 据查询方法分区 问题无法解决 单个更新还是要重写整个记录 条目追踪统计数据非常难扩展 重写记录和一直保持更新索引是RDBMS固有特性
  • 68. Streamy障碍二:超大排序合并对按时间排序的lists进行排序合并很常见 假设id是主键,stamp和type有二级索引,RDBMS查询设计器做如下处理: 问题:只排前10条ID,但查询设计器实现整个合并。
  • 69. Streamy 解决办法RDBMS能实现需求,但是------ 需要考虑伸宿性和性能,而非正确性 RDBMS开销和复杂性成为障碍 存储层抽象都是障碍 Hbase解决 信赖Hbase扩展存储而非逻辑 专注于应用逻辑而非扩展本身 目前已有上亿行上万列。可放心存储几十的行和几百万的列
  • 70. 比较RDBMS 模式固定 拥有ACID特性 适于大中小程序 HBase 对数据集大小 或读写并发性或两者兼容的伸宿性要求,发现RDBMS性能损失大。
  • 71. Hbase数据模型 定义:BT是一个稀疏的,长期存储的,多维度的,排序的映射表。 索引:行关键字,列关键字和时间戳. 值:一个不解释的字符数组. 数据都是字符串,没类型,格式由客户来解释 (row:string, column:string,time:int64)->string
  • 72. Hbase数据模型 行 每一行都有一个可排序的主键和任意多的列。 行关键字可以是任意字符串 表用行键即主键排序,通过主键访问表。 在一个行关键字下的每一个读写操作都是原子操作 有利于同行并发操作 举例,在Webtable里,通过反转URL中主机名的方式,可以把同一个域名下的网页组织成连续行。
  • 73. Hbase数据模型 列族每行列分组形成列族:“:” 每张表有一个family集合,固定不变,相当于表结构 列族成员有相同前缀。OK:a与OK:b都属于OK列族成员 同一列族下存放的所有数据通常都是同一类型 列族必须先创建,然后能在其中的列关键字下存放数据,动态增加列 限定词任意字符串。比如,Webtable列族是anchor;给列族的每一个列关键字代表一个锚链接 物理存储 列族成员在文件系统存在一起,(确切)面向列族。 这是访问控制的基本单位。
  • 74. Hbase数据模型 时间戳表中每一个表项都可以包含同一数据的多个版本不同版本的表项内容按时间戳倒序排列,即最新的排在前面。 自动进行垃圾清除。用户可以指明只保留表项的最后n个版本 在Webtable中,在contents:列中存放确切爬行一个网页的时间戳。如上的垃圾清除机制可以让我们只保留每个网页的最近三个版本。
  • 75. Hbase数据模型行名是一个反向URL{即com.cnn.www}。 contents列族存放网页内容 anchor列族存放引用该网页的锚链接文本。 CNN的主页被Sports Illustrater和MY-look的主页引用,因此该行包含了名叫“anchor:cnnsi.com”和 “anchhor:my.look.ca”的列。列名字的格式是":
  • 76. Hbase数据模型概念视图 一个表可以想象成一个大的映射关系,通过主键,或者主键+时间戳,可以定位一行数据,由于是稀疏数据,所以某些列可以是空白的,下面就是数据的概念视图:
  • 77. Hbase数据模型物理视图 在物理存储上面,它是按照列来保存的, 在概念视图上面有些列是空白的,这样的列实际上并不会被存储 如果在查询的时候不提供时间戳,返回最新版本
  • 78. 区域(tablet)表横向分不同区域,各区域代表所有行一个子集 区域确定:第一行(包含)最后行(不含)+随机标识 表初始单个区域->逐渐扩大超过阈值->以行为界分割 区域分散在HBase集群上单元 Bigtable通过行关键字的字典序来维护数据。动态划分成多个连续行叫做“子表”(tablet)是数据分布和负载均衡的单位。这样一来,读较少的连续行就比较有效率
  • 79. 架构与实现Hbase由主节点master多个区域服务器regionserver从结点 Master 分配区域给已注册的区域服务器 Regionserver 负责0到多个区域,响应客户端读写请求 通知master分裂成子区域信息
  • 80. 特性无真正索引 行顺序,无索引膨胀问题,插入操作性能与表大小无关 自动分区 商用硬件 建立在1000-5000节点,RDBMS非常消耗IO?
  • 81. Hbase APIBT的API提供了建立和删除表和列族的函数.还提供了函数来修改集群,表和列族的元数据,比如说访问权限
  • 82. Hbase API: 写入Bigtable. / Open the table Table *T = OpenOrDie(”/bigtable/web/webtable”); // Write a new anchor and delete an old anchor RowMutation r1(T, “com.cnn.www”); r1.Set(”anchor:www.c-span.org”, “CNN”); r1.Delete(”anchor:www.abc.com”); Operation op; Apply(&op, &r1);
  • 83. Hbase API: 写入Bigtable. 在BT中,客户应用可以写或者删除值,从每个行中找值,或者遍历一个表中的数据子集.图2的C++代码是使用RowMutation抽象表示来进行一系列的更新(为保证代码精简,没有包括无关的细节).调用Apply函数,就对Webtable进行了一个原子修改:它为http://www.cnn.com/增加了一个锚点,并删除了另外一个锚点.
  • 84. Hbase API: 读Bigtable. Scanner scanner(T); ScanStream *stream; stream = scanner.FetchColumnFamily(”anchor”); stream->SetReturnAllVersions(); scanner.Lookup(”com.cnn.www”); for (; !stream->Done(); stream->Next()) { printf(”%s %s %lld %s\n”, scanner.RowName(), stream->ColumnName(), stream->MicroTimestamp(), stream->Value());
  • 85. Hbase API: 读Bigtable. C++代码是使用Scanner抽象来遍历一个行内的所有锚点.客户可以遍历多个列族.有很多方法可以限制一次扫描中产生的行,列和时间戳.例如,我们可以限制上面的扫描,让它只找到那些匹配正则表达式*.cnn.com的锚点,或者那些时间戳在当前时间前10天的锚点.
  • 86. The End