Hadoop基础知识

 

 

欢迎访问 博客新址:   http://blog.xuezhisd.top

 

 

 

         Hadoop包括分布式存储(HDFS)和分布式计算(MapReduce)。

 

HDFS

         Hadoop分布式文件系统(HDFS)是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。

         硬件错误是常态而不是异常。因此错误检测和快速、自动的恢复是HDFS最核心的架构目标。

         运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。HDFS更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。

         HDFS被调节以支持大文件存储

         HDFS应用需要一个一次写入多次读取的文件访问模型。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。

         移动计算比移动数据更划算,在数据达到海量级别的时候更是如此。

         异构软硬件平台间的可移植性。

         HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和多个Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。

 

         HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。            Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

         HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。

 

         文件系统的名字空间:HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。

         数据复制:HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块。为了容错,文件的所有数据块都会有副本

         Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。

 

         副本存放:最最开始的一步

         副本的存放是HDFS可靠性和性能的关键。HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。

         大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。

         安全模式

         Namenode启动后会进入一个称为安全模式的特殊状态。处于安全模式的Namenode是不会进行数据块的复制的。当Namenode检测确认某个数据块的副本数目达到最小副本数,那么该数据块就会被认为是副本安全的;在一定百分比的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。

         Namenode上保存着HDFS的名字空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。

         Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。

          Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。

         HDFS通讯协议都是建立在TCP/IP协议之上。

         HDFS的主要目标就是即使在出错的情况下也要保证数据存储的可靠性。常见的三种出错情况是:Namenode出错, Datanode出错和网络割裂(network partitions)。

         HDFS的架构支持数据均衡策略。

         FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏了,整个HDFS实例都将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的副本。

         Namenode是HDFS集群中的单点故障(single point offailure)所在。如果Namenode机器故障,是需要手工干预的。

         典型的数据块大小是64MB。因而,HDFS中的文件总是按照64M被切分成不同的块,每个块尽可能地存储于不同的Datanode中。

         HDFS以文件和目录的形式组织用户数据。它提供了一个命令行的接口(DFSShell)让用户与HDFS中的数据进行交互。

         DFSAdmin命令用来管理HDFS集群。这些命令只有HDSF的管理员才能使用。

动作

命令

将集群置于安全模式

bin/hadoop dfsadmin -safemode enter

显示Datanode列表

bin/hadoop dfsadmin -report

使Datanode节点 datanodename退役

bin/hadoop dfsadmin -decommission datanodename

         当用户或应用程序删除某个文件时,HDFS会将这个文件重命名转移到/trash目录。只要被删除的文件还在/trash目录中,用户就可以恢复这个文件。

         HDFS既可以作为Hadoop集群的一部分,也可以作为一个独立的分布式文件系统。

         一个HDFS集群主要由一个NameNode和很多个Datanode组成:Namenode管理文件系统的元数据,而Datanode存储了实际的数据。

         HDFS提供了Java接口,Web接口,Shell命令和DFSAdmin命令。

         SecondaryNameNode定期合并fsimage和edits日志,将edits日志文件大小控制在一个限度下。因为内存需求和NameNode在一个数量级上,所以通常secondaryNameNode和NameNode运行在不同的机器上。

         HDFS支持fsck命令来检查系统中的各种不一致状况。这个命令被设计来报告各种文件存在的问题,比如文件缺少数据块或者副本数目不够。

         Hadoop分布式文件系统(HDFS)允许管理员为每个目录设置配额。 新建立的目录没有配额。最大的配额是Long.Max_Value。配额为1可以强制目录保持为空。目录配额是对目录树上该目录下的名字数量做硬性限制

 

 

