sponsored links

Hadoop 集群搭建(单机/伪分布式/分布式)

本教程适用于在 CentOS7 系统中安装 Hadoop2,详细介绍了从系统环境配置、Java环境配置到 Hadoop 安装及 Hadoop 集群配置,包括:单机、伪分布式以及分布式,步骤详细,辅以适当说明。相信按照步骤来,都能顺利搭建一个属于自己的 Hadoop 集群。
废话不多说,干货上架。

一、安装虚拟机

首先我们需要安装一个虚拟机软件,安装教程可以参考笔者的博客:安装VMware及新建虚拟机

二、安装CentOS 7

本教程使用的是CentOS7作为系统环境,请自行安装系统,安装教程可以参考笔者博客:虚拟机VMware中安装CentOS7

注意:安装时我们选择最小安装,不用图形界面,之后我们所有的操作都采用命令的方式,将安装完成的系统命名为Hadoop Cluster Master 作为主机,下一步开始网络配置,网路配置成功后,我们通过克隆的方式获得Slave1作为从机,这个在Hadoop 集群搭建中的伪分布式和分布式时需要用到。Hadoop 单机配置只用Master就可以。

三、CentOS 7网络配置

1. 设置静态IP

CentOS7安装完成后默认使用的是动态IP,如果不设置成静态IP,那么每次重新启动后,IP都不一样,不利于我们以后的操作。打开网卡文件设置静态IP

# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736   # vi编辑器类似于wndows下的记事本

修改BOOTPROTO值为static,BOOTPROTO=static
在文件尾部添加如下内容
IPADDR=192.168.242.140 #IP地址
NETMASK=255.255.255.0 #子网掩码
NM_CONTROLLED=no
GATEWAY=192.168.242.2 #网关
注意:IP需要填写你自己的IP,网关可以通过如下方式查看

选中你的CentOS系统选择虚拟网络编辑器
Hadoop 集群搭建(单机/伪分布式/分布式)

网络模式,笔者选择的是NAT模式,你也可以按如下方式选择网络模式为NAT模式
Hadoop 集群搭建(单机/伪分布式/分布式)

编辑完成后输入esc,然后输入英文冒号,然后输入wq,回车保存,重启网络服务,使刚才设置的静态IP能够起效。

# systemctl restart network

我们ping一下刚刚设置的静态IP,看是否可以ping 通(IP地址替换成你的IP)

# ping 192.168.242.140

Hadoop 集群搭建(单机/伪分布式/分布式)

OK,静态IP设置成功

如果你的系统中没有网卡文件,则执行如下命令创建该文件(数字编号自己填写一个就行)

# touch /etc/sysconfig/network-scripts/ifcfg-eno+数字编号
# touch /etc/sysconfig/network-scripts/ifcfg-eno33

复制粘贴如下内容:
TYPE=Ethernet
BOOTPROTO=dbcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=ebc0d4fc-16c6-45e3-9670-5c5a81a104c4
DEVICE=eno16777736
ONBOOT=yes
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no

然后再设置静态IP,操作请参考上述静态IP的设置。

2.设置主机名及IP映射

在我们实际工作中,Hadoop的集群服务器不是只有一台两台,几十台,上百台也是有可能的,那么每台服务器都自己的IP,IP太多,容易混淆,可以通过设置主机名对服务器进行标识。

删除原有内容,添加内容Master,我们将这台服务器作为集群中的主服务器,保存退出。

# vi /etc/hostname

Hadoop 集群搭建(单机/伪分布式/分布式)

使用vi编辑器打开hosts文件,设置主机名与IP映射,在文件尾部添加如下内容即可

# vi /etc/hosts

Hadoop 集群搭建(单机/伪分布式/分布式)

笔者事先就已经把从机的ip定好了,稍后我们在从机Slave1中将此IP设置成静态IP即可。

使用ping Master看是否可以ping 通,如果ping 通,说明主机名及ip映射设置成功
Hadoop 集群搭建(单机/伪分布式/分布式)

3.设置DNS服务

配置DNS是因为可以让我们的访问外网,使用vi编辑器打开文件resolv.confg,在文件尾部添加如下内容,然后保存退出。内容格式(中间用空格分隔):nameserver IP

# vi /etc/resolv.conf

Hadoop 集群搭建(单机/伪分布式/分布式)

