大数据学习1——Hadoop完全分布式搭建

学大数据第一件事就是搭建一个Hadoop集群。这里尝试了两种搭建方式。第一种是使用云服务器搭建。第二种是在虚拟机里面使用Ubuntu18搭建。

云服务器搭建完全分布式Hadoop

这里使用了2台腾讯云的服务器来搭建Hadoop。

前言

  1. 云服务器的Linux操作系统为CentOS7 ,可以使用cat /etc/centos-release来查看系统的版本,不同的系统命令会有区别;
  2. 这里用了两台腾讯云的服务器,要注意关闭防火墙,打开配置文件里面涉及到的端口。
  3. jdk需要1.8以上,这里作为测试,仅仅搭建了Hadoop,没有搭建Spark、Hive、Hbase等。Hadoop的版本是2.10.1。apache的官网下载可能比较慢。可以从国内的一些镜像下载,如清华大学的镜像hadoop-2.10.1
  4. 由于服务器里都是以root用户进行操作,如果非root用户去操作注意权限问题
  5. 在创建hadoop用户之后,所有的操作都是使用hadoop用户去操作。当然可以使用root以及其他用户去操作,但非root操作注意权限问题

集群规划

由于只搭建了Hadoop,加上只有两台服务器,规划比较简单,一台是NameNode+DataNode,一台是DataNode

IP地址和系统映射

  1. 修改主机名,使用vim /etc/hostname,修改两台服务器的主机名,一台是hadoop1,一台是hadoop2。

    1
    2
    vim /etc/hostname
    # 修改主机名Hadoop1 并保存
  2. 配置系统映射

    vim /etc/hosts修改里面的ip地址与映射。
    在服务器1中,编辑/etc/hosts文件:

    1
    2
    服务器1内网IP hadoop1
    服务器2公网IP hadoop2

    在服务器2中,编辑/etc/hosts文件:

    1
    2
    服务器2内网IP hadoop2
    服务器1公网IP hadoop1

    修改主机名重启后生效,使用shutdown -r now,两台主机可以ping通就可以了

关闭所有节点的防火墙

1
2
3
4
5
6
7
systemctl stop firewalld.service # 关闭firewall
systemctl disable firewalld.service # 禁止firewall开机启动
systemctl status firewalld.service # 查看防火墙状态,
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)

两台服务器都要关闭防火墙

添加用户hadoop及权限

如果后面都使用root用户,这里就不用了,如果不使用root操作,可以添加用户hadoop及密码。

1
2
3
4
[root@hadoop1 /]# useradd hadoop
useradd: user 'hadoop' already exists
[root@hadoop1 /]# passwd hadoop
123

给hadoop用户增加管理员权限

1
[root@hadoop1 ~]# visudo

找到 root ALL=(ALL) ALL 这行,应该在第98行,输入 :98 ,直接跳到第98行,然后在这行下面增加一行内容:hadoop ALL=(ALL) ALL ,中间一个tab空格

1
2
3
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
Hadoop ALL=(ALL) ALL

SSH免密登录

  • cd ~ //切换到用户home目录下
  • ls -a //查看目录下有无隐藏文件夹.ssh。如果没有,创建一个.ssh。注意.ssh目录的权限是700(drwx———),如果不是,修改一下(chmod 700 .ssh)
  • cd .ssh //进入 .ssh目录下
  • ssh-keygen -t rsa //在.ssh目录下生成私钥id_rsa和公钥id_rsa.pub
  • ssh-copy-id hadoop1 //该命令把生成的公钥文件的内容追加到hadoop1的authorized_keys 文件中,注意authorized_keys的文件权限是600。这步完成后,就可以ssh hadoop1免密登录自己了
  • ssh-copy-id hadoop2 //该命令把生成的公钥文件的内容追加到hadoop2的authorized_keys 文件中,hadoop1可以免密登录hadoop2
  • 按照上面步骤配置一下hadoop2,实现hadoop2免密登录hadoop1

安装JDK

JDK路径:/java/jdk/

