利用VMware搭建分布式Hadoop平台

Hadoop简介

Hadoop是Apache软件基金会旗下的开源分布式计算平台,为用户提供了系统底层细节透明的分布式计算基础架构。Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群当中。Hadoop的核心是分布式文件系统(Hadoop Distribute File System, HDFS)。HDFS是针对谷歌文件系统的开源实现,是面向普通硬件环境的分布式文件系统,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储,其冗余数据的存储方式很好地保证了数据的安全性。

此外Hadoop还具有高可靠性、高效性、高可拓展性、高容错性、成本低、运行在Linux平台上及支持多种编程语言等特性。

hadoop生态

经过多年的发展,Hadoop生态系统不断完善和成熟,目前已经包含了多个子项目,除了核心的HDFS和MapReduce外,还包括zookeeper、hbase、hive、pig、mahout、sqoop、flume、Ambari等功能组件。

HDFS hadoop分布式文件系统,是Hadoop项目的两大核心之一,是针对谷歌文件系统的开源实现。HDFS 通过运行在廉价商用服务器上的Master/Slave架构来存储数据,具有高容错、高可靠、高可扩展、高获得及高吞吐率等特征。且hdfs在设计之初就将硬件故障作为常态来考量,可以保证部分硬件在发生故障后,仍能保证文件系统的整体可用性和可靠性。

Zookeeper 是一个高效和可靠的分布式协同工作系统,提供分布式锁之类的基本服务。它是这个动物园的管理者,负责监视节点的状态并根据反馈做出相应的反应。

想深入了解请大家自行查阅相关资料,这里仅仅为大家演示hadoop平台搭建的一个简易流程,并不能直接运用于生产环境,仅作学习使用。

Hadoop 安装

在安装之前大家需要选择一个合适的操作系统,这里推荐大家使用CentOS或是Ubuntu等系统。 CentOS 是基于红帽的一个免费发行版本,是经过严格测试也是在企业中广泛运用的一个Linux发行版本。此外Ubuntu则拥有大量的Linux桌面用户。两者的资料的都很容易在网上找到,方便大家的学习。

首先我们需要安装三台Linux虚拟机,本文以Ubuntu Server 18.04为例。网路连接方式采用仅主机模式。详见下表:

组件版本下载地址
Ubuntu Server18.04
Oracle JDK8u202
Hadoop3.2.0
Zookeeper3.4.13
虚拟机pc1pc2pc3
HostnameMasterSlave1Slave2
IP192.168.188.10192.168.188.11192.168.188.12
JPS

然后这是本文的一些命令阅读说明,所有命令均以$ 开头,非$ 开头的行默认为所要编辑的文本内容。 $、#一般解释为shell提示符,前者代表一般用户,后者代表root用户。

使用命令su可以切换到root用户,这样每次执行需要root权限的命令就不用添加sudo 了。前提是需要给root用户设置密码。

另外{}表示不同机子所要输入的不同命令参数或是文本内容。

例如下方的命令为修改主机名,我们需要根据虚拟机的规划,分别将三台机子的/etc/hostname文件内容改为Master、Slave1以及Slave2。

// 将三台机子的文件内容分别改为Master、Slave1以及Slave2
$ sudo vi /etc/hostname
{Master|Slave1|Slave2}

嗯然后本文里用的是vi编辑器,你也可以使用自己喜欢的编辑器来编辑文本。

vi编辑器的简单使用方法:i从命令模式进入编辑模式,esc退出编辑模式回到命令模式。在命令模式下输入:wq是保存并退出,:q! 不保存并退出。

在正式安装之前我们需要先对服务器进行简单的配置,主要是配置主机名、静态IP地址、创建hadoop用户、ssh免密登录等。

没有特别说明的话, 这些命令均要在三台机子中的执行一遍。

创建hadoop用户

如果你没有在安装系统的过程中创建hadoop用户,则需要添加一个名为hadoop的用户。这是为了方便权限管理。

useradd命令用于添加用户,m参数后面跟上用户名,s参数则是指定默认shell。

$ sudo useradd -m hadoop -s /bin/bash

接着使用passwd设置密码,格式为passwd <用户名>,然后系统会提示你输入密码。建议同时使用passwd root 命令给root用户设置密码。

$ sudo passwd hadoop

最后还要给hadoop用户添加管理员权限才行。

$ sudo adduser hadoop sudo

设置主机名

在linux当中主机名有transient、static 以及pretty三种,但我们常说的主机名是指静态主机名( static hostname) 。

在Ubuntu 18.04版本当中,需要先修改cloud.cfg文件才能正常更改主机名,否则重启后主机名又变回去了,若文件不存在请直略过。

$ sudo vi /etc/cloud/cloud.cfg
preserve_hostname: true    //由false改为true