MapReduce

         一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

         Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。

         Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。

         虽然Hadoop框架是用JavaTM实现的,但Map/Reduce应用程序则不一定要用 Java来写。

         HadoopStreaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序 (例如:Shell,Python)来做为mapper和reducer。

         Map/Reduce框架运转在<key, value> 键值对上,也就是说, 框架把作业的输入看为是一组<key, value> 键值对,同样也产出一组 <key, value> 键值对做为作业的输出,这两组键值对的类型可能不同。

         一个Map/Reduce 作业的输入和输出类型如下所示:

         (input) <k1, v1> -> map -> <k2,v2> -> combine -> <k2, v2> -> reduce -> <k3,v3> (output)

         Hadoop MapReduce的Python框架有多个,比如mrjob, dumbo,hadoopy, pydoop等。

         应用程序通常会通过提供map和reduce来实现 Mapper和Reducer接口,它们组成作业的核心。

         Mapper将输入键值对(key/value pair)映射到一组中间格式的键值对集合。

         Map是一类将输入记录集转换为中间格式记录集的独立任务。这种转换的中间格式记录集不需要与输入记录集的类型一致。输出键值对不需要与输入键值对的类型一致。一个给定的输入键值对可以映射成0个或多个输出键值对。

         需要多少个Map?Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数。

         Reducer将与一个key关联的一组中间数值集归约(reduce)为一个更小的数值集。

         Reducer有3个主要阶段:shuffle、sort和reduce。

         Shuffle:Reducer的输入就是Mapper已经排好序的输出。在这个阶段,框架通过HTTP为每个Reducer获得所有Mapper输出中与之相关的分块。

         Sort:框架将按照key的值对Reducer的输入进行分组(因为不同mapper的输出中可能会有相同的key)。

         Shuffle和Sort两个阶段是同时进行的;map的输出也是一边被取回一边被合并的。

         需要多少个Reduce?Reduce的数目建议是0.95或1.75乘以 (<no. of nodes> * mapred.tasktracker.reduce.tasks.maximum)。

         如果没有归约要进行,那么设置reduce任务的数目为是合法的

         JobConf代表一个Map/Reduce作业的配置。

         TaskTracker是在一个单独的jvm上以子进程的形式执行 Mapper/Reducer任务(Task)的。

         JobClient是用户提交的作业与JobTracker交互的主要接口。

         JobClient 提供提交作业,追踪进程,访问子任务的日志记录,获得Map/Reduce集群状态信息等功能。         

         作业提交过程包括:

                  1.       检查作业输入输出样式细节
                  2.       为作业计算InputSplit值。
                  3.       如果需要的话,为作业的DistributedCache建立必须的统计信息。
                  4.       拷贝作业的jar包和配置文件到FileSystem上的Map/Reduce系统目录下。

 

 

 

 

                  5.       提交作业到JobTracker并且监控它的状态。

 

 

         Profiling是一个工具,它使用内置的java profiler工具进行分析获得(2-3个)map或reduce样例运行分析报告。

 

 

Hadoop Streaming

         Hadoop streaming是Hadoop的一个工具, 它帮助用户创建和运行一类特殊的map/reduce作业, 这些特殊的map/reduce作业是由一些可执行文件或脚本文件充当mapper或者reducer。

         Streaming工作原理:mapper和reducer都是可执行文件,它们从标准输入读入数据(一行一行读), 并把计算结果发给标准输出。Streaming工具会创建一个Map/Reduce作业,并把它发送给合适的集群,同时监视这个作业的整个执行过程。

         如果一个可执行文件被用于mapper,则在mapper初始化时, 每一个mapper任务会把这个可执行文件作为一个单独的进程启动。mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。 如果没有tab,整行作为key值,value值为null。

         如果一个可执行文件被用于reducer,每个reducer任务会把这个可执行文件作为一个单独的进程启动。 Reducer任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为reducer的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。

         任何可执行文件都可以被指定为mapper/reducer。这些可执行文件不需要事先存放在集群上; 如果在集群上还没有,则需要用-file选项让framework把可执行文件作为作业的一部分,一起打包提交。

 

 

其它

         Hadooparchives是特殊的档案格式。一个Hadooparchive对应一个文件系统目录。 Hadooparchive的扩展名是*.har。Hadoop archive包含元数据(形式是_index和_masterindx)和数据(part-*)文件。_index文件包含了档案中的文件的文件名和位置信息。

         DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。 注意DistCp使用绝对路径进行操作。

         bin/hadoop 脚本通过系统属性 -Djava.library.path=<path>来确认hadoop本地库是否包含在库路径里。

         Hadoop OnDemand(HOD)是一个能在大型物理集群上供应虚拟hadoop集群的系统。

 

         三种Hadoop模式集群:

                  单机模式

                  伪分布式模式

                   完全分布式模式

         集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode作为TaskTracker。这些机器是slaves

         Hadoop守护进程指NameNode/DataNode 和JobTracker/TaskTracker。

         启动Hadoop集群需要启动HDFS集群和Map/Reduce集群。

守护进程

配置选项

NameNode

HADOOP_NAMENODE_OPTS

DataNode

HADOOP_DATANODE_OPTS

SecondaryNamenode

HADOOP_SECONDARYNAMENODE_OPTS

JobTracker

HADOOP_JOBTRACKER_OPTS

TaskTracker

HADOOP_TASKTRACKER_OPTS

         集群管理网址:http://master:8088/

 

 

 

 

 

参考:

 

         Hadoop 0.18文档

         Hadoop 2.6.0文档

         Hadoop下载网址:http://hadoop.apache.org/releases.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值