什么是Hadoop

  1. Hadoop是Apache基金会下的一个开源分布式计算平台,以Hadoop分布式文件系统(Hadoop distributed file system, HDFS)和MapReduce分布式计算框架为核心,为用户提供了底层细节透明的分布式基础设施。

  2. 经过几年的快速发展,Hadoop现在已经发展成为包含多个相关项目的软件生态系统。侠义的Hadoop核心

    • Hadoop Common:0.20+版本中,从core更名为common,提供一些常用的工具,包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。

    • Hadoop HDFS:是一个高度容错的系统、能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。

    • Hadoop MapReduce:是一种编程模型,用以进行大数据量的计算。将应用划分为Map和Reduce两个步骤,其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果,Reduce对中间结果中相同的“键”的所有“值”进行规约,得到最终结果。


Hadoop生态系统

  1. Sqoop

    • 是SQL-to-Hadoop的缩写,是Hadoop的周边工具,主要作用是在结构化数据存储与Hadoop之间进行数据交换。

    • Sqoop可以将一个关系型数据库(Mysql、Oracle等)中的数据导入Hadoop的HDFS、Hive中,也可逆向导入。

  2. Mahout

    • 主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。

    • Mahout现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等使用的数据挖掘方法。

    • 除了算法,还包含数据的输入和输出工具、与其他存储系统集成(数据库、MongoDB)

  3. ZooKeeper

    • 作为一个分布式的服务框架,解决分布式计算中的一致性问题。

    • 如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。常作为组件使用。

    • 主要用于协调各个组件之间的一致性。

  4. Hive

    • 最早由FaceBook设计,是建立在Hadoop基础上的数据仓库架构

    • 数据仓库的管理,包括了数据ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。

    • Hive提供的是一种结构化数据机制,Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。

  5. Pig

    • 运行在Hadoop之上,是对大型数据集进行分析和评估的平台。

    • 简化使用Hadoop进行数据分析的要求,提供一个高层次的、面向领域的抽象语言Pig Latin

    • 通过Pig Latin,可以将复杂且相互关联的数据分析任务编码为Pig操作上的数据流脚本,通过将脚本转换为MapReduce任务链。和Hive一样,Pig降低了对大型数据集进行分析和评估的门槛。

  1. HBase

    • 继Google的BigTable系统论文,开源社区在HDFS上构建HBase。

    • 是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。

    • 和传统的关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。提供对大规模数据的随机、实时读写访问。

    • HBase中保存的数据可以使用MapReduce来处理,将数据存储和并行计算完美结合。


Hadoop的Master和Slave

Namenode 和 Datanode

  1. HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

  2. Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。

  3. 集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。

  4. Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

JobTracker和TaskTracker

  1. Hadoop MapReduce采用Master/Slave结构

    • Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker

    • Slave:负责任务的执行和任务状态的汇报,即MapReduce中的TaskTracker。

  2. JobTracker

    • JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。

    • 作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。

    • 资源管理

  3. TaskTracker

    • TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信

    • 汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:

      • 机器级别信息:节点健康情况、资源使用情况等

      • 任务级别信息:任务执行进度、任务运行状态等

    • 执行命令:JobTracker会给TaskTracker下达各种命令.


Hadoop集群配置

  1. Hadoop现在的最新版本2.5.1,主要包括三个核心组件:

  2. 配置前提

    • 平台:Unbuntu Linux

    • 软件要求:JDK(与hadoop版本对应)、SSH

    • 下载Hadoop最新稳定版hadoop-2.5.1.tar.gz

    • 解压hadoop-2.5.1.tar.gz,编辑etc/hadoop/hadoop-env.sh文件

      1
      2
      3
      4
      5
      # set to the root of your Java installation
      export JAVA_HOME=/usr/java/latest

      # Assuming your installation directory is /usr/local/hadoop
      export HADOOP_PREFIX=/usr/local/hadoop
    • 执行$ bin/hadoop指令

  3. 开启hadoop集群有三种模式

    • 本地(单例)模式

      1
      2
      3
      4
      $ mkdir input
      $ cp etc/hadoop/*.xml input
      $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep input output 'dfs[a-z.]+'
      $ cat output/*
    • 伪分布式模式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
       <!--编辑 etc/hadoop/core-site.xml-->
      <configuration>
      <property>
      <name>fs.defaultFS</name>
      <value>hdfs://localhost:9000</value>
      </property>
      </configuration>

      <!--编辑 etc/hadoop/hdfs-site.xml:-->
      <configuration>
      <property>
      <name>dfs.replication</name>
      <value>1</value>
      </property>
      </configuration>
      1
      2
      3
      4
      5
      # 开启ssh
      $ ssh localhost
      # 如果启动不了,执行以下操作
      $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
      $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      # 下面就可以在本地运行map reduce程序了

      # 首先格式化文件系统
      $ bin/hdfs namenode -format

      # 第二步,开启namenode和datanode后台守护进程。同时产生的日志将会写到$HADOOP_LOG_DIR目录中,默认为 $HADOOP_HOME/logs
      $ sbin/start-dfs.sh

      # 第三步,浏览namenode的web界面,默认的地址是NameNode - http://localhost:50070/

      # 第四步,设定mapreduce 程序运行要求的工作目录
      $ bin/hdfs dfs -mkdir /user
      $ bin/hdfs dfs -mkdir /user/<username>

      # 第五步,将输入文件拷贝到hadoop的分布式文件系统中
      $ bin/hdfs dfs -put etc/hadoop input

      # 第六步,运行hadoop中自带的一些例子程序
      $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep input output 'dfs[a-z.]+'

      # 第七步,查看输出的结果
      # 可以将结果文件从分布式文件系统中拷贝到本地文件系统中查看
      $ bin/hdfs dfs -get output output
      $ cat output/*
      # 也可以直接在分布式文件系统中查看
      $ bin/hdfs dfs -cat output/*

      # 第八步,完成任务后,关闭后台守护进程
      $ sbin/stop-dfs.sh
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
        <!--如果想要在YARN上来运行map reduce程序,需要配置一些参数-->
      <!--从第五-八步有所区别-->
      <!--编辑etc/hadoop/mapred-site.xml-->
      <configuration>
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      </configuration>

      <!--编辑etc/hadoop/yarn-site.xml:-->
      <configuration>
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      </configuration>
      1
      2
      3
      4
      5
      6
      # 开启ResourceManager daemon和NodeManager daemon
      $ sbin/start-yarn.sh
      # 浏览ResourceManage的web界面,默认地址为ResourceManager - http://localhost:8088/
      # 运行MapReduce job
      # 执行完成,关闭daemon
      $ sbin/stop-yarn.sh
    • 完全分布式模式