然后使用hostnamectl命令设置永久性的静态主机名。格式为hostnamectl set-hostname <主机名>。使用该命令,分别将三台机子主机名变更为 Master、Slave1以及Slave2。

一般情况下, 使用hostnamectl 命令后,/etc/hostname里保存的主机名会被更新,可以不用手动修改hostname文件 。

$ sudo hostnamectl set-hostname {Master|Slave1|Slave2}
$ sudo vi /etc/hostname    //可选,正常情况下会自动更新
{Master|Slave1|Slave2}

配置静态IP

Ubuntu从17.10开始就改用Netplan配置网络了,过去修改/etc/network/interfaces文件的方法已经不再凑效。

Netplan 配置IP也是非常简单的,只要直接修改/etc/netplan/50-cloud-init.yaml文件就可以了,格式请严格按照默认格式,空格都不能省略哦。

ethernets: 后面接的是接口名,这里是ens32,默认也是这个,直接修改即可。可以使用ip address 命令查看要修改的接口名字。

$ sudo vi /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        ens32:
            dhcp4: no
            dhcp6: no
            addresses: [192.168.188.10/24]
            optional: true
    version: 2

按照上面的方法将三台机子的IP地址分别变更为所规划的地址。

修改hosts文件

我们需要修改hosts文件来映射IP和主机名的关系,否则无法通过主机名通信。

$ vi /etc/hosts
192.168.188.10 Master
192.168.188.11 Slave1
192.168.188.12 Slave2

关闭防火墙

$ sudo ufw disable

SSH免密登录

由于hadoop 集群中的Namenode 需要通过ssh来启动集群中所有机子的hadoop守护进程,若不设置免密登录,我们会在启动hadoop集群的时候不断被要求输入密码。

我们可以通过ssh-keygen命令生成公私钥,并将公钥写入~/.ssh/authorized_keys文件,就能实现免密登录本机了,要登录其它机器可以使用ssh-copy-id命令复制公钥过去。

$ ssh-keygen -t rsa    //生成公私钥
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys    //本机免密登录
$ chmod 600 ~/.ssh/authorized_keys    //确保权限正确

//将公钥拷贝到其它机子
Master $ ssh-copy-id -i ~/.ssh/id_rsa.pub {Slave1|Slave2}
Slave1 $ ssh-copy-id -i ~/.ssh/id_rsa.pub {Master|Slave2}
Slave2 $ ssh-copy-id -i ~/.ssh/id_rsa.pub {Master|Slave1}

/opt 路径权限

/opt目录是需要权限使用的,而本文的所有组件都是直接解压到此,作为学习方便可以直接修改/opt及其子目录的权限和变更所有者。

$ sudo chown -R hadoop /opt
$ sudo chmod -R 755 /opt

然后就是开始安装了。。这里可以选择在一台机子上安装配置完成后,再将组件连同配置文件一起拷贝到其它机子或是单独拷贝/修改配置文件。

这些组件可以下载到本地再通过xftp等sftp协议的工具软件上传到虚拟机里,有安装桌面环境和Vmware Tools工具的可以直接拖到虚拟机里,或是放到U盘里再将U盘连接到虚拟机等。

此外也可以使用wget命令直接从互联网下载到本机,只是这样可能没有像迅雷等软件下载速度快。

安装JDK

因为hadoop是使用java开发的,所以需要JVM的支持才能正常运行,正因为如此,也具有跨平台等特性。

一般Linux系统都自带了一个OpenJDK,但貌似没Oracle 的JDK兼容性好。因此需要另外安装JDK。

首先,将下载的JDK压缩文件解压到/opt路径

$ tar –zxf jdk-8u202-linux-x64.tar.gz –C /opt

然后配置环境变量就好了。

$ vi ~/.bashrc
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=/opt/jdk1.8.0_202/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

$ source ~/.bashrc

安装非常简单,不放心还可以使用java命令验证安装是否正确

$ java -version

安装Zookeeper

安装Zookeeper也是相同的道理,只要解压编译好的文件到指定目录,配置好环境变量就算安装完成了。

$ tar –zxf zookeeper-3.4.13.tar.gz –C /opt
$ vi ~/.bashrc
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=/opt/jdk1.8.0_202/jre
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.13

export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

安装完成后我们需要修改配置文件才能正确运行。配置文件位于zookeeper-3.4.13目录下的conf文件夹里,需要更改的参数主要有dataDir及server。

dataDir 指定用于存放内存数据库快照、myid等信息的目录。 ZooKeeper Server则是集群服务器的配置,格式为“server.<主机序号>=<主机名/IP>:<内部通信端口>:<选举端口>”。

