Hadoop 初步简单小节(一)

一. 它是什么

Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情況下开发分布式程序,充分利用集群的威力进行高速运算和存储。

主要解决2大问题:大数据存储,大数据分析。主要对应的 Hadoop 的 HDFS 分布式文件系统 和 mapreduce 分布式运算编程框架。

  1. HDFS(Hadoop Distributed File System)具有可扩展(伸缩),高容错(多份副本),高吞吐量(放弃了文件一致性模型,通过流式数据访问),高效率(通过数据分发,可在所有节点上并行处理),成本低(硬件要求低)的特点。
  2. Mapreduce:包含map(映射)和 reduce (归约)2个过程,在HDFS上并行计算

(一) 什么是HDFS

  HDFS 采用主从(master/slave)模型,一个HDFS 集群有一个 NameNode 名称节点( HDFS 内部提供元数据服务),一个Secondary NameNode 辅助节点(帮助名称节点,主要是为了整合元数据操作(注意不是名称节点的备份))和多个 DataNode 数据节点(为 HDFS 提供存储块)。

  存储在 HDFS 中的文件被分成块,然后这些块被复制到多个数据节点中(DataNode),这与传统的 RAID 架构大不相同。块的大小(通常为 128M)和复制的块数量在创建文件时由客户机决定。名称节点可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。

   上传流程:

  1. 客户端将上传的文件按128M大小分块(上图:分成5块,A,B,C,D,E)
  2. 客户节点向名称节点发送上传请求,名称节点根据各 DataNode 数据节点信息,返回可用的 DataNode 列表
  3. 客户端向各可用的 DataNode 节点发送分布后的数据块,以流式写入。
  4. 写入完成之后,各DataNode向NameNode发送信息,更新元数据

  注意:

  • 因为3各副本,写 1T 文件,需要 3T 的存储,3T 的网络流量
  • 在执行读或写的过程中,NameNode 和 DataNode 通过 HeartBeat 进行保存通信,确定 DataNode 活着。如果发现 DataNode 死掉了,就将死掉的 DataNode 上的数据,放到其他节点去,读取时,读其他节点。

  各节点介绍:

  1. NameNode 名称节点:

    它通常在HDFS集群架构上单独机器上运行,负责管理“文件系统名称空间”和控制“外部客户机的访问”以及“是否将文件映射到DataNode上”。

    名称节点服务维护两套数据, 一套是文件目录与数据块之间的关系 , 另一套是数据块与数据节点之间的关系 。 前一套 数据是静态的 ,是存放在磁盘上的, 通过fsimage和edits文件来维护 ; 后一套 数据是动态的 ,不持久放到到磁盘的,每当集群启动的时候,会自动建立这些信息,所以一般都放在内存中。

    NameNode保存文件metadata信息,包括:

    • 文件owership和permissions
    • 文件包含哪些块
    • Block保存在哪个DateNode(由DataNode启动时上报给)

    NameNode 中文件包含:

    • fsimage (文件系统镜像):  元数据镜像文件。存储某一时段NameNode内存元数据信息;
    • edits (操作日志文件):是在 NameNode 启动后对文件系统的改动序列;
    • fstime: 保存最近一次checkpoint的时间。

   2. DataNode 数据节点:

    相应外部客户端的“读写请求”,同时也相应来自 NameNode 节点的“创建、删除和复制”的命令,各数据节点与名称节点才采用TCP定期心跳,作为修复条件(复制生成相应丢失的数据)

    作用:

    • 保存Block,每个块对应一个元数据信息文件。这个文件主要描述这个块属于哪个文件,第几个块等信息。
    • 启动DataNode线程的时候会向NameNode汇报Block信息
    • 通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode 10分钟没有收到DataNode的心跳,认为其已经lost,并将其上的Block复制到其它的DataNode.

  3. Secondary NameNode 辅助节点:

    作用:

    • 定期将NameNode 的镜像 fsimage 和操作日志文件 editlog 合并,防止edit log 文件过大
    • 减少NameNode 的启动时间
    • 作为NameNode 一个冷备份

    

    

  Secondary NameNode 会定时到 NameNode 去获取名称节点的 edits,并及时更新到自己 fsimage 上。如果 Secondary NameNode 新的 fsimage 文件达到一定阈值,它就会将其拷贝回 NameNode 名称节点上,这样 NameNode 在下次重启时会使用这个新的 fsimage 文件