我们ping一下www.baidu.com,看是否可以ping通,如果可以说明配置成功

Hadoop 集群搭建(单机/伪分布式/分布式)

至此我们的主机Master的网络配置就完成了,为了后面我们要做Hadoop的集群分布式,我们需要再安装一个CentOS7,命名为Hadoop Cluster Slave1作为从机,从机可以有多个,笔者只用了一个主机和一个从机,即一主一从。
由于我们已经安装好了一个CentOS7,直接通过克隆的方式来获取从机Slave1。

选择要克隆的系统,点击虚拟机—>管理—>克隆,出现克隆向导

Hadoop 集群搭建(单机/伪分布式/分布式)

如果出现如下问题:表示需要将你要克隆的系统关机,然后在克隆

# shutdown --p now

Hadoop 集群搭建(单机/伪分布式/分布式)

下一步,直到出现如下界面,选择“完整克隆”

Hadoop 集群搭建(单机/伪分布式/分布式)

填写虚拟机名称,选择路径,点击完成

Hadoop 集群搭建(单机/伪分布式/分布式)

等待进度条走完即可

Hadoop 集群搭建(单机/伪分布式/分布式)

克隆完成后,会在左侧显示克隆的系统

Hadoop 集群搭建(单机/伪分布式/分布式)

从机网络配置请查看上述1~3的讲解,从机Slave1配置完成后的截屏如下
静态IP:

Hadoop 集群搭建(单机/伪分布式/分布式)

主机名:

Hadoop 集群搭建(单机/伪分布式/分布式)

DNS:

Hadoop 集群搭建(单机/伪分布式/分布式)

目前,两个系统Master和Slave1的网络配置就完成了,刚才Master和Slaver各自都能ping通自己的IP及主机名,那么,在Master能ping通Slave1的IP和主机名吗?Slaver1中能ping通Master中的IP和主机名吗?那就来测试一下吧。
Master ping Slaver1的IP及主机名

Hadoop 集群搭建(单机/伪分布式/分布式)

Slave1 ping Master的IP及主机名

Hadoop 集群搭建(单机/伪分布式/分布式)

通过测试,Master和Slave都能各自ping 自己,同时也能ping通对方,也能访问外网,那么windows下面能ping通这Master和Slave的ip吗?

Hadoop 集群搭建(单机/伪分布式/分布式)

可以ping通ip,但是windows下不能直接使用ping Master或ping Slave1来ping,因为windows下并没有对它们做主机名及IP的映射。

Hadoop 集群搭建(单机/伪分布式/分布式)

windows下设置主从服务器的主机名及IP映射,打开hosts文件,在文件尾部添加如下内容

Hadoop 集群搭建(单机/伪分布式/分布式)

再次ping Master及ping Slave1,测试可以成功

Hadoop 集群搭建(单机/伪分布式/分布式)

至此虚拟机中系统的环境配置就完成了。我们来进入下一步。

四、创建hadoop用户

以上都是在虚拟机里的CentOS系统中操作,由于我们的网络配置都已配置完成,接下来笔者使用xshell远程连接工具来操作(如果没有找度娘要一个),在主机Master和从机Slave1中分别创建一个hadoop用户并授予管理员权限。

1.创建用户并设置密码

执行如下命令即可

# useradd -m hadoop -G root  -s /bin/bash
# passwd

Hadoop 集群搭建(单机/伪分布式/分布式)

2.为hadoop授予管理员权限

避免以后在操作时,遇到权限不够的问题

# visudo

按ESC键盘,输入英文冒号,然后输入98号,找到root ALL=(ALL) ALL
输入英文字母“i”,进入插入模式,复制一份粘贴到下一行,把root改为新创建的用户hadoop,然后再次输入ESC,输入英文冒号,输入wq,保存退出
注意:中间用tab键隔开(制表符)

Hadoop 集群搭建(单机/伪分布式/分布式)

五、配置SSH无密码登录

1.查看是否安装了SSH

集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),一般情况下,CentOS 默认已安装了 SSH client、SSH server,执行如下命令进行检验:使用hadoop用户登录

$ rpm -qa | grep ssh

Hadoop 集群搭建(单机/伪分布式/分布式)

可以看到已经安装了ssh client和ssh server,则无需在安装,如果没有安装,可以使用如下命令安装即可,其它依赖包yum会自己检测安装

