hadoop详解

1.    什么是大数据
      国际顶级权威咨询机构麦肯锡定义大数据为:大数据指的是所涉及的数据集规模已经超过了传统数据软件获取,存储,管理和分析的能力。    
从上面的定义可以看出以下几点:

    多大的数据才算大数据,这并没有一个明确的规定,且不同行业有不同的标准。

    大数据不仅仅是大,它还包含了数据集规模已经超过了传统数据库软件获取,存储,分析和管理这一层意思。

   大数据不一定永远是大数据,大数据的标准是可变的,在20年前1GB的数据也可以叫大数据,可见,随着计算机技术发展,符合大数据标准的数据集容量也会增长。 

2.    Haoop的定义

       hadoop的定义:Hadoop软件库是一个框架,允许在集群中使用简单的编程模型对大规模数据集进行分布式计算。它被设计为可以从单一服务器扩展到数以千计的本地计算和存储的节点,并且Hadoop会在应用层面监测和处理错误,而不依靠硬件的高可用性,所以Hadoop能够在每一个节点都有可能出错的集群之上提供一个高可用服务。
特点:
      hadoop是一个框架。是由一系列的软件库组成的框架。最主要的是Commons:提供远程过程调用RPC和序列化机制。HDFS:负责数据的存储。YARN:负责统一资源调度和管理。
      hadoop适合处理大规模数据。处理海量数据的能力十分可观,并且能够实现分布式存储和分布式计算。
      hadoop被部署在一个集群上。通过一组网络互联的计算机,集群里的每一台计算机称作一个节点。hadoop被部署在集群之上,对外提供服务。

3.    hadoop的运行模式
        单机模式是Hadoop的默认模式。当配置文件为空时,Hadoop完全运行在本地。因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用逻辑。
       伪分布模式. Hadoop守护进程运行在本地机器上,所有的守护进程都运行在一个节点上,模拟一个小规模的的集群。该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。
      集群模式:hadoop的守护进程运行在多个节点上,形成一个真正意义上的集群。
4.    hadoop的安装

           hadoop的安装步骤:
         安装运行环境 -----ubuntu14.04或者虚拟机
         修改主机名和用户名----为了统一开发环境
         配置静态IP地址-----hadoop集群启动时通过固定的主机名和IP地址启动
         配置SSH无密码连接----安全进行网络数据传输
         安装JDK
         配置hadoop
         格式化hdfs
         启动hdoop并验证安装

5.     HDFS(Hdoop distributed file system)

          HDFS的思想:当数据集的大小超过单台计算机的存储能力的时,就有必要将其进行分区并存储到若干台单独的计算机上,而管理网络中跨多台计算机存储的文件系统就是分布式文件系统。该系统架构于网络之上,势必会引入网络编程的复杂性,该文件系统能够容忍节点故障并且不丢失数据。是一个抽象的系统概念。
特点:
         适合存储超大文件
         运行于廉价的硬件之上
         流式数据访问:一次写入,多次读取
6.    MapReduce的运行机制和原理

      1)    MapReduce初析
          MapReduce是一个计算框架,既然是做计算的框架,那么表现形式是有个输入(input),mapreduce操作这个输入,通过本身定义好的模型,得到一个输出(output),这个输出就是我么所需要的结果。
          我们要学习的就是这个计算模型的运行规则。在运行一个MapReduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入和输出。而程序员要做的就是定义好这两个阶段的函数:map函数和reduce函数。
      2)   mapreduce运行机制
       从物理实体来分析mapreduce:
          参入mapreduce作业执行涉及4个独立的实体:
客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;
TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个;
Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面;
 

从逻辑实体来分析mapreduce:输入分片(input split)、map阶段、combiner阶段、shuffle阶段和reduce阶段。
    流程:每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。


对流程的每一步都有很多细节,下面我来一一说明:

       1)       在map task执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,map task只读取split。Split与block的对应关系可能是多对一,默认是一对一。在WordCount例子里,假设map的输入数据都是像“aaa”这样的字符串。


      2)      在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对: key是“aaa”, value是数值1。因为当前map端只做加1的操作,在reduce task里才去合并结果集。假设这个job有3个reduce task,到底当前的“aaa”应该交由哪个reduce去做呢,是需要现在决定的。


        MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。 在我们的例子中,“aaa”经过Partitioner后返回0,也就是这对值应当交由第一个reducer来处理。接下来,需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。


        3)       这个内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写,字面意思很直观。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。

          当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。


        在针对每个reduce端而合并数据时,有些数据可能像这样:“aaa”/1, “aaa”/1。对于WordCount例子,就是简单地统计单词出现的次数,如果在同一个map task的结果中有很多个像“aaa”一样出现多次的key,我们就应该把它们的值合并到一块,这个过程叫reduce也叫combine。但MapReduce的术语中,reduce只指reduce端执行从多个map task取数据做计算的过程。除reduce外,非正式地合并数据只能算做combine了。其实大家知道的,MapReduce中将Combiner等同于Reducer。


        如果client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。


        4)     每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。当map task真正完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge。Merge是怎样的?如前面的例子,“aaa”从某个map task读取过来时值是5,从另外一个map 读取时值是8,因为它们有相同的key,所以得merge成group。什么是group。对于“aaa”就是像这样的:{“aaa”, [5, 8, 2, …]},数组中的值就是从不同溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过Combiner,也会使用Combiner来合并相同的key。


         至此,map端的所有工作都已结束,最终生成的这个文件也存放在TaskTracker够得着的某个本地目录内。每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程开始启动。

         Reducer真正运行之前,所有的时间都是在拉取数据,做merge,且不断重复地在做。如前面的方式一样,下面我也分段地描述reduce 端的Shuffle细节:

         Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中。


         Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置,因为Shuffle阶段Reducer不运行,所以应该把绝大部分的内存都给Shuffle用。这里需要强调的是,merge有三种形式:1)内存到内存  2)内存到磁盘  3)磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。


          Reducer的输入文件。不断地merge后,最后会生成一个“最终文件”。为什么加引号?因为这个文件可能存在于磁盘上,也可能存在于内存中。对我们来说,当然希望它存放于内存中,直接作为Reducer的输入,但默认情况下,这个文件是存放于磁盘中的.当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDFS上。

主要借鉴的文章地址:http://blog.youkuaiyun.com/liujianfei526/article/details/51460806 和 http://langyu.iteye.com/blog/992916  和 http://blog.youkuaiyun.com/csj941227

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值