1
2
3
4
# 解压安装包,具体的报名会不同,
tar -zvxf jdk-8u221-linux-x64.tar.gz
# 解压得到jdk1.8.0_221,拷贝到hadoop2
scp -r /java/jdk/jdk1.8.0_221 root@hadoop2:/java/jdk/

配置环境变量(hadoop1和hadoop2两个节点都要配置)

1
# sudo vim /etc/profile

在/etc/profile文件尾添加:

1
2
export JAVA_HOME=/java/jdk/jdk1.8.0_221
export PATH=:$PATH:$JAVA_HOME/bin

保存退出,使配置文件生效

1
source /etc/profile

安装Hadoop

路径:/home/hadoop/app/,这里使用的是hadoop用户
解压安装包

1
tar -zvxf hadoop-2.10.1.tar.gz

cd /home/hadoop/apps/hadoop-2.10.1/etc/hadoop进入配置文件所在目录

  1. 配置hadoop-env .sh,在hadoop-env.sh文件中修改JAVA_HOME路径。

    1
    2
    vim hadoop-env .sh
    # 添加export JAVA_HOME=/java/jdk/jdk1.8.0_221

  2. .配置core-site.xml
    在core-site.xml文件中添加以下内容:

    分别表示hdfs文件系统的主机和端口号,hadoop临时文件存放位置.端口号和路径都可以直接改,表格改完要心里有数。

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop1:8020</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/data/tmp</value>
    </property>
  3. 配置hdfs-site.xml

    dfs.replication表示副本的数量,默认是3,这里总共就两台机器,设置为2。dfs.block.size是数据块的大小,1.x默认64m,2.x默认128m。

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    <property>
    <name>dfs.block.size</name>
    <value>64m</value>
    </property>
  4. 配置mapred-site.xml
    先重命名,默认文件是mapred-site.xml.template

    1
    cp mapred-site.xml.template mapred-site.xml

    然后增加以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <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>
    </propertyxml
  5. 配置yarn-site.xml

    yarn.resourcemanager.webapp.address是yarn的web访问的端口号。

    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
    28
    29
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop1</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>hadoop1:8088</value>
    </property>
    <property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
    </property>
    <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    </property>
    <property>
    <description>Whether to enable log aggregation</description>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    </property>
    <property>
    <name>yarn.log.server.url</name>
    <value>http://hadoop1:19888/jobhistory/logs</value>
    </property>
  6. 配置slaves,就两个节点

    1
    2
    hadoop1
    hadoop2
  7. 文件同步,把刚刚配置的hadoop-2.10.1拷贝到hadoop2服务器上

    1
    scp -r /home/hadoop/apps/hadoop-2.10.1 hadoop2:/home/hadoop/apps
  8. 配置环境变量,两个节点都需要。

    1
    vim /etc/profile

    在/etc/profile文件尾添加:

    1
    2
    export HADOOP_HOME=/home/hadoop/apps/hadoop-2.10.1
    export PATH=:$PATH:$HADOOP_HOME/bin

    保存退出,使配置文件生效

    1
    source /etc/profile
  9. 配置完成,可以使用hadoop -version查看是否配置好了。

  1. 下面格式化hdfs
    namenode格式化,在/home/hadoop/apps/hadoop—2.10.1/bin目录下执行。成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示

    1
    hdfs namenode -format
  2. 启动hdfs,在hadoop-2.10.1/sbin目录下有启动的命令,可以start-dfs.sh,也可以start-all,一起启动

    1
    start-all.sh

    使用jps可以看到运行的进程,这是hadoop1上的,有NameNode,DataNode,SecondaryNameNode,ResourceManager,NodeManager。在hadoop2同样可以看到 DataNode,NodeManager,说明我们的集群部署成功了。

使用hdfs dfsadmin -report来观察集群配置情况:

可以通过hadoop1公网IP:50070来看hdfs部署情况

在浏览器上输入hadoop1公网IP:8088,可以看到yarn的情况

说明我们的hadoop是部署成功了。上面这些是在服务器上进行的,但是入门级别的服务器内存小性能弱,都是1核2G的,而且数量少,对于学习来说,可能有些捉襟见肘了。后续还是在虚拟机里使用更好。