$ sudo yum install openssh-clients
$ sudo yum install openssh-server

2.配置SSH无密码登录
目的:在Master中可以使用ssh Slave1直接登录到从机Slave1,无需输入密码

操作步骤:
①.在主机Master中生成密钥

$ cd ~/.ssh/  # 切换到hadoop用户的主题目录下的.ssh文件,如果没有.ssh文件请先执行一次ssh localhost
$ ssh-keygen -t rsa    # 会有提示,都按回车就可以

Hadoop 集群搭建(单机/伪分布式/分布式)

②.将Master中生成的密钥加入授权(authorized_keys)

$ cat id_rsa.pub                       # 查看生成的公钥
$ cat id_rsa.pub >> authorized_keys    # 加入授权
$ chmod 600 authorized_keys    # 修改文件权限,如果不修改文件权限,那么其它用户就能查看该授权文件,然后使用该密钥也能进行登录,不安全

Hadoop 集群搭建(单机/伪分布式/分布式)

③.在Master中将授权文件远程拷贝到从机Slave1的hadoop用户主题目录下的.ssh目录下(/home/hadoop/.ssh/)

使用hadoop用户登录从机Slave1,未远程拷贝前

Hadoop 集群搭建(单机/伪分布式/分布式)

在Master主机中进行远程拷贝

$ scp authorized_keys hadoop@Slaver1:~/.ssh/

Hadoop 集群搭建(单机/伪分布式/分布式)

在Slave1从机中的/home/hadoop/.ssh/目录下查看是否有authorized_keys文件

Hadoop 集群搭建(单机/伪分布式/分布式)

测试:在主机Master中使用ssh Slave1登录从机Slave1

$ ssh Slave1

Hadoop 集群搭建(单机/伪分布式/分布式)

可以看到,无需输入密码就能登录成功

六、安装JDK

在Master和Slave1中分别安装JDK,在这我们以Master为例,Slave1类似
使用hadoop用户登录

1.下载安装包

从官网下载jdk的rpm包,笔者下载的是jdk1.8的rpm包。
官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Hadoop 集群搭建(单机/伪分布式/分布式)

2.安装JDK

我们在安装CentOS7时使用的是最小安装,所以系统就不会安装默认JDK了,但出于保险,我们还是使用命令检查是否安装了默认JDK。

$ rpm -qa | grep java
$ rpm -qa | grep jdk

执行完这两个命令中的任意一个后,如果jdk有安装,会列出jdk的所有安装包,使用如下命令依次卸载即可。

$ rpm -e --nodeps java包名

在hadoop的主题目录下新建文件夹installPkgs,用于存放安装包,使用rz命令上传文件到此目录下。

$ mkdir installPkgs        # 在/home/hadoop目录下新建
$ rz                       # 将本地文件上传到服务器

如果没有rz命令,则使用 yum 安装即可

# yum install lrzsz

上传jdk的rpm包,笔者选择的是jdk1.8

$ sudo rz

Hadoop 集群搭建(单机/伪分布式/分布式)

等待进度条走完,就上传完成了

Hadoop 集群搭建(单机/伪分布式/分布式)

Hadoop 集群搭建(单机/伪分布式/分布式)

3.配置环境变量

使用vim 编辑器打开bashrc文件,笔者配置的是用户变量,即只有hadoop才能使用

$ vim ~/.bashrc   # linux中所有的隐藏文件前面都会有一个点.,bashrc就是一个隐藏文件

~的含义:
符号~表示用户的主题目录,linux 中每新建一个用户都会在 home 目录下新建一个与用户名同名的文件夹,我们刚刚创建了一个hadoop的用户,那么主题目录就是 /home/hadoop

java安装成功后默认存放在/usr/java/目录下,查看jdk的安装目录,此时,我们已经进入了vim编辑器,又不想退出,可以通过复制SSH渠道新开一个终端查看jdk的安装目录

Hadoop 集群搭建(单机/伪分布式/分布式)

$ cd /usr/java/jdk(按Tab键自动补齐)
$ pwd  # 查看当前目录

Hadoop 集群搭建(单机/伪分布式/分布式)

编辑内容

export JAVA_HOME=/usr/java/jdk1.8.0_131(路径选择你自己安装的jdk路径)
export PATH=$PATH:$JAVA_HOME/bin(追加到PATH中)

