使用vmware搭建hdfs集群

作者 uunnfly 日期 2021-02-26
使用vmware搭建hdfs集群

实验设备:

  1. vmware workstation 16 pro
  2. centos 7
  3. hadoop 3.3

实验步骤

  1. 安装centos,先安一台,配置好再克隆两台
  2. 网络可使用桥接模式,或者NAT模式。需使用静态ip

配置NAT

  1. vmware选择编辑 -> 虚拟网络编辑器 -> NAT模式

  2. 取消勾选DHCP

  3. 选择NAT设置,查看子网IP,待会设置的虚拟机ip需要跟它一个网段

  4. 修改虚拟机的网络配置

    1
    vim /etc/sysconfig/network-scripts/ifcfg-ens33

    其中ens33是网卡名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=static //静态ip,如果是动态ip写dhcp
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=yes
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=ens33 //网卡名字
    UUID=41620e18-cab6-4238-bb74-0ceb74b4deab
    DEVICE=ens33
    ONBOOT=yes //是否开机时启动
    IPADDR=192.168.30.200 //静态ip,需要和NAT的子网在一个网段
    PREFIX=24 //也可以写 NETMASK=255.255.255.0
    GATEWAY=192.168.30.2 //网关需要和NAT设置里网关ip一样
    DNS1=8.8.8.8
    DNS2=8.8.4.4
  1. 重启网络
    service network restart

  2. ping baidu.com

  3. 此时能上外网了,但是想要和宿主机互相访问还需要看一下网卡的设置。打开windows的网络中心,选择VMnet8这张虚拟网卡,查看其ipv4设置,ip地址需要跟NAT子网一个网段,最后的主机号不能跟虚拟机的主机号相同。

  4. vmware的NAT原理大致如下:虚拟机访问外网通过VMware NAT service这个进程直接跟物理网卡相连,而宿主机访问虚拟机需要通过VMnet8这张虚拟网卡。此外,还有一个VMnet8虚拟交换机,跟VMnet8虚拟网卡不是一个东西。VMnet8虚拟网卡与虚拟机网卡在同一个网段,它们之间通信不需要在网络层进行,只需要在数据链路层。虚拟机和宿主机都是这个网段的一台主机。

  5. 如果虚拟机想要被除了宿主机以外的其他机器访问,需要使用NAT设置里的端口转发。

桥接模式

这个模式设置起来比较简单,注意不能跟其他ip冲突,相当于真实的物理机

关闭防火墙

需要把所有机器的防火墙关闭(还没搞清用到的所有端口,如果搞清了可以只开放部分端口)

1
2
systemctl stop firewalld
systemctl disable firewalld

设置hosts

设置这个是为了我们能够通过主机名就直接访问机器

  1. 设置本机hostname, 名字随便取,注意可读性
    hostnamectl set-hostname hserver1
    或者

    1
    2
    vim /etc/hostname
    hserver1
  2. 配置etc/hosts文件

    1
    2
    3
    4
    5
    6
    [root@hserver1 ~]# vim /etc/hosts

    ...省略上面内容...
    192.168.30.200 hserver1
    192.168.30.201 hserver2
    192.168.30.202 hserver3

最后加了三行,虽然另外两台机器还没有搭建,可以先写好。

免密登录认证

  1. 生成公钥,私钥。在A账户下生成那登录的就是A账户
    ssh-keygen -t rsa
  2. 进入.ssh目录 cd .ssh
  3. 查看是否有authorized_keys文件,若没有则创建 touch authorized_keys, 并修改权限为600 chmod 600 authorized_keys
  4. 追加公钥到authorized_keys cat id_rsa.pub >> authorized_keys
  5. 进行验证

    1
    2
    3
    ssh localhost
    ssh hserver1
    ssh 0.0.0.0

    输入yes后不用输密码就对了

    因为用的克隆,所以不用单独设置密钥。如果不用克隆,每台机器需要生成密钥,并且把公钥给对方,自己就可以登录别人的机器。

    传输公钥的命令可以用
    ssh-copy-id user@host
    或者
    scp id_rsa.pub hzq@192.168.1.161:/home/hzq
    然后还需加入到authorized_keys

安装java与hadoop,配置环境变量

安装java与hadoop省略

修改/etc/profile配置环境变量

1
2
3
4
5
6
7
8
9
10
vim /etc/profile

最后加上
#java environment
export JAVA_HOME=/opt/apps/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

#hadoop environment
export HADOOP_HOME=/opt/apps/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

hadoop配置

需要配置$HADOOP_HOME/etc/hadoop/下四个配置文件,core-site.xml, hdfs-site.xml,mapred-site.xml, yarn-site.xml。其中后两个是跟yarn相关,只搭建hdfs可以只配置前两个。
这四个配置文件都有对应的xxx-default.xml

core.site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- hdfs的地址名称:schame,ip,port-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hserver1:9000</value>
</property>
<!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/apps/hadoop/tmp</value>
</property>
</configuration>

hdfs-site.xml

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
<configuration>
<!-- namenode守护进程管理的元数据文件fsimage存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
<!-- 块的副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 块的大小-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hserver2:50090</value>
</property>
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定mapreduce使用yarn资源管理器-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置作业历史服务器的地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hserver1:10020</value>
</property>
<!-- 配置作业历史服务器的http地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hserver1:19888</value>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- 指定yarn的shuffle技术-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hserver1</value>
</property>
</configuration>

配置hadoop-env.sh

1
2
# The java implementation to use.
export JAVA_HOME=/opt/apps/jdk

还需要在最后加上几个环境变量,因为hdfs默认的账户名是hdfs

1
2
3
4
5
6
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HADOOP_SHELL_EXECNAME=root

配置worker文件

原先叫slaves,此文件用于指定datanode守护进程所在的机器节点主机名

1
2
3
hserver1
hserver2
hserver3

克隆虚拟机

克隆之后,需要修改hostname和网络地址

  1. 修改主机名 hostnamectl set-hostname hserver2
  2. 修改ip vim /etc/sysconfig/network-scripts/ifcfg-ens33
  3. 重启网络 systemctl restart network

格式化NameNode

在hserver1上运行 hdfs namenode -format

集群操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 启动脚本
-- start-dfs.sh :用于启动hdfs集群的脚本
-- start-yarn.sh :用于启动yarn守护进程
-- start-all.sh :用于启动hdfs和yarn
2. 关闭脚本
-- stop-dfs.sh :用于关闭hdfs集群的脚本
-- stop-yarn.sh :用于关闭yarn守护进程
-- stop-all.sh :用于关闭hdfs和yarn
3. 单个守护进程脚本
-- hadoop-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
-- hadoop-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
reg:
hadoop-daemon.sh [start|stop] [namenode|datanode|secondarynamenode]
-- yarn-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
-- yarn-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
reg:
yarn-daemon.sh [start|stop] [resourcemanager|nodemanager]
  1. 启动 stat-dfs.sh
  2. jps查看进程

    1
    2
    3
    4
    5
    6
    7
    8
    --1. 在master上运行jps指令,会有如下进程
    namenode
    datanode
    --2. 在slave1上运行jps指令,会有如下进程
    secondarynamenode
    datanode
    --3. 在slave2上运行jps指令,会有如下进程
    datanode
  3. 启动yarn start-yarn.sh

  4. web查看, 端口分别是9870 (hdfs)和8088(yarn),如果没找到,可以在xxx-site.xml和xxx-default.xml文件中搜一下http看端口号

参考链接
SSH原理与运用(一):远程登录
Hdfs安装模式之完全分布式集群
深入理解VMware虚拟机网络通信原理