hadoop集群模式搭建
部署说明
hadoop集群模式与伪集群模式搭建的主要思路一致,只不过伪集群模式下所有节点都部署在一台主机上,而集群模式需要把节点部署在不同主机上,因而主机之间的通信是部署的重点和难点。
这里采用虚拟机的方式,创建3台虚拟主机来集群模式的搭建,其中主机1(master)部署HDFS的核心节点NameNode,主机3(slave2)部署secondNameNode;主机2(slave1)部署Yarn(集群资源管理系统和任务调度节点);3台主机上均需要部署DataNode。
由于采用虚拟机,所以首先在一台主机上安装必备软件jdk和hadoop配置;然后将该主机复制2份,修改主机名;最后完成3台主机之间的通信(免密登录),即可完成hadoop集群模式的搭建。
主机1上的配置
下载安装jdk(目前hadoop3只支持java8)
JDK安装包可以从oracle官网(https://www.oracle.com/java/technologies/downloads/ )下载,然后使用WinSCP上传到虚拟机的Ubuntu系统。
sudo tar -xzvf jdk-8u202-linux-x64.tar.gz -C /usr/local
配置jdk环境变量
打开~/.bashrc文件
$ sudo vim ~/.bashrc
然后在文件末尾加入以下代码,保存退出。
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效
$ source ~/.bashrc
查看java版本
$ java -version
安装成功后,会出现如下信息:
下载安装hadoop
Hadoop安装包可以从hadoop官网(https://hadoop.apache.org )下载,然后使用WinSCP上传到虚拟机的Ubuntu系统。注意解压后赋予hadoop目录777权限,否则运行hadoop任务时会出现权限不足问题。
$ sudo mv hadoop-3.3.4.tar.gz /usr/local
$ cd /usr/local
$ sudo tar -xzvf hadoop-3.3.4.tar.gz
$ sudo chmod -R 777 hadoop-3.3.4
配置hadoop环境变量(可以在bashrc或profile文件中添加)
打开~/.bashrc文件
$ sudo vim ~/.bashrc
然后在文件末尾加入以下代码,保存退出。
export HADOOP_HOME=/usr/local/hadoop-3.3.4
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export PATH=${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin:$PATH
使环境变量生效
$ source ~/.bashrc
查看Hadoop版本信息
$ hadoop version
安装成功后,会出现如下信息:
修改配置文件
Hadoop 可以在单节点上以伪分布式的方式运行,该模式下需要对core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、hadoop-env.sh和workers六个配置文件进行修改。配置文件的位于hadoop安装目录下的etc/hadoop/ 中。
切换到hadoop安装目录:
$ cd /usr/local/hadoop-3.3.4/
core-site.xml文件
打开core-site.xml,
$ sudo vim etc/hadoop/core-site.xml
定位到以下部分:
<configuration>
</configuration>
在其中添加如下代码:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.3.4/tmp</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>chuishuju</value>
</property>
</configuration>
hdfs-site.xml文件
打开 hdfs-site.xml,
$ sudo vim etc/hadoop/hdfs-site.xml
定位到以下部分:
<configuration>
</configuration>
在其中添加如下代码。
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:9868</value>
</property>
</configuration>
mapred-site.xml文件
打开mapred-site.xml,
$ sudo vim etc/hadoop/mapred-site.xml
定位到以下部分:
<configuration>
</configuration>
在其中添加如下代码。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>/usr/local/hadoop-3.3.4/share/hadoop/mapreduce/*:/usr/local/hadoop-3.3.4/share/hadoop/mapreduce/lib/*</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>slave1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>slave1:19888</value>
</property>
</configuration>
yarn-site.xml文件
打开yarn-site.xml,
$ sudo vim etc/hadoop/yarn-site.xml
定位到以下部分:
<configuration>
</configuration>
在其中添加如下代码
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/usr/local/hadoop-3.3.4/etc/hadoop:/usr/local/hadoop-3.3.4/share/hadoop/common/lib/*:/usr/local/hadoop-3.3.4/share/hadoop/common/*:/usr/local/hadoop-3.3.4/share/hadoop/hdfs:/usr/local/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-3.3.4/share/hadoop/hdfs/*:/usr/local/hadoop-3.3.4/share/hadoop/mapreduce/*:/usr/local/hadoop-3.3.4/share/hadoop/yarn:/usr/local/hadoop-3.3.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-3.3.4/share/hadoop/yarn/*
</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://slave1:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
hadoop-env.sh
打开hadoop-env.sh文件
$ sudo vim etc/hadoop/hadoop-env.sh
在文件末位添加jdk路径和用户名
export JAVA_HOME=/usr/local/jdk1.8.0_202/
export HDFS_NAMENODE_USER=chuishuju
export HDFS_DATANODE_USER=chuishuju
export HDFS_SECONDARYNAMENODE_USER=chuishuju
export YARN_RESOURCEMANAGER_USER=chuishuju
export YARN_NODEMANAGER_USER=chuishuju
workers
打开hadoop-env.sh文件
$ sudo vim etc/hadoop/workers
将文件前三行内容修改为如下内容(master和slave1、slave2是三台主机名)。
master
slave1
slave2
主机2和主机3的复制
主机1配置好后,需要将其关机。
找到主操作系统VMware虚拟机的存放目录,直接复制粘贴两份。为了区分各主机的名字,分别将文件夹命名为Ubuntu-master、Ubuntu-slave1、Ubuntu-slave2(主机1如果之前没有命名为Ubuntu-master,也可以在这步命名),如下图所示:
打开master主机
进入VMware主界面,选择打开虚拟机;然后选择Ubuntu-master所在目录。
进入Ubuntu-master目录,双击Ubuntu.vmx加载虚拟机,然后按开机按钮开机。
由于之前对主机1进行了重命名,所以会出现如下提示框。注意这里选择我已复制该虚拟机(ip地址保留原来的)。
进入master主机后,采用ifconfig命令查看ip地址并记下。
打开slave1和slave2主机
按照同样的方式,在VMware中分别选择Ubuntu-slave1和Ubuntu-slave2目录下的Ubuntu.vmx,打开slave1和slave2主机。
在开机时,会出现如下提示框,注意必须选择我已复制该虚拟机(slave1和slave2会重新分配ip地址,否则三个主机ip地址一致,无法同时联网)。
同样,进入slave1和slave2主机后,分别采用ifconfig查看ip地址并记下。
主机1、2、3间免密通信(一)
master主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为master
,然后保存退出。
修改成功后,shell中以“用户名@主机名:”的形式显示,如下图所示(需要重启)。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
slave1主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为slave1
,然后保存退出。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
slave2主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为slave2
,然后保存退出。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
主机1、2、3间免密通信(二)
master主机的配置
将master主机的公钥发送给slave1和slave2主机
$ scp id_rsa.pub chuishuju@slave1:~/.ssh/master_rsa.pub
$ scp id_rsa.pub chuishuju@slave2:~/.ssh/master_rsa.pub
slave1主机的配置
将slave1主机的公钥发送给master和slave2主机
$ scp id_rsa.pub chuishuju@master:~/.ssh/slave1_rsa.pub
$ scp id_rsa.pub chuishuju@slave2:~/.ssh/slave1_rsa.pub
slave2主机的配置
将slave2主机的公钥发送给master和slave1主机
$ scp id_rsa.pub chuishuju@master:~/.ssh/slave2_rsa.pub
$ scp id_rsa.pub chuishuju@slave1:~/.ssh/slave2_rsa.pub
主机1、2、3间免密通信(三)
master主机的配置
将slave1和slave2的密钥添加到授权文件
$ cat ./slave1_rsa.pub >> ./authorized_keys
$ cat ./slave2_rsa.pub >> ./authorized_keys
slave1主机的配置
将master和slave2的密钥添加到授权文件
$ cat ./master_rsa.pub >> ./authorized_keys
$ cat ./slave2_rsa.pub >> ./authorized_keys
slave2主机的配置
将master和slave1的密钥添加到授权文件
$ cat ./master_rsa.pub >> ./authorized_keys
$ cat ./slave1_rsa.pub >> ./authorized_keys
主机1、2、3间免密通信(四)
前面步骤已经完成了主机1、2、3间免密通信的配置。可以试下是否成功
在master主机中执行如下命名
$ ssh slave1
如下shell中变为“用户名@slave1”,就表明免密登录成功。输入exit退出远程登录,返回master主机。
$ exit
按照相同的步骤,可以试下3台主机之间的相互免密登录是否成功。记得exit退出远程登录。
hadoop集群格式化与启动
master中的操作
格式化namenode
$ cd /usr/local/hadoop-3.3.4
$ sudo hdfs namenode -format
启动进程(由于权限问题,再次启动需要所有服务器上删除hadoop安装目录下的tmp目录)
$ sudo start-all.sh
查看进程
$ jps
启动成功后,会显示如下进程
6277 NameNode
7016 Jps
6427 DataNode
6862 NodeManager
slave1中的操作
当namenode和resourcemanager分布在不同的服务器时,在master上执行start-all.sh不能启动、关闭resourcemanager,需要resourcemanager所在的服务器上执行start-yarn来启动。或者格式化集群后,在resourcemanager所在的服务器上执行start-all.sh来启动所有服务器上的进程。
启动yarn
$ cd /usr/local/hadoop-3.3.4/sbin
$ start-yarn.sh
查看进程
$ jps
启动成功后,会显示如下进程
3927 NodeManager
3783 DataNode
4045 Jps
2463 ResourceManager
slave2中的操作
查看进程
$ jps
启动成功后,会显示如下进程
5378 NodeManager
5507 Jps
5262 SecondaryNameNode
5119 DataNode
访问后台管理页面
hdfs分布式文件系统的管理页面
在主系统的浏览器中,输入http://192.168.72.142:9870 ,其中ip地址是master主机的ip地址。
ResourceManager的管理页面 在主系统的浏览器中,输入http://192.168.72.143:8088 ,其中ip地址是slave1主机的ip地址。
Hadoop集群结束进程
master中的操作
$ cd /usr/local/hadoop-3.3.4
$ sudo stop-all.sh
hadoop集群模式应用
hadoop集群模式应用方式与伪集群模式基本相同。
hadoop程序的./share/hadoop/mapreduce目录下存放了hadoop自带的java应用程序包,这里介绍下hadoop-mapreduce-examples-3.3.4.jar的应用。
字数统计
上传需要进行单词统计的txt文件。
切换到hadoop目录
$ cd /usr/local/hadoop-3.3.4
创建input目录
$ sudo mkdir wcinput
将“song.txt”文件通过WinSCP上传到虚拟机的Ubuntu系统,并移动到wcinpu目录下。
$ sudo mv song.txt /usr/local/hadoop-3.3.4/wcinput/
song.txt的内容如下:
将txt文件上传到HDFS(分布式文件系统)
**在集群模式下,数据文件需要首先对应成分布式文件,然后再运行单词统计任务,分布式文件系统有自己的操作命令,一般以hdfs dfs
开头。 **
创建分布式文件系统的用户
$ hdfs dfs -mkdir -p /user/chuishuju
为chuishuju用户创建分布式文件存放目录
$ hdfs dfs -mkdir input
将原始文件song.txt 上传到分布式文件系统
$ hdfs dfs -put /usr/local/hadoop-3.3.4/wcinput/song.txt input
查看上传的分布式文件
$ hdfs dfs -ls -R /
运行字数统计程序
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount input output
运行完成后,会在分布式文件系统中创建output文件下,part-r-00000文件存储了统计结果。
查看统计结果
$ hdfs dfs -cat output/part-r-00000
如果需要再次运行程序,需要把output文件删除,或者起一个新的输出文件夹名,否则会报错!
$ hdfs dfs -rm -r output