1. 分类
Hadoop的运行模式包含三种,如下:
- 本地模式;
- 伪分布式模式;
- 完全分布式模式。
针对这3种模式,分别介绍一下遵循这些模式要如何搭建hadoop的运行坏境。本教程的安装均基于vmware + CentOS
2. 本地模式
2.1 虚机环境准备
- 创建用户组
groupadd bigdata
- 创建hadoop用户(用户名可以随意取),并设置密码
useradd hadoop -g bigdata
passwd hadoop
- 给hadoop添加root权限
修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
修改完毕,现在可以用hadoop帐号登录,然后用命令 sudo ,即可获得root权限进行操作。
- 在/opt目录下创建module和software文件夹,并将这两个文件夹的所有者改成hadoop
----当前用户为hadoop
cd /opt
sudo mkdir module -- 存放解压后的软件包
sudo mkdir software -- 存放下载的软件包
sudo chown hadoop:bigdata module
sudo chown hadoop:bigdata software
2.2 安装JDK
在安装Hadoop之前需要,先安装JDK。关于JDK如何安装,请参考:这里
另外,Hadoop 2.7及之后的版本要求至少安装JDK 7,更多请参考Hadoop-JavaVersions
2.3 安装Hadoop
- 将Hadoop的tar包下载到/opt/software中
[hadoop@zgc software]$ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
- 解压,指定解压到/opt/module目录中
[hadoop@zgc software]$ tar -xzvf hadoop-2.7.7.tar.gz -C /opt/module/
- 将Hadoop添加到环境变量中
打开/etc/profile文件,在尾部添加以下内容
# Hadoop
export HADOOP_HOME=/opt/module/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
执行source /etc/profile
指令让环境立即生效。
- 验证Hadoop安装结果
[hadoop@zgc module]$ hadoop version
Hadoop 2.7.7
Subversion Unknown -r c1aad84bd27cd79c3d1a7dd58202a8c3ee1ed3ac
Compiled by stevel on 2018-07-18T22:47Z
Compiled with protoc 2.5.0
From source with checksum 792e15d20b12c74bd6f19a1fb886490
This command was run using /opt/module/hadoop-2.7.7/share/hadoop/common/hadoop-common-2.7.7.jar
2.4 Hadoop目录结构
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
2.5 运行官方WordCount案例
至此,不用再做任何操作,我们可以运行官方的MapReduce示例程序WordCount
3. 伪分布式
可分为HDFS和YARN的配置搭建
3.1 HDFS集群配置
一共需要配置3个文件:hadoop-env.sh、core-site.xml、hdfs-site.xml
,这3个文件都位于{hadoop_home}/etc/hadoop/目录下。
- 配置 hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_131
该文件中有这一项配置,不过原始配置中JDK的路径不对,需要替换成实际路径。
- 配置 core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.7/data/tmp</value>
</property>
</configuration>
- 配置 hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
3.2 启动集群
- 如果是第一次启动的话需要先格式化NameNode
[hadoop@hadoop01 bin]$ hdfs namenode -format
格式化NameNode的过程中会创建hadoop.tmp.dir
配置的目录,另外需要注意:
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。
- 启动NameNode和DataNode
[hadoop@hadoop01 hadoop-2.7.7]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.7.7/logs/hadoop-hadoop-namenode-hadoop01.out
[hadoop@hadoop01 hadoop-2.7.7]$ sbin/hadoop-daemon.sh start datanode
starting datanode, logging to /opt/module/hadoop-2.7.7/logs/hadoop-hadoop-datanode-hadoop01.out
[hadoop@hadoop01 hadoop-2.7.7]$ jps
2582 NameNode
2756 Jps
2684 DataNode
关闭服务
./hadoop-daemon.sh stop namenode
./hadoop-daemon.sh stop datanode
另外还可以通过start-dfs.sh
和stop-dfs.sh
直接对hdfs中的namenode\datenode\ secondarynamenode三个节点进行开启和关闭。
- 浏览器访问 http://192.168.2.101:50070/dfshealth.htm 查看hdfs文件系统。
3.3 YARN配置
- 配置yarn-env.sh,指定jdk路径
export JAVA_HOME=/usr/java/jdk1.8.0_131
- 配置yarn-site.xml
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
- 配置mapred-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_131
- 对mapred-site.xml.template重新命名为mapred-site.xml,并添加以下配置
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.4 启动和检查集群
启动ResourceManager
yarn-daemon.sh start resourcemanager
启动NodeManager
yarn-daemon.sh start nodemanager
启动完成之后,通过web端查看YARN
http://hadoop01:8088/cluster
单机和伪分布式有什么区别?
相同点:它们都是运行在单台机器上.
差异:单机模式没有分布式文件系统,它直接读写本地操作系统的文件系统,该模式主要用于开发调试MapReduce。单机模式不对配置文件进行修改,它不会启动NameNode、DataNode等守护进程;
伪分布式模式在一台机器上运行不同的进程来模拟各类守护节点(NameNode、DataNode等)。在这种模式下,Hadoop会使用hdfs,另外它还需要修改相关配置文件。
4. 完全分布式
我们来搭建一个由3个节点组成的Hadoop集群,节点规划如下:
hadoop01 (192.168.2.101) |
hadoop02 (192.168.2.102) |
hadoop03 (192.168.2.103) |
|
---|---|---|---|
HDFS | NameNode DataNode |
DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager |
NodeManager |
4.1 集群配置
- 核心配置文件
配置core-site.xml
,在该文件中编写如下配置:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.7/data/tmp</value>
</property>
- HDFS配置文件
配置hadoop-env.sh
文件,在其中指定jdk的路径
export JAVA_HOME=/usr/java/jdk1.8.0_131
配置hdfs-site.xml
,在该文件中写入如下配置:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:50090</value>
</property>
- YARN配置文件
配置yarn-env.sh
,指定jdk的路径
export JAVA_HOME=/usr/java/jdk1.8.0_131
配置yarn-site.xml
,在该文件中增加如下配置:
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
- MapReduce配置文件
配置mapred-env.sh
,指定jdk路径
export JAVA_HOME=/usr/java/jdk1.8.0_131
配置mapred-site.xml
文件,增加如下配置:
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 配置slaves文件
slaves文件是用来指定集群中的节点信息,它的完整路径是:/opt/module/hadoop-2.7.7/etc/hadoop/slaves
。将该文件修改成:
hadoop01
hadoop02
hadoop03
注意:slaves文件中不允许出现空格和空行!
4.2 集群的分发
上面的操作是在集群中某一台机器hadoop01上完成配置的,之后可以将配置好的hadoop目录拷贝到其他机器(hadoop02、hadoop03),可以通过scp
指令进行远程拷贝。拷贝完成之后,hadoop02和hadoop03不用做任何变更。
补充说明:
- vi /etc/hostname 修改hostname;
- 集群之间的机器要关闭防火墙;(重要的环境不可直接关闭,要配置防火墙的访问策略。)
- 集群间的各个节点需要配置/etc/hosts文件,增加各个节点域名和ip的隐射;
- 在各个节点上的/etc/profile文件中配置hadoop-home的环境变量。
4.3 集群启动
1.如果是第一次启动需要先格式化NameNode。
hdfs namenode -format
注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除hadoop目录下的data和log数据(如果存在的话)。
- 启动hdfs
集群配置中,我们指定了hadoop01上运行namenode,所以需在hadoop01节点上启动hdfs
[hadoop@hadoop01 hadoop-2.7.7]$ start-dfs.sh
启动完成之后,在各个节点上执行jps,查看进程运行情况如下:
[hadoop@hadoop01 hadoop-2.7.7]$ jps
4166 NameNode
4482 Jps
4263 DataNode
[hadoop@hadoop02 hadoop-2.7.7]$ jps
3218 DataNode
3288 Jps
[hadoop@hadoop03 hadoop-2.7.7]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
可以看到和上面我们的节点规划情况一致。
- 启动yarn
在ResouceManager所在的机器上启动YARN,这里我们在hadoop02节点上启动YARN
[hadoop@hadoop02 hadoop-2.7.7]$ start-yarn.sh
4.4 集群验证
1.web端查看HDFS文件系统
http://hadoop01:50070/dfshealth.html#tab-overview
2.web端查看YARN
http://hadoop02:8088/cluster
3.web端查看SeconddaryNameNode
http://hadoop03:50090/status.html
4.hdfs基本操作
hdfs dfs -mkdir -p /usr/hadoop/input
5. 配置文件说明
Hadoop配置文件分为两类:默认配置文件和自定义配置文件,用户想修改某个默认的配置值时,可以通过自定义配置文件更改相应的属性值。
- 默认配置文件
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
core-default.xml | hadoop-common-2.7.7.jar/ core-default.xml |
hdfs-default.xml | hadoop-hdfs-2.7.7.jar/ hdfs-default.xml |
yarn-default.xml | hadoop-yarn-common-2.7.7.jar/ yarn-default.xml |
mapred-default.xml | hadoop-mapreduce-client-core-2.7.7.jar/ mapred-default.xml |
- 自定义配置文件
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
各配置文件中配置项的说明请参考:core-default.xml、hdfs-default.xml、mapred-default.xml、yarn-default.xml
6. 服务启动/停止方式
6.1 各个服务逐一启动/停止
- 启动HDFS组件
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
- 停止HDFS组件
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode
hadoop-daemon.sh stop secondarynamenode
- 启动YARN
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
- 停止YARN
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh stop nodemanager
6.2 集群整体启动/停止
- 整体启动/停止HDFS
start-dfs.sh / stop-dfs.sh
- 整体启动/停止YARN
start-yarn.sh / stop-yarn.sh
7. 免密登录
我们使用ssh登录一台主机时,需要提供用户名和密码。有时候我们不想在自己的几台主机之间输入密码,就可以配置免密登录。
7.1 免密登录原理
7.2 免密登录配置
哪个用户需要从哪台服务器上秘密登录到其他机器上,就使用该用户在该服务器上进行配置。假设,hadoop01主机上的hadoop用户想免密登录到hadoop02、hadoop03。
- 生成公钥和私钥
等待输入的地方可以直接回车
- 将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop01 hadoop]$ ssh-copy-id hadoop01 #ssh到自身,默认情况下也需要密码
[hadoop@hadoop01 hadoop]$ ssh-copy-id hadoop02
[hadoop@hadoop01 hadoop]$ ssh-copy-id hadoop03
执行完之后,就可以进行免密登录了,同时在/home/hadoop/.ssh/下可以看到几个文件
- known_hosts:记录ssh访问过计算机的公钥(public key)
- id_rsa:生成的私钥
- id_rsa.pub:生成的公钥
- authorized_keys:存放授权过得无密登录服务器公钥