`

Hadoop学习分享----入门概要介绍

 
阅读更多

一、什么是Hadoop?


  • 基于2003年google发表Map/Reduce 和 Google File System(GFS)论文研发。
  • 用java实现的HDFS(Hadoop分布式文件系统)+Map/Reduce(并行编程计算处理框架)。
  • 对大量数据进行分布式处理的软件框架。

 

二、Hadoop的优势


 1、高可靠性:

HDFS假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。MapReduce的任务监控保证了分布式处理的可靠性。

2、高效性:

Hadoop (M/R)是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。

3、高扩展性:

Hadoop可以扩展至数千个节点,对数据持续增长,数据量特别巨大的需求很合适。

4、低成本:

Hadoop是开源项目,而且不仅从软件上节约成本,硬件上的要求也不高。Hadoop生态群活跃,其周边开源项目丰富,HBase, Hive,Impala等等基础开源项目众多。

三、Hadoop的不足


1、不适合低延迟数据访问,不适合做实时数据分析。

2、无法高效存储大量小文件。

3、不支持多用户写入及任意修改文件。

四、Hadoop的两大核心子项目介绍


 (一)、HDFS简介

提供一个高效可用的分布式文件系统,具体如下:

1、可以创建、删除、移动或重命名文件,等等。
2、采用多个备份,保证单节点出现故障是,数据不会丢失。
3、是一个抽象的文件系统,实际的文件数据是分布在多个节点上。

 

HDFS的结构:



<1>、NameNode和Secondary NameNode介绍

NameNode:

  • 负责管理文件系统名称空间(Namespace)和控制外部客户机的访问。
  • 维护文件系统树(filesystem tree)以及文件树中所有的文件和文件目录信息的元数据(metadata)。
  • 是hadoop守护进程中最重要的一个,位于HDFS的主端,它跟踪文件如何被分割成文件块,而这些块又被哪些节点存储,以及分布式文件系统的整体运行状态是否正常。

Secondary NameNode:

  • 是一个用来监控HDFS状态的辅助后台程序。就想NameNode一样,每个集群都有一个Secondary  NameNode,并且部署在一个单独的服务器上。Secondary  NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的快照。由于NameNode是单点的,通过Secondary  NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary  NameNode可以及时地作为备用NameNode使用。


NameNode维护以上管理信息的四个重要的物理文件:

  • fsimage:二进制文件,存储HDFS的文件和目录元数据。格式如下:
  • edits:作为NameNode的变更日志,记录fsimage的变更信息,如创建/删除目录,创建/删除文件,修改权限,修改namespace/diskspace限额等。
  • fstime:记录最近一次checkpoint的时间,作为Secondary NameNode判断当前是否需要进行checkpoint的依据。
  • VERSION:记录namspaceID,作为整个namespace的唯一标识,DataNode也保存这个标识,在每次DataNode连接NameNode时都要检查,不一致的DataNode会被拒绝连接。

NameNode和secondary Namenode:

为什么会用这样的交互机制?

原因:

1.fsimage是存于硬盘的元数据检查点,Hadoop不会对每个文件操作都写出到fsimage,这样是很慢的,但是每个文件操作都会在提交后运行前先写入edits编辑日志,这样在namenode出现故障后,就会将fsimage和edits编辑日志结合读入内存,重建元数据信息。

 2.为了避免edits编辑日志的无限制扩大,secondary namenode 就回按照时间阈值(比如1小时)或者按大小阈值(edits编辑日志文件大小超过64M,这些参数都可以设置)“周期性”的读取namenode中的edits和fsimage重构fsimage检查点,同时在namenode中进行edits的滚动,来解决这个问题。

<2>、DataNode介绍

  • 提供数据存储空间,保存HDFS中的数据信息,它管理的是数据块(Block) 。
  • 响应来自 HDFS 客户端的读写请求,
  • 响应来自 NameNode 的创建、删除和复制块的命令。

当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。


<3>、Client介绍

  • 代表用户与namenode和datanode交互来访问整个文件系统。客户端提供了一些列的文件系统接口,因此我们在编程时,几乎无须知道datanode和namenode,即可完成我们所需要的功能。

<4>、Namenode,Datanode,Client之间的通信

  • Namenode,Datanode,Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候,命令不是马上就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统中并且在Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Client便把这些本地临时文件夹中的数据块写入指定的数据节点。



(二)、Map/Reduce和计算任务框架介绍

<一>、Map/Reduce介绍

  • 提供了一套并发处理数据的接口
  • Map 函数接受一组数据并将其转换为一个键/值对列表,输入域中的每个元素对应一个键/值对。
  • Reduce 函数接受 Map 函数生成的列表,然后根据它们的键(为每个键生成一个键/值对)缩小键/值对列表。

 

执行计算流程图:


  • Map/Reduce的本质是用户需编程提供两个以Key/value方式操作的函数:

          f(map) ~ input_data    list (k1,v1)

          f(reduce) ~  (k1,list(v1))   result_data

  • Map/Reduce系统提供的隐藏操作有:

         将map结果list(k1,v1)重新分发,使同一个k1对应的数据(k1,list(v1))定向到同一个计算单元reducer。

 

例子:我们想要统计每个员工每天在开会上平均要花费多少时间。数据内容:employee, date, meeting_time。

  • 如果用sql,maybe:select employee, avg(meeting_time) from tablename group by employee.
  • 如果用map/reduce programming,maybe:map过程,把数据按<employee, meeting_time>分发;reduce过程,对同一个employee的meeting_time求平均,并输出<employee, avg(meeting_time)>




<二>、JobTracker和TaskTracker介绍:

JobTracker介绍:

JobTracker后台程序用来连接应用程序与Hadoop。用户代码提交到集群以后,由JobTracker决定哪个文件将被处理,并且为不同的task分配节点。同时,它还监控所有的task,一旦某个task失败了,JobTracker就会自动重新开启这个task,在大多数情况下这个task会被放在不用的节点上。每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上。


TaskTracker介绍:

TaskTracker与负责存储数据的DataNode相结合,其处理结构上也遵循主/从架构。JobTracker位于主节点,统领 MapReduce工作;而TaskTrackers位于从节点,独立管理各自的task。每个TaskTracker负责独立执行具体的task,而 JobTracker负责分配task。虽然每个从节点仅有一个唯一的一个TaskTracker,但是每个TaskTracker可以产生多个java 虚拟机(JVM),用于并行处理多个map以及reduce任务。TaskTracker的一个重要职责就是与JobTracker交互。如果 JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他 节点处理。







  

五、Hadoop其他重要子项目


 1、Hbase

  • Google Bigtable的开源实现
  • 列式数据库
  • 可集群化
  • 可以使用shell、web、api等多种方式访问,通过api函数对数据库进行操作
  • 适合高读写(insert)的场景:大量数据向数据库中写入,读出
  • HQL查询语言:Hbase Query Language
  • NoSQL的典型代表产品

2、Hive 蜂巢

  • 数据仓库工具,可以把hadoop下的原始结构化数据变成Hive中的表
  • 支持一种与SQL几乎完全相同的语言。除了不支持更新、索引和事务,几乎SQL的其它特征都能支持
  • 可以看成是从SQL到Map-Reduce的映射器
  • 提供shell,JDBC/ODBC,Thrift,Web等接口

3、Zookeeper动物园管理员:通信协调软件:Hbase数据节点之间的协调

  • Google Chubby的开源实现
  • 用于协调分布式系统上的各种服务。例如确认消息是否准确到达,,防止单点失效,处理负载均衡等
  • 应用场景:Hbase,实现Namenode自动切换
  • 工作原理:领导者,跟随者以及选举过程

4、Avro鹰

  • 数据序列化工具,由Hadoop的创始人Doug Cutting主持开发
  • 如:java中产生数据,存入磁盘,需要先序列化
  • 用于支持大批量数据交换的应用。支持二进制序列化方式,可以便捷,快速地处理大量数据
  • 动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据
  • Thrift接口

5、Cassandra(没落于hbase)

  • NoSQL,分布式的Key-Value型数据库,由Facebook贡献给apache
  • 与Hbase类似,也是借鉴Google Bigtable的思想体系
  • 只有顺序写,没有随机写的设计,满足高负荷轻型的性能需求
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics