Hadoop介绍

Hadoop是Apache下面的一个开源的、可靠地、可扩展的分布式计算存储系统。Hadoop项目中主要包含四个部分:

  • Hadoop Common:用于支持Hadoop其他模块的一些公共程序。
  • Hadoop Distributed File System (HDFS):Hadoop使用的一个高吞吐量的分布式文件系统。
  • Hadoop YARN:用于Hadoop任务调度和集群资源管理的框架。
  • Hadoop MapReduce:基于YARN的并行处理系统,用于处理大数据,MapReduce也是一种编程模型。

当我们从Hadoop官网下载二进制包安装好一个Hadoop集群后,就包含上面四个部分。当然,Hadoop更加是一个生态,基于Hadoop产生了很多的其他软件系统,比如Ambari、 Avro、Hive、Hbase、Spark、Zookeeper等。这些都需要在部署好Hadoop后再单独部署,也不属于Hadoop项目的原生部分。而本文后面介绍的安装部署也只针对Hadoop自身项目,即刚开始列举的四个部分;同时本文主要介绍部署,一些原理以及为什么那样配置也不会做详细说明。后续博客会分别介绍Hadoop生态中的各个项目的一些知识,可持续关注。

Hadoop有三种部署方式:

  1. 单机模式(Local (Standalone) Mode)。hadoop的默认配置模式,特点如下:

    • hadoop使用本地文件系统而非分布式文件系统(HDFS)。
    • 不会启动任何hadoop守护进程,map任务和reduce任务作为同一个进程的不同部分来执行。
    • 仅用于开发或调试MapReduce应用程序。
    • 当首次解压hadoop的源码包时,默认选择了最低的配置。这时,三个xml文件均为空,当配置文件为空时,hadoop会完全运行在本地。
  2. 伪分布式模式(Pseudo-Distributed Mode)。 特点如下:

    • 所有的进程都运行在同一台机器上。
    • 使用分布式文件系统,每个hadoop守护进程都是一个独立的进程。
    • 每个job都是由JobTracker服务管理的独立的进程。
    • 集群中只有一个节点,故HDFS的块复制将限制为单个副本。
    • secondary-master和slaves也都将运行于本地主机。
    • 程序的执行逻辑和分布式模式下的执行逻辑一样,因此,常用于测试。
    • 该模式在本地模式的基础上添加了代码的调试功能,允许你检查内存的使用情况、HDFS输入输出、其它的守护进程的交互。
  3. 分布式模式(Fully-Distributed Mode)。运行于多台机器上的真实环境。

以上三种部署方式的差异对比来自http://mojijs.com/2016/11/221130/index.html

当集群中的节点比较多,组件比较多的时候,部署和运维一套Hadoop系统是比较复杂的,所以在生产中或者节点数较多的系统中往往不会手动去一个一个搭建技术组件,而是通过Hadoop的一些集群管理工具去搭建,这些管理工具往往可以简化部署过程,而且带有一些WebUI,也可以很方便的做后期运维,最常见的两个就是Cloudera Manager和Apache Ambari。而对于学习Hadoop的人来说,这些工具屏蔽了太多的细节,往往不是首选。还有另外两种方式,一种是Hadoop支持通过一些Linux的包管理工具直接安装,比如yumapt-get等,对于Mac,也可以直接使用brew安装;另外一种就是通过Hadoop提供的二进制压缩包(当然也有源码包)去安装。如果我们是为了学习Hadoop而去安装的,那最后一种方式当是首选。

本文就讲述如何通过Hadoop的二进制文件包在单台Linux系统上面搭建伪分布式的Hadoop系统。

注意:

  1. 仅用于学习的话,对系统配置基本没有什么要求。
  2. Hadoop是用Java开发的,所以是跨平台的,可以在Windows、Mac、*nix上面安装,本文在Linux上面安装,具体发行版为Ubuntu 16.04.3 LTS.
  3. 本文的所有操作都在root用户下操作,如果是其他非root用户,对于一些操作需要加sudo。Ubuntu默认没有开root用户,可以通过在其他用户下执行sudo passwd root,为root设置密码来开启root用户,设置完之后就可以使用root登录了。

Hadoop集群搭建

第1步: 安装Java

因为Hadoop使用Java开发,所以需要先安装Java环境(JDK),具体JDK版本可参考HadoopJavaVersions。本文使用的是jdk1.8.0_144。从Oracle官网下载JDK包,解压到/opt目录(目录可自己规划,本文所有安装都在/opt目录下),然后在~/.bashrc中配置如下环境变量:

# for java
export JAVA_HOME=/opt/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

第2步:创建用户(可选)

一般而言,在生产环境中我们最好为Hadoop单独创建用户,而不是使用系统已有用户,甚至是使用root。官方的推荐是创建一个hadoop用户和hadoop组;再创建三个用户hdfsmapredyarn,这三个用户都属于hadoop这个组。然后hdfs这个用户用来运行HDFS,mapred这个用户用来运行MapReduce,yarn这个用户用来运行YARN。

但是对于我们搭建本地测试学习环境来说,这一步可以省略,可以直接使用你系统已有的用户,本文使用root用户。

第3步:安装Hadoop

  1. 下载Hadoop的binary包,本文下载为是hadoop-2.7.3.tar.gz,解压到/opt目录下:

    tar xf hadoop-2.7.3.tar.gz -C /opt

    注意:如果使用了多用户安装,那解压以后,需要将目录权限改为hadoop:hadoop,即用户和组都改为hadoop

  2. ~/.bashrc中配置如下环境变量:

    export HADOOP_HOME=/opt/hadoop-2.7.3
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

    执行source ~/.bashrc使之生效。

第4步:配置SSH

因为Hadoop的一些管理脚本会通过ssh登录到其他节点上面去执行一些命令,所以需要集群内可以相互免密登录(YARN和HDFS)。虽然我们是单台服务器,但还是需要执行ssh localhost命令时不需要输入密码。配置方式如下:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

注意:如果使用了多用户安装,需要分别在hdfsyarn用户下面执行上面3条命令。

第5步:HDFS配置

Hadoop的配置文件和配置参数参数非常多,基本都在$HADOOP_HOME/etc/hadoop目录下,这里先只列举伪分布集群必须配置的项。

$HADOOP_HOME/etc/hadoop/hadoop-env.sh中找到注释掉的JAVA_HOME,取消注释并配置为你的JDK路径:

export JAVA_HOME=/opt/jdk1.8.0_144

$HADOOP_HOME/etc/hadoop/core-site.xml中配置如下内容(配置HDFS文件系统的URI):

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

$HADOOP_HOME/etc/hadoop/hdfs-site.xml中配置如下内容(因为是单机,所以配置HDFS的复制数设置为1,即不复制,默认是3):

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

Tips

默认Hadoop会把数据存储在/tmp/hadoop-${user.name}目录下,涉及的两个配置项为:hadoop.tmp.dirdfs.datanode.data.dir,默认值分别为/tmp/hadoop-${user.name}file://${hadoop.tmp.dir}/dfs/data。如果要修改数据存储位置的话,可以修改这两个参数。前者在core-site.xml中设置,后者在hdfs-site.xml中设置。

配置完以后,第一次使用前需要先格式化HDFS文件系统,执行如下命令:

$HADOOP_HOME/bin/hdfs namenode -format

如果出现类似如下打印,则表示成功:

17/11/21 16:07:45 INFO util.ExitUtil: Exiting with status 0
17/11/21 16:07:45 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
************************************************************/

第6步:Hadoop启停

Hadoop的所有操作命令和控制脚本都在$HADOOP_HOME/bin(命令)和$HADOOP_HOME/sbin(控制脚本)下面:

~ ls $HADOOP_HOME/bin
container-executor  hadoop  hadoop.cmd  hdfs  hdfs.cmd  mapred  mapred.cmd  rcc  test-container-executor  yarn  yarn.cmd
~ ls $HADOOP_HOME/sbin
distribute-exclude.sh  hdfs-config.sh           refresh-namenodes.sh  start-balancer.sh    start-yarn.cmd  stop-balancer.sh    stop-yarn.cmd
hadoop-daemon.sh       httpfs.sh                slaves.sh             start-dfs.cmd        start-yarn.sh   stop-dfs.cmd        stop-yarn.sh
hadoop-daemons.sh      kms.sh                   start-all.cmd         start-dfs.sh         stop-all.cmd    stop-dfs.sh         yarn-daemon.sh
hdfs-config.cmd        mr-jobhistory-daemon.sh  start-all.sh          start-secure-dns.sh  stop-all.sh     stop-secure-dns.sh  yarn-daemons.sh