$ cd /opt/zookeeper-3.4.13/conf
$ cp zoo_sample.cfg zoo.cfg
$ vi zoo.cfg
dataDir=/opt/zookeeper-3.4.13/data

server.0=Master:2888:3888
server.1=Slave1:2888:3888
server.2=Slave2:2888:3888

在zookeeper-3.4.13路径下新建data文件夹,并在该文件夹下新建一个myid文件,文件内容为机子的id序号,该id是zoo.cfg里server.x所定义的序号。例如本文中Master的内容应该为0、Slave1的文件内容应该为1等。

$ mkdir /opt/zookeeper-3.4.13/data
$ touch /opt/zookeeper-3.4.13/data/myid
$ echo {0|1|2} > /opt/zookeeper-3.4.13/data/myid

此外还有和hadoop整合的相关配置文件将放在下方

安装Hadoop

也是解压和配置环境变量

$ tar –zxf hadoop-3.2.0.tar.gz –C /opt
$ vi ~/.bashrc
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=/opt/jdk1.8.0_202/jre
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.13
export HADOOP_HOME=/opt/hadoop-3.2.0

export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

hadoop的配置文件主要有hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml及yarn-site.xml等。当中 hadoop-env.sh主要用于运行hadoop的脚本文件的环境变量。这里保持默认即可。

core-site.xml 是hadoop core的配置文件,用于HDFS及MapReduce常用的I/O设置等。

fs.defaultFS 参数用于指定文件系统的名称即描述集群中NameNode节点的URI,集群里面的每一台机器都需要知道NameNode的地址。DataNode 节点会先在NameNode上注册,这样它们的数据才可以被使用。

hadoop.tmp.dir 则是Hadoop文件系统依赖的基础配置,很多路径都依赖它。

$ cd /opt/hadoop-3.2.0/etc/hadoop/
$ vi core-site.xml
<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://Master:9000</value>
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>file:/opt/hadoop-3.2.0/tmp</value>
	<property>
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>Master:2181,Slave1:2181,Slave2:2181</value>
	</property>
</configuration>

hdfs-site.xml 是HDFS守护进程的配置文件包括名称节点、第二名称节点及数据节点的相关设置等。

dfs.namenode.http-address 指定每个NameNode WEB UI所监听的http地址及端口

dfs.replication 决定系统里文件块数据的备份个数即冗余数据因子

dfs.namenode.name.dir 元数据的保存路径

dfs.datanode.data.dir 数据节点数据的保存路径

$ vi hdfs-site.xml
<configuration>
	<property>
		<name>dfs.namenode.http-address</name>
		<value>Master:50090</value>
	</property>
	<property>
		<name>dfs.replication</name>
		<value>2&lt;/value>
	</property>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:/opt/hadoop-3.2.0/tmp/dfs/name</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:/opt/hadoop-3.2.0/tmp/dfs/data</value>
	</property>
</configuration>

mapred-site.xml 是MapReduce守护进程的配置项,涵盖job-tracker及task-trackers等。

mapreduce.framework.name 指定yarn作为资源管理框架

$ vi mapred-site.xml
<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>

yarn-site.xml是集群资源管理系统相关的配置文件,主要有ResourceManager、NodeManager的通信端口、web监控端口等设置。

$ vi yarn-site.xml
<configuration>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>Master</value>
	</property>
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>Master:2181,Slave1:2181,Slave2:2181</value>
	</property>
</configuration>

接着我们需要将配置文件拷贝至其它节点,可以选择直接拷贝整个程序文件夹及环境变量文件,就能节省大量的时间。

$ scp -r jdk1.8.0_202 hadoop@{Slave1|Slave2}:/opt
$ scp -r zookeeper-3.4.13 hadoop@{Slave1|Slave2}:/opt
$ scp -r hadoop-3.2.0 hadoop@{Slave1|Slave2}:/opt
$ scp ~/.bashrc hadoop@{Slave1|Slave2}:~/

Slave1 $ source ~/.bashrc
Slave1 $ vi /opt/zookeeper-3.4.13/data/myid
1

Slave2 $ source ~/.bashrc
Slave2 $ vi /opt/zookeeper-3.4.13/data/myid
2

启动zookeeper

可以使用zkServer.sh脚本来启动,同时还能使用status参数才确定服务器状态。

$ zkServer.sh start
$ zkServer.sh status

首次启动hadoop

首次启动hadoop前我们需要先进行格式化才能正常使用。

Master $ hadoop namenode -format

Master $ hadoop-daemon.sh start namenode
SlaveX $ hadoop-daemons.sh start datanode

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

其它启动命令

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

查询节点状态

$ jps
$ hdfs dfsadmin -report

这样安装就结束了,马上使用hdfs的相关命令进行测试吧!

有任何问题可以下方留言哦。然后本文有错误的地方也欢迎指正,感谢!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注