Hadoop 集群搭建(单机/伪分布式/分布式)

重新加载bashrc文件,让环境变量立即生效

$ source ~/.bashrc

输入如下命令,查看环境变量是否配置成功,如果出现类似如下图中的内容表示成功。

$ echo $JAVA_HOME
$ java -version

Hadoop 集群搭建(单机/伪分布式/分布式)

七、安装Hadoop

1.Hadoop简介

Hadoop是一个开源的可运行于大规模集群上的分布式并行编程框架,其最核心的设计包括:MapReduce 和 HDFS。基于 Hadoop,你可以轻松地编写可处理海量数据的分布式并行程序,并将其运行于由成百上千个结点组成的大规模计算机集群上。

HDFS:Hadoop Distributed File System 的缩写,Hadoop中的分布式文件系统,它是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。

MapResuce:MapReduce是一套从海量·源数据提取分析元素最后返回结果集的编程模型,将文件分布式存储到硬盘是第一步,而从海量数据中提取分析我们需要的内容就是MapReduce做的事了。

官网:http://hadoop.apache.org/

下载Hadoop

Hadoop 集群搭建(单机/伪分布式/分布式)

笔者下载的是2.7.3版本的Hadoop,你也可以选择下载别的版本

Hadoop 集群搭建(单机/伪分布式/分布式)

2.安装Hadoop

将下载的Hadoop压缩文件tar.gz使用命令rz上传到installPkgs目录下

Hadoop 集群搭建(单机/伪分布式/分布式)

将Hadoop的压缩文件解压到/usr/local/目录下

$ sudo tar -zxf hadoop-2.7.3.tar.gz -C /usr/local/

Hadoop 集群搭建(单机/伪分布式/分布式)

修改文件名hadoop-2.7.3为hadoop

$ sudo mv ./hadoop-2.7.3/ ./hadoop

Hadoop 集群搭建(单机/伪分布式/分布式)

可以看到hadoop文件的所属者及所属组为root,我们更改为hadoop用户的所属者及所属组。只让hadoop用户可以操作hadoop目录及子目录下的所有文件

# chown -hR hadoop /usr/local/hadoop/   # 修改所有者为hadoop
# chgrp -hR hadoop /usr/local/hadoop/   # 修改所属组为hadoop

Hadoop 集群搭建(单机/伪分布式/分布式)

hadoop解压后即可使用,输入如下命令来检查hadoop是否可用,成功则显示hadoop的版本信息

$ cd /usr/local/hadoop/        # hadoop 安装目录
$ ./bin/hadoop version     # 成功会显示hadoop的版本信息

Hadoop 集群搭建(单机/伪分布式/分布式)

3.配置环境变量

$ vim ~/.bashrc   # 打开 bashrc 文件

添加如下内容,保存退出。

# Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop        # hadoop的安装目录,替换为你的hadoop的安装目录
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

在PATH追加Hadoop的环境变量

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin # JDK 是之前我们安装时配置的

Hadoop 集群搭建(单机/伪分布式/分布式)

重新加载 bashrc 文件,使配置的 hadoop 环境变量立即生效

$ source ~/.bashrc

检查环境变量是否配置成功

$ echo $PATH
$ hadoop version   # 成功会显示hadoop的版本信息

Hadoop 集群搭建(单机/伪分布式/分布式)

至此Hadoop安装完成,环境变量配置成功。

之后我们要开始操作hadoop了,在操作之前,我们需要关闭防火墙及selinxu守护进程,如果不关闭,在启动hadoop的时候可能报错或无法启动,在Master和Slave1中都需要关闭。

$ systemctl status firewalld   # 查看防火墙状态
$ systemctl stop firewalld     # 关闭防火墙

Hadoop 集群搭建(单机/伪分布式/分布式)

关闭selinux守护线程:使用root用户

$ su root          # 切换到rot用户
$ getenforce       # 查看selinux守护线程的状态
$ setenforce 0     # 关闭selinux守护线程
$ exit             # 回到原来的终端

Hadoop 集群搭建(单机/伪分布式/分布式)

八、Hadoop 单机配置(非分布式)

Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。

Hadoop 附带了丰富的例子,包括 wordcount、terasort、joing、grep等,在此我们选择运行
grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中