(二) 什么是 Mapreduce:

  一个 Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的 Reduce(归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

  例子如下:

    

 

  

 

    流程介绍:

    • Input (输入): HDFS上存放的数据文件
    • Splitting(分片):Mapreduce 框架会根据文件的大小进行分片,每个分片作为一个 Map 任务。一个HDFS块对应一个分片。
    • Mapping (map 阶段):编写 map 函数处理接受到的 Map 任务。=> 对数据进行分割得到映射关系,键值。
    • Shuffling(): 把所有 Map 的输出按照键进行排序,并且把相对键的键值对整合到同一个组中,然后作为 Reduce 的输入发送给 Reduce。
    • Reducing: 编写 reduce 函数处理 Shuffling 归类后的数据(键值对)进行处理,比如合并。
    • Final result:Reduce 后的数据保存在 HDFS 上。

(三)资源管理 :YARN

  当 MapReduce 发展到 2.x 时就不使用 JobTracker 来作为自己的资源管理框架,而选择使用 YARN。这里需要说明的是,如果使用 JobTracker 来作为 Hadoop 集群的资源管理框架的话,那么除了 MapReduce 任务以外,不能够运行其他任务。也就是说,如果我们集群的 MapReduce 任务并没有那么饱满的话,集群资源等于是白白浪费的。所以提出了另外的一个资源管理架构 YARN(Yet Another Resource Manager)。这里需要注意,YARN 不是 JobTracker 的简单升级,而是“大换血”。同时 Hadoop 2.X 也包含了此架构。Apache Hadoop 2.X 项目包含以下模块。

(四)HADOOP 生态

  

二、如何使用

  Hadoop shell 请参考:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

  在Hadoop-0.14.1版本后, Hadoop支持了Python和C++语言, 在Hadoop的文档中也表示可以使用Python进行开发, 通常来说都会考虑将源码打包成jar包再运行, 例子: PythonWordCount 这明显不方便. 在Hadoop的文档中提到了Hadoop Streaming, 我们可以使用流的方式来操作它.:

  利用python的迭代器和生成器优化Mapper 和 Reducer代码:

  mapper.py

  

#!/usr/bin/env python

import sys


def read_input(file):
    for line in file:
        yield line.split()

def main(separator='\t'):
    data = read_input(sys.stdin)
    for words in data:
        for word in words:
            print "%s%s%d" % (word, separator, 1)

if __name__ == "__main__":
    main()

  reducer.py

  

#!/usr/bin/env python

import sys
from datetime import datetime
from operator import itemgetter
from itertools import groupby


def read_mapper_output(file, separator = '\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main(separator = '\t'):
    data = read_mapper_output(sys.stdin, separator = separator)
    for current_word, group in groupby(data, itemgetter(0)):
        try:
            total_count = sum(int(count) for current_word, count in group)
            print "%s%s%d" % (current_word, separator, total_count)
        except valueError:
            pass

if __name__ == "__main__":
    print("run start  > ", datetime.now())
    main()
    print("run end <", datetime.now())

  注意:这里 mapper.py 在Mapreduce 中会多次被调用进行聚合操作,不需要写成死循环一直读标准输入,甚至等待。

  测试:

[rte@code]$echo "foo foo quux labs foo bar quux" | ./mapper.py
foo 1
foo 1
quux    1
labs    1
foo 1
bar 1
quux    1
[rte@code]$echo "foo foo quux labs foo bar quux" | ./mapper.py | sort -k1,1 | ./reducer.py
bar 1
foo 3
labs    1
quux    2

  注意: sort -k1,1 和 groupby的使用

  启动 Mapreduce:

hadoop jar /opt/app/hadoop/hadoop-2.7.6/share/hadoop/tools/lib/hadoop-streaming-2.7.6.jar -file ./mapper.py -mapper ./mapper.py -file ./reducer.py -reducer ./reducer.py -input /test/* -output /output

 

   查看结果:

hadoop fs  -cat /output/part-00000

  或者

hdfs dfs -cat /output/part-00000

三、为什么用

  什么叫大数据,“大”,说的并不仅是数据的“多”!不能用数据到了多少TB ,多少PB 来说。 大数据有几个特点:大量,多样,实时,不确定。

    • 多样:数据的多样性,是说数据可能是结构型的数据,也可能是非结构行的文本,图片,视频,语音,日志,邮件等。
    • 实时:大数据需要快速的,实时的进行处理。如果说对时间要求低,那弄几个机器,对小数据进行处理,等个十天半月的出来结果,这样也没有什么意义了。
    • 不确定: 数据是存在真伪的,各种各样的数据,有的有用,有的没用。很难辨析。

   根据以上的特点,我们需要一个东西,来:

  1. 存储大量数据
  2. 快速的处理大量数据
  3. 从大量数据中进行分析

  海量数据存储的问题:

    • 磁盘IO称为一种瓶颈,而非CPU资源

    • 网络带宽是一种稀缺资源

    • 硬件故障成为影响稳定的一大因素

  

  而 Hadoop 拥有 HDFS 分布式文件系统 和 mapreduce 分布式运算编程框架,主要解决2大问题:大数据存储,大数据分析:

    1. HDFS(Hadoop Distributed File System)具有可扩展(伸缩),高容错(多份副本),高吞吐量(放弃了文件一致性模型,通过流式数据访问),高效率(通过数据分发,可在所有节点上并行处理),成本低(硬件要求低)的特点。
    2. Mapreduce:包含map(映射)和 reduce (归约)2个过程,在HDFS上并行计算

四、优缺点,如何优化

    1. 优点:

      • 支持超大文件:HDFS 存储文件支持TB和PB级别的
      • 检测和快速应对硬件故障,高容错,及高伸缩

        可以上千台连在一起,namenode 通过与DataNode的心跳机制,检测是否存在,实现线性动态伸缩,及数据备份,数据恢复。

    2. 缺点:

      • 高吞吐量与低延迟,注重高吞吐量,牺牲了获取数据的延迟。对于低延迟的请求范围,HBase更合适。
      • 不适合小文件存储:受限于NameNode的内存容量,如果大量小文件,相对内存的利用率太低
      • 一致性,流式模型(只能追加),不能修改文件,只能增加。不合适多用户写入。HDFS 合适于一次写入,多次读取的情景。

    3. 优化:

 

五、参考:

posted @ 2019-02-17 22:05  binger0712  阅读(324)  评论(0)    收藏  举报