虽然$HADOOP_HOME/sbin下面有很多脚本,但我们常用的不多,很多脚本都是在其他脚本里面调用的。在新版本里面,start-all.shstop-all.sh脚本已经不推荐使用了,后续版本也可能废弃掉。现在主要使用start-dfs.shstop-dfs.sh来启动和停止HDFS,使用start-yarn.shstop-yarn.sh来启动和停止YARN。

默认Hadoop的日志在$HADOOP_HOME/logs目录,可通过HADOOP_LOG_DIR修改。

执行start-dfs.sh来启动HDFS:

# 执行start-dfs.sh启动
~ start-dfs.sh
Starting namenodes on [localhost]
localhost: starting namenode, logging to /opt/hadoop-2.7.3/logs/hadoop-root-namenode-ubuntu.out
localhost: starting datanode, logging to /opt/hadoop-2.7.3/logs/hadoop-root-datanode-ubuntu.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/hadoop-2.7.3/logs/hadoop-root-secondarynamenode-ubuntu.out

# 使用jps命令来查看进程
~ jps
21283 Jps
21060 SecondaryNameNode
20649 NameNode
20795 DataNode

可以看到HDFS包含三个进程:NameNodeSecondaryNameNodeDataNode。而

执行start-yarn.sh启动YARN(为了更清楚的看清楚进程,我们先执行stop-dfs.sh停掉HDFS):

~ stop-dfs.sh
Stopping namenodes on [localhost]
localhost: stopping namenode
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode

~ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root-resourcemanager-ubuntu.out
localhost: starting nodemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root-nodemanager-ubuntu.out

~ jps
21988 ResourceManager
22184 NodeManager
23118 Jps

可以看到YARN包含两个进程:ResourceManagerNodeManager

第7步:创建用户目录

经过前面6步,我们已经搭建起来了一个基本的Hadoop集群,如果需要让其他用户也可以访问系统,那我们要为每个用户创建一个家目录,并赋予权限,可参考如下命令(比如我使用root用户):

~ hadoop fs -mkdir -p /user/root
~ hadoop fs -chown -R root:root  /user/root

# 也可以限制每个用户可以使用的空间,比如限制为1T
~ hdfs dfsadmin -setSpaceQuota 1t /user/username

集群验证

上面我们已经搭建好了一个单机版的伪分布式Hadoop集群,下面我们来验证一下集群的基本功能是否正常。首先确保已经执行过start-dfs.shstart-yarn.sh,各进程都已经正常启动(可使用jps查看)。

测试1:访问NameNode

HDFS启动后,Namenode默认监听50070端口,我们可以通过浏览器去访问http://<你的IP>:50070

HDFS NameNode

测试2:执行MapReduce程序

首先保证已经创建root用户目录(参照第7步),然后依次执行下面的命令:

# 进入Hadoop安装目录
cd $HADOOP_HOME/
 
# 拷贝例子用到的文件 
bin/hdfs dfs -put etc/hadoop  input

# 执行安装包里面带的例子程序(注意改成你自己下载的版本号)
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

# 查看执行结果
bin/hdfs dfs -get output output
cat output/*

测试3:访问YARN

默认YARN监听8088,我们可以访问http://<你的IP>:8088查看:

YARN

结束语

至此,伪分布式Hadoop集群就算搭建完了,里面涉及到了一些Hadoop的概念配置等都没有解释(比如NameNode、DataNode、ResourceManager等)。后续文章会对Hadoop生态进行介绍,可持续关注。

本文参考自Hadoop官方文档(我认为官方文档永远是优先级最高的文档,不光是Hadoop),完整的Hadoop集群部署方案可参考官方文档Fully-Distributed Operation Setup