虚拟机搭建完全分布式Hadoop

集群规划

这里以三台虚拟机为例子搭建一个完全分布式的的hadoop集群。主要是前面的一些步骤,像安装虚拟机,设置静态IP这些步骤,其余和上面在云服务里安装就是一样的。

节点
hadoop1 NameNode,DataNode
hadoop2 SecondaryNamenode,DataNode
hadoop3 DataNode

虚拟机安装

这里使用VM来搭建虚拟机,我们首先安装三台虚拟机,然后去在一台上面搭建好hadoop,再拷贝到其他两台上面。当然也可以在一台虚拟机上面搭建好,然后把虚拟机clone出两台。

这里使用的是ubuntu18的server版。在VMware Workstation右键新建虚拟机。把下载好的的iso文件导入即可。

然后按照提示一步一步完成即可,虚拟机的硬盘可以设置大一点,以免后续需要扩容。

设置静态IP地址

由于这里是使用虚拟机来搭建Hadoop集群,那么IP地址的设置就需要注意了。此次安装采用桥接模式,并且固定IP地址,让集群内部可以互相访问。避免集群在重新开机之后,大家都找不到IP地址了。

首先是设置虚拟机的网络模式,我这里因为最开始是使用了多台电脑搭建虚拟机,为了让集群能够互访问,后续就一直用桥接模式。也有一些教程里面使用的是NAT模式。

桥接模式里虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络。如上图所示的局域网中添加了一台新的、独立的计算机一样。宿主机与VM虚拟机是平级关系。因此,虚拟机也会占用局域网中的一个IP地址,并且可以和其他终端进行相互访问。

NAT模式使用的是VMware自己的网络连接模式。宿主机VM拟机有点像父子关系,要通过父级宿主机才能进行数据交流。

完成桥接模式的设置之后,打开虚拟机。不同的Linux发行版,有着不同的设置静态IP的方法。我这里是ubuntu18。首先使用ifconfig命令来查看虚拟机的网卡。可以看到虚拟机的网卡是ens33,现在的ip地址是192.168.0.208,这是我设置之后的,子网掩码是255.255.255.0。

进入/etc/netplan目录下,这里有一个叫做00-installer-config.yaml的文件,也就是静态IP的设置文件,修改这个文件需要sudo权限。

1
2
3
4
5
hadoop1@hadoop5:~$ cd /etc/netplan
hadoop1@hadoop5:/etc/netplan$ ls
00-installer-config.yaml
hadoop1@hadoop1@hadoop5:/etc/netplan$ sudo vim 00-installer-config.yaml
[sudo] password for hadoop1:

使用DHCP可以自动分配IP,所以这里把dhcp4:设置为no。修改文件如下,其中addresses表示ip地址,后面的24是子网掩码。gateway4是网关, nameservers是dns地址。子网掩码和网关和dns,可以去宿主机查看,保持一致就行了。比如在windows上使用ipconfig /all命令就可以看到。注意,宿主机的网络可能有不少,还包括VM的虚拟网卡,要找对是哪一个网卡。

1
2
3
4
5
6
7
8
9
10
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: no
addresses: [192.168.0.208/24]
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1]
version: 2

这里的IP地址尽量避免和已有的机器的IP地址冲突了。比如已有的都是192.168.0.1xx,这里就设置为192.168.0.2xx。保存退出后,使用netplan命令应用设置:sudo netplan apply,配置就生效了,可以重新查看IP。

注意所有机器都需要设置IP地址。完成了3台机器的操作之后,就可以像前面写的在云服务上安装那样继续进行下去了。不过,因为是在Ubuntu上安装,一些系统命令和centos可以不一样了。

  1. Ubuntu安装后一般是没有防护墙的。可以使用以下命令来操作防火墙。

    1
    2
    3
    4
    5
    6
    7
    8
    # 关闭防火墙
    systemctl stop firewalld
    # 查看防火墙状态
    systemctl status firewalld
    # 禁用防火墙
    systemctl disable firewalld
    # 使用防火墙
    systemctl enable firewalld
  2. 在Ubuntu里面,修改系统的设置,一定要使用sudo命令。