因为是单机配置,非分布式,我们只用主机Master就可以了,如果是单机,那么安装了Hadoop后不用配置环境变量,但我们后面还要进行伪分布式和集群的配置,所以就已经提前配置好了环境变量。

Hadoop附带的所有例子存放在 /usr/local/hadoop/share/hadoop/mapreduce/ 目录下(红色部分为hadoop的安装目录)

Hadoop 集群搭建(单机/伪分布式/分布式)

在此,我们以grep为例,新建文件夹 input并将该文件中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后将结果输出到 output 文件夹中。

$ cd /usr/local/hadoop/                # 切换到hadoop的安装目录
$ sudo mkdir ./input                   # 新建文件夹input
$ sudo cp ./etc/hadoop/*.xml ./input/  # 将/etc/hadoop/目录下的所有xml文件拷贝到input文件夹

Hadoop 集群搭建(单机/伪分布式/分布式)

$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep ./input ./output 'dfs[a-z.]+'   # 运行 grep 实例

运行过程中如果出现如下错误
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable(该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。

如果出现如下错误:
InvalidInputException: Input path does not exist: file:/usr/local/hadoop/grep-temp-331205780(大多是因为hadoop没有权限访问/usr/local/hadoop目录,修改改文件的所属者和所属组即可)

Hadoop 集群搭建(单机/伪分布式/分布式)

执行命令如下命令,更改所属者和所属组,使用root用户

# chown -hR hadoop /usr/local/hadoop/
# chgrp -hR hadoop /usr/local/hadoop/

运行完成后,没有发送异常,在最后面可以看到Successfully,表示运行成功

Hadoop 集群搭建(单机/伪分布式/分布式)

执行成功后,会将结果存放到output文件中,我们查看下结果

$ cat ./output/*

Hadoop 集群搭建(单机/伪分布式/分布式)

注意:Hadoop 默认不会覆盖文件,如果再次运行上面的实例会出错,提示文件已存在
FileAlreadyExistsException: Output directory file:/usr/local/hadoop/output already exists

Hadoop 集群搭建(单机/伪分布式/分布式)

使用如下命令删除该文件,再次运行就没有问题了

$ rm -rf output

九、Hadoop 伪分布式

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

Hadoop的伪分布式配置需要设置环境变量,不设置的会报错,伪分布式的配置我们仍然使用主机Master即可,Master既是NameNode,同时也是DataNode。

NameNode:主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等。故这是一个核心节点。

DataNode:数据节点,每台从服务器节点都运行一个,负责把HDFS数据块读、写到本地文件系统。

Hadoop 伪分布式配置

Hadoop的配置文件位于 /usr/local/hadoop/etc/hadoop(红色部分为Hadoop的安装目录) 中,Hadoop 中的配置文件是xml格式,每个配置以声明 property 的 name 和 value 的方式来实现。

Hadoop 伪分布式配置需要修改两个配置文件:core-site.xmlhdfs-site.xml

core-site.xml:此文件是Hadoop的核心配置文件

hdfs-site.xml :用于配置NameNode的URI及NameNode和DataNode的存放位置

使用xftp工具,将 core-site.xml 和 hdfs-site.xml 这两个文件从服务上下载到本地,在本地修改完成后直接上传到服务器覆盖即可。

1.修改 core-site.xml 文件

在configuration节点中添加如下内容

Hadoop 集群搭建(单机/伪分布式/分布式)

<configuration>
    <!-- Hadoop 文件系统的临时目录(NameNode和DataNode默认存放在hadoop.tmp.dir目录)-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
    </property>

    <!-- 配置NameNode的URI -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://Master:9000</value>
    </property>
</configuration>

2.修改 hdfs-site.xml 文件

在configuration节点中添加如下内容

Hadoop 集群搭建(单机/伪分布式/分布式)

    <!-- Master可替换为IP -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>Master:50090</value>
    </property>
    <!-- 设置系统里面的文件块的数据备份个数,默认是3 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <!-- NameNode结点存储hadoop文件系统信息的本地系统路径 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <!-- DataNode结点被指定要存储数据的本地文件系统路径,这个值只对NameNode有效,DataNode并不需要使用到它 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>

注意:yarn-site.xml配置文件不用修改,默认为localhost,表示服务器即为NameNode,也是DataNode,也就是我们现在做的Hadoop 伪分布式。

3.启动 Hadoop

配置完成后,使用如下命令格式化 NameNode

$ hdfs namenode -format

成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

Hadoop 集群搭建(单机/伪分布式/分布式)

启动和关闭有两种方式
启动 Hadoop
方式一:该方法已废弃,不推荐使用

$ start-all.sh
$ mr - jobhistory-daemon.sh start historyserver

Hadoop 集群搭建(单机/伪分布式/分布式)

停止 Hadoop

$ stop-all.sh
$ mr - jobhistory-daemon.sh stop historyserver

Hadoop 集群搭建(单机/伪分布式/分布式)

方式二:推荐使用,第一种方式我们不用,只作为了解即可
启动

$ start-dfs.sh #开启 NameNode 和 DataNode 守护进程

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

Hadoop 集群搭建(单机/伪分布式/分布式)

启动成功后,在浏览起中输入http://Master:50070查看NameNode和DataNode的相关信息,还可以在线查看HDFS中的文件。

Hadoop 集群搭建(单机/伪分布式/分布式)

停止 Hadoop 使用命令

$ stop-dfs.sh

有些朋友可能会有疑问,为什么不启动yarn呐,因为我们做的是伪分布式,伪分布式不用启动yarn,一般不会影响程序的执行。

4. 运行伪分布式实例

1).创建用户目录

上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录

$ hdfs dfs -mkdir -p /user/hadoop

2).复制文件

接着将 /etc/hadoop 中所有的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。

$ hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml /user/hadoop/input

复制完成后,可以使用如下命令来查看HDFS的文件列表

$ hdfs dfs -ls input

Hadoop 集群搭建(单机/伪分布式/分布式)

3).运行伪分布式实例

伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。

$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+' 

出现Successfully表示成功

Hadoop 集群搭建(单机/伪分布式/分布式)

查看运行结果(查看的是位于 HDFS 中的输出结果)

$ hdfs dfs -cat output/*

与单机配置方式的运行结果不同,是因为我们使用的是伪分布式,而伪分布式的读取的是HDFS中的文件。单机配置方式会在本地生成一个ouput文件夹。

Hadoop 集群搭建(单机/伪分布式/分布式)

我们也可以将运行结果取回到本地

$ rm -r ./output                       # 先删除原来本地的output文件夹(如果存在)
$ hdfs dfs -get output ./output        # HDFS中的output文件夹取回到本地
$ cat ./output/*   # 查看运行结果,与在HDFS中查看到的内容相同

Hadoop 集群搭建(单机/伪分布式/分布式)

关闭HDFS

$ stop-dfs.sh

注意:下次在启动前不需要再做 NameNode 的初始化(即不用执行这条命令:$ hdfs namenode -format)

接下来进入我们最重要的一个配置,即 Hadoop 集群 分布式,我们实际工作中是最常用的。

十、Hadoop 集群/分布式

Master和Slave1中都需要做如下配置,我们以Master为例,Slave1直接将配置好的文件上传覆盖即可。

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,分别为:
core-site.xml、hdfs-site.xml、mapred-site.xml(去掉了后缀.template)、yarn-site.xml 、slaves,更多设置项可点击查看官方说明,Hadoop 集群搭建官方文档,这里仅设置了正常启动所必须的设置项。

core-site.xml:Hadoop的核心配置文件
hdfs-site.xml :用于配置NameNode的URI及NameNode和DataNode的存放位置
mapred-site.xml:mapreduce相关配置
yarn-site.xml: 配置资源管理系统yarn
slaves:配置DataNode的主机名

1.修改 Hadoop 的配置文件

使用xftp将文件下载到本地,配置完成后再上传到对应目录下覆盖即可,修改前记得备份

1).修改 core-site.xml 文件

参考伪分布式中的配置

2).修改 hdfs-site.xml 文件

参考伪分布式中的配置

3).修改 mapred-site.xml 文件

Hadoop 集群搭建(单机/伪分布式/分布式)

<configuration>
    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
            <description>执行框架设置为Hadoop YARN</description>
    </property>
    <property>
            <name>mapreduce.jobhistory.address</name>
            <value>Master:10020</value>
            <description>Master可替换为IP</description>
    </property>
    <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>Master:19888</value>
            <description>Master可替换为IP</description>
    </property>
</configuration>

4).修改 yarn-site.xml 文件

Hadoop 集群搭建(单机/伪分布式/分布式)

<configuration>
    <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>Master</value>
            <description>Master可替换为IP</description>
    </property>
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
            <description>Shuffle service 需要加以设置的MapReduce的应用程序服务</description>
    </property>
</configuration>

5).修改 slaves文件

文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。

本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加一行内容:Slave1。

2.启动 Hadoop 集群

$ start-dfs.sh
$ start-yarn.sh
$ mr-jobhistory-daemon.sh start historyserver

如果在启动时出现错误:Slave1: mkdir: 无法创建目录”/usr/local/hadoop/logs”: 权限不够

Hadoop 集群搭建(单机/伪分布式/分布式)

说明在Slave1中没有对/usr/local/hadoop目录及目录下的所有文件授权,先停止服务,使用 root 用户登录到 Slave1,然后执行如下命令后,再次回到Master启动即可。
这个问题是由于笔者在Slave1安装Hadoop后中未授权导致的这个问题

# chown -hR hadoop /usr/local/hadoop/
# chgrp -hR hadoop /usr/local/hadoop/

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,如下图所示:

Hadoop 集群搭建(单机/伪分布式/分布式)

如果在启动过程中报错,则说明刚刚的配置文件中配置的有错,请仔细检查,也可以到对应的日志文件中查看报错信息,启动成功后一共有四个进程,缺少一个都不行(启动不成功)

在Slave1服务器中可以查看到DataNode和NodeManager进程,我直接使用ssh Slave1无密码登录查看

Hadoop 集群搭建(单机/伪分布式/分布式)

输入exit回到原来的终端,在Master中输入命令查看DataNode是否启动成功,如果 Live datanodes 不为 0 ,则说明集群启动成功。笔者DataNode只有一个,所以显示为1

Hadoop 集群搭建(单机/伪分布式/分布式)

如果以上全部正确,说明我们的Hadoop集群启动成功。
在浏览器中输入http://Master:50070查看 DataNode 和 NameNode 的状态

Hadoop 集群搭建(单机/伪分布式/分布式)

注意事项:
①.从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;
②.在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能启动,但后来启动不了,特别是 DataNode 无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 /usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfs namenode -format,再次启动试试。

3.执行分布式实例

1).创建用户目录

执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:

$ hdfs dfs -mkdir -p /user/hadoop

2).复制文件到分布式文件系统中

将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中

$ hdfs dfs -rm -r input    # 如果存在,先删除(我们在做hadoop的单机及伪分布式时创建的文件)
$ hdfs dfs -mkdir input    # 创建input文件
$ hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

如果在执行删除文件出现错误:rm: Cannot delete /user/hadoop/input. Name node is in safe mode.

原因:
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。

安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

如果不想等待,可以使用如下命令关闭安全模式,再次删除即可。

$ hadoop dfsadmin -safemode leave  # 关闭安全模式
$ hdfs dfsadmin -safemode enter        # 开启安全模式

再次执行命令删除即可

Hadoop 集群搭建(单机/伪分布式/分布式)

在浏览器中通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:

Hadoop 集群搭建(单机/伪分布式/分布式)

3).运行分布式实例

然后就可以运行MapReduce作业了,运行实例,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后将结果输出到 output 文件夹中

$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

运行时输出与伪分布式的类似,会显示Job的进度,时间可能较长,耐心等待,如果长时间没有看到进度,可以尝试如下方式解决(具体操作找度娘吧)
①.重启Hadoop集群,再次尝试
②.增大虚拟机内存
③.更改 YARN 的内存配置
在Job进度中出现“Successfully”表示成功

Hadoop 集群搭建(单机/伪分布式/分布式)

成功后,我们可以在浏览器中访问http://master:8088/cluster,查看任务的运行信息

Hadoop 集群搭建(单机/伪分布式/分布式)

Hadoop 集群搭建(单机/伪分布式/分布式)

执行完成后,我们在Master服务器中查看一下运行结果

$ hdfs dfs -cat output/*

Hadoop 集群搭建(单机/伪分布式/分布式)

停止Hadoop集群:

$ stop-dfs.sh
$ stop-yarn.sh
$ mr-jobhistory-daemon.sh stop historyserver

OK,至此我们Hadoop的单机配置、伪分布式、集群分布式已全部完成,其实还是蛮简单的嘛,学习愉快哦!
Good good study day day up.

Tags: