Hadoop集群搭建(超详细)(伪分布式配置)

最近在上Hadoop的课,要求配置Hadoop集群。我在网上查了资料,跟着步骤一步一步做下来而且成功了。

图片之前有点错乱,我现在重新调整了。

但是过程并不太熟悉,所以打算借着做笔记的机会将整个过程重新梳理一遍,重头到尾再做一次。

可参考的资料:

Hadoop安装教程_伪分布式配置_CentOS6.4/Hadoop2.6.0
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS

我使用的系统环境是Centos 7 64位(之前做主从MYSQL有快照,我直接用克隆)

Hadoop版本建议是2.x.y版本,我用的是hadoop-2.7.7.tar.gz

我的集群做了三个,分别是master,slave1和slave2(自己区分大小写,我为了方便均为小写)。当然如果因为内存或其他情况的限制,可以只有master和slave.

以下操作若我没有特别说明则三个节点都要操作。


大致的流程
  1. 选定一台机器作为 Master
  2. 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
  3. 在 Master 节点上安装 Hadoop,并完成配置
  4. 在其他 Slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
  5. 将 Master 节点上的 /usr/local/hadoop-2.7.7 目录复制到其他 Slave 节点上
  6. 在 Master 节点上开启 Hadoop

系统环境

centos的搭建在这里就不详细说明了,可自行网上搜索,如果后面有机会我会写一下(o)/~

上面说到我用的是克隆,克隆了三个分别命名为hadoop01,hadoop01,hadoop03(此处为文件夹名,不是主机名),克隆选择完整克隆,这样可以在操作时不基于原本的虚拟机。(给也是克隆的同学参考一下)

在这里插入图片描述

然后所处文件夹中需要删掉.lck的文件。例如在hadoop03中的,如果不删除,虚拟机可能会出现打不开的问题。

在这里插入图片描述

网络配置

为了让每台虚拟机都能正常联网,并且各个节点能够互联,使得我们要修改网络配置。

首先你要确定在虚拟机上的IP地址与控制中心所对应的IP地址相吻合。

接下来就是修改网络配置文件(以master为例) 记不住可以用Tab建自动补全

vi /etc/sysconfig/network-scripts/ifcfg-ens33      //ens33是我所在虚拟机的网卡名,有的是eth0

首先修改里面的两个选项

BOOTPROTO=static
ONBOOT=yes

然后在后面添加相对应的网络地址(不知道相应IP地址的可查看编辑-虚拟网络编辑器)

IPADDR=192.168.100.11      //IP地址 
NETMASK=255.255.255.0      //子网掩码
GATEWAY=192.168.100.2      //网关
DNS1=8.8.8.8               //DNS服务器

esc键输入 :x,保存并退出。

slave1和slave2的网络配置同上,但IP地址分别是192.168.100.12 192.168.100.13

打开虚拟网络编辑器:
VMnet8(NAT模式)----子网IP设置为:192.168.100.0----NAT设置:网关改为192.168.100.2—确定----去掉使用本地DHCP服务将IP地址分配给虚拟机选项—确定

配置完之后每个节点都要重启网络

systemctl restart network

PS:Centos6的重启命令

service network restart
测试网络是否连接成功
ping www.baidu.com
ping 192.168.100.11     //IP地址
ping 192.168.100.2      //网关

如果网络能连通,则如下图所示:(丢包率为0%)

在这里插入图片描述

使用CRT配置Linux:(远程连接工具可以复制粘贴比较方便)
创建快速连接:192.168.100.11----root
勾选保存密码—输入root密码—确定

修改主机名并添加主机映射

修改主机名,重启才会显示新的主机名(以master为例)

hostnamectl set-hostname master        //slave1、slave2
reboot     //重启

添加映射,映射是为了方便这几个虚拟机之间相互传递文件

vi /etc/hosts

192.168.100.11   master        //IP地址  主机名
192.168.100.12   slave1  
192.168.100.13   slave2  

如下图所示:

在这里插入图片描述
测试(即:互ping),不要ping自己本机就好了,能ping通即成功

ping slave1
ping master
ping slave2
关闭防火墙

关闭服务器安全设置firwalld,关闭防火墙,关闭Selinux(各个节点都要关闭,不然会影响后续操作)

iptables -F         //顺序不能颠倒,不然防火墙就是你以为关了但其实没关,怎么debug也没用
iptables -X
iptables -Z
iptables -L
iptables-save

setenforce 0

vi /etc/selinux/config
SELINUX=Enfocing--->SELINUX=disabled

或者网上有另一种关闭防火墙的方法(Centos7)

systemctl stop firewalld.service         //停止firewall
systemctl disable firewalld.service        //禁止firewall开机启动

在 CentOS 6.x 中,可以通过如下命令关闭防火墙:

sudo service iptables stop   # 关闭防火墙服务
sudo chkconfig iptables off  # 禁止防火墙开机自启,就不用手动关闭了
更换yum源

把yum源更换为国内的yum源,之后的下载安装及更新速度会更快(国外的有时候真的很慢)

CentOS 7的yum更换为国内的阿里云yum源

在我的虚拟机里上述操作需要在我执行挂载之后才能成功,你们可以先试一下,不成功再挂载重新弄

本地安装仓库,挂载(本地仓库可以不建立,后续的EPEL也是一个仓库)

mkdir /root/bak
mv /etc/yum.repos.d/*.repo /root/bak
mkdir /mnt/cd
mount /dev/cdrom /mnt/cd
vi /etc/yum.repos.d/local.repo
[centos7]
name=centos7
baseurl=file:///mnt/cd
gpgcheck=0
enabled=1
yum clean all    //yum会把下载的软件包和header存储在cache中,而不自动删除。这个命令可全部清除      
yum repolist     //查看所拥有的仓库
yum install wget

挂载成功,如下图:

在这里插入图片描述

换源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup     //备份
下载新的CentOS-Base.repo 到/etc/yum.repos.d/(二选一)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  //添加EPEL
yum clean all
yum makecache      //清理缓存并生成新的缓存

换源成功

在这里插入图片描述

每个节点都创建hadoop用户
useradd -m hadoop -s /bin/bash     
passwd hadoop

为hadoop用户添加管理员权限,以防之后各种操作的权限问题

visudo

在root ALL=(ALL) ALL这一行下添加:
hadoop ALL=(ALL) ALL

如图所示

在这里插入图片描述

每个节点都登录到hadoop用户中

之后的操作都在hadoop用户中执行

su hadoop
SSH无密码登录节点配置

这个操作是要让 master 节点可以无密码 SSH 登陆到各个 slave 节点上。

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

rpm -qa | grep ssh

返回结果如下图所示:

在这里插入图片描述

包含了 SSH client 跟 SSH server,则不需要再安装。

若需要安装,则可以通过 yum 进行安装(安装过程中会让你输入 [y/N],输入 y 即可):

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

接着执行如下命令测试一下 SSH 是否可用:

ssh localhost

此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。

但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。

首先输入 exit 退出刚才的 ssh,就回到了我们原先的窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中。

以下注释部分存在不确定性,可直接跳过到下面去操作

之所以说它存在不确定性是因为下面注释部分的操作大概率会失败

cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa*            # 删除之前生成的公匙(如果有执行,没有也可执行一次,以防万一)
ssh-keygen -t rsa       # 一直按回车就可以
cat ./id_rsa.pub >> ./authorized_keys      //让master节点能无密码SSH登录 
chmod 600 ./authorized_keys    #修改文件权限为只读,此操作必须执行不然不能成功
ssh localhost
scp ~/.ssh/id_rsa.pub hadoop@slave1:/home/hadoop/	#在线复制公钥给slave1
scp ~/.ssh/id_rsa.pub hadoop@slave2:/home/hadoop/	#在线复制公钥给slave2
mkdir ~/.ssh       # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub    # 用完就可以删掉了
ssh slave1
exit
ssh slave2
exit

然后我找了一下原因,发现在网上有的/.ssh/authorized_keys中是包含了所有节点的公钥,但上述方法复制过去的/.ssh/authorized_keys中只包含了主节点的,所以我们每一个节点都要生成公钥,然后放到master中的~/.ssh/authorized_keys中,再将这个复制到其他节点上:

这里继续开始,上面内容就当做一个参考吧

master节点:

rm -rf ~/.ssh          //之前执行过的记得先删除再重来
ssh localhost 
exit
cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa*            # 删除之前生成的公匙(如果有执行,没有也可执行一次,以防万一)
ssh-keygen -t rsa       # 一直按回车就可以
cat ./id_rsa.pub >> ./authorized_keys      //让master节点能无密码SSH登录
chmod 600 ./authorized_keys    #修改文件权限为只读,此操作必须执行不然不能成功       
ssh localhost          //尝试是否无密码SSH登录本机
exit

slave1节点:

rm -rf ~/.ssh          //之前执行过的记得先删除再重来
ssh localhost 
exit
cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa*            # 删除之前生成的公匙(如果有执行,没有也可执行一次,以防万一)
ssh-keygen -t rsa       # 一直按回车就可以

slave2节点:

rm -rf ~/.ssh          //之前执行过的记得先删除再重来
ssh localhost 
exit
cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa*            # 删除之前生成的公匙(如果有执行,没有也可执行一次,以防万一)
ssh-keygen -t rsa       # 一直按回车就可以

然后打开master节点上的 ./authorized_keys

vi ./authorized_keys  

slave1、slave2节点:

cat ./id_rsa.pub

将里面的内容手动复制到master的./authorized_keys 中然后保存Esc :x

在这里插入图片描述

master节点:

将master节点上的authoized_keys远程传输到slave1和slave2的~/.ssh/目录下

scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/	#在线复制给slave1
scp ~/.ssh/authorized_keys hadoop@slave2:~/.ssh/	#在线复制给slave2   

slave1和slave2节点:

ls ~/.ssh     //查看是否已复制
chmod 600 ./authorized_keys    #修改文件权限为只读,此操作必须执行不然不能成功  

然后就成功了!!!

在这里插入图片描述

SSH无密码登录配置就结束了

安装JAVA环境

每个节点上都要安装java,hadoop是基于java运行的,所以前提是必须有java环境

本人有点懒,JDK我就不用网站下载了,直接yum安装,这样比较快,毕竟yum源换成国内的了,速度还是可以的。

需要注意的是(CentOS 6.4 中默认安装的只是 Java JRE,而不是 JDK)为了开发方便,我们还是需要通过 yum 进行安装 JDK,安装过程中会让输入 [y/N],输入 y 即可。

sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

在这里插入图片描述

通过上述命令安装 OpenJDK,默认安装位置为 /usr/lib/jvm/java-1.8.0-openjdk(该路径可以通过执行 rpm -ql java-1.8.0-openjdk-devel | grep '/bin/javac' 命令确定,执行后会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了)。

rpm -ql java-1.8.0-openjdk-devel | grep '/bin/javac'

配置java环境变量

vi ~/.bashrc

在文件最后面添加如下一行,并保存:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

让环境变量生效

source ~/.bashrc  

设置好后我们来检验一下是否设置正确:

echo $JAVA_HOME     # 检验变量值
java -version
$JAVA_HOME/bin/java -version  # 与直接执行 java -version 一样

在这里插入图片描述

这样,每个节点Hadoop所需的JAVA环境就配置成功了

安装Hadoop

选择的是 2.7.7 版本,下载时请下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。

下载时强烈建议也下载 hadoop-2.x.y.tar.gz.mds 这个文件,该文件包含了检验值可用于检查 hadoop-2.x.y.tar.gz 的完整性,否则若文件发生了损坏或下载不完整,Hadoop 将无法正常运行。

这里我们需要先下载一个lrzsz,这样方便我们将下载好的hadoop放进来(此处需回到root用户)

注意:是在master节点上完成hadoop安装和配置

su
yum install lrzsz
su hadoop
rz

在这里插入图片描述

然后开始解压缩

sudo tar -zxf hadoop-2.7.7.tar.gz -C /usr/local            
//注意对应自己hadoop压缩包所在的位置
cd /usr/local/
sudo chown -R hadoop:hadoop ./hadoop-2.7.7        # 修改文件权限

检查Hadoop是否安装成功

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

cd /usr/local/hadoop-2.7.7
./bin/hadoop version

在这里插入图片描述

配置PATH变量

将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoop、hdfs 等命令了,如果还没有配置的,需要在 master 节点上进行配置。

vi ~/.bashrc
加入这一行,根据自己的路径
export PATH=$PATH:/usr/local/hadoop-2.7.7/bin:/usr/local/hadoop2.7.7/sbin
source ~/.bashrc	#使配置生效

配置集群/分布式环境

集群/分布式模式需要修改 /usr/local/hadoop-2.7.7/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml

这里的配置是进入相应的xml文件找到一对configuration空标签,然后添加如下内容

cd /usr/local/hadoop-2.7.7/etc/hadoop

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

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

vi slaves

删除localhost
添加:
slave1
slave2

2, 文件 core-site.xml 改为下面的配置:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/usr/local/hadoop-2.7.7/tmp</value>
                <description>Abase for other temporary directories.</description>
        </property>
</configuration>

3, 文件 hdfs-site.xml,dfs.replication 一般设为 3,如果只有一个 slave 节点,则 dfs.replication 的值设为 1:

<configuration>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>master:50090</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/local/hadoop-2.7.7/tmp/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop-2.7.7/tmp/dfs/data</value>
        </property>
</configuration>

4, 文件 mapred-site.xml (默认文件名为 mapred-site.xml.template),然后配置修改如下:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>master:19888</value>
        </property>
</configuration>

5, 文件 yarn-site.xml

<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。如果之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 master 节点上执行:

cd /usr/local
sudo rm -r ./hadoop-2.7.7/tmp     # 删除 Hadoop 临时文件
sudo rm -r ./hadoop-2.7.7/logs/*   # 删除日志文件
tar -zcf ~/hadoop-2.7.7.master.tar.gz ./hadoop-2.7.7   # 先压缩再复制
cd ~
scp ./hadoop-2.7.7.master.tar.gz slave1:/home/hadoop
scp ./hadoop-2.7.7.master.tar.gz slave2:/home/hadoop

slave1 ,slave2节点上执行:

sudo rm -r /usr/local/hadoop-2.7.7    # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop-2.7.7.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop-2.7.7
vi ~/.bashrc
加入这一行,根据自己的路径
export PATH=$PATH:/usr/local/hadoop-2.7.7/bin:/usr/local/hadoop2.7.7/sbin
source ~/.bashrc	#使配置生效

首次启动需要先在 master 节点执行 NameNode 的格式化:

下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!

cd /usr/local/hadoop-2.7.7/
./bin/hdfs namenode -format     # 首次运行需要执行初始化,之后不需要

如下图所示就ok了,成功的话,会看到 “successfully formatted” 和 “Exiting with status 0” 的提示,若为 “Exiting with status 1” 则是出错。

在这里插入图片描述

开启集群

接着可以启动 hadoop 了,启动需要在 master 节点上进行:

开启 NaneNode 和 DataNode 守护进程

cd /usr/local/hadoop-2.7.7/
./sbin/start-dfs.sh              

若出现如下 SSH 的提示 “Are you sure you want to continue connecting”,输入 yes 即可。

启动时可能会有 WARN 提示 “WARN util.NativeCodeLoader…” 如前面提到的,这个提示不会影响正常使用。

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就成功了!

启动YARN

YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性。

上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。

以下这一步操作貌似没有影响

首先修改配置文件 mapred-site.xmlyarn-site.xml(前面已经配置过了),这边只需重命名:

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

然后就可以启动 YARN 了(需要先执行过 ./sbin/start-dfs.sh):

./sbin/start-yarn.sh      $ 启动YARN
./sbin/mr-jobhistory-daemon.sh start historyserver  *# 开启历史服务器,才能在Web中查看任务运行情况*

不启动 YARN 需重命名 mapred-site.xml

如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成 mapred-site.xml.template,需要用时改回来就行。否则在该配置文件存在,而未开启 YARN 的情况下,运行程序会提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032” 的错误,这也是为何该配置文件初始文件名为 mapred-site.xml.template。

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

在这里插入图片描述

在 Slave 节点可以看到 DataNode 和 NodeManager 进程;

缺少任一进程都表示出错。另外还需要在 master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。

伪分布式、分布式配置切换时的注意事项

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

关闭集群也是在master上关闭,按顺序执行命令

./sbin/stop-dfs.sh
./sbin/stop-yarn.sh
./sbin/mr-jobhistory-daemon.sh stop historyserver

很抱歉图片问题我时隔这么久才发现是乱的,可能会给一些人带来麻烦,很抱歉!!

发布了22 篇原创文章 · 获赞 11 · 访问量 1124

猜你喜欢

转载自blog.csdn.net/SartinL/article/details/105018323