Hadoop本地真分布式部署
真分布式部署Hadoop需要用到多台虚拟机,实现真正物理上的分布式,这样可以结合多台机器的cpu和存储空间等硬件资源。
配置前基本配置信息检查
配置 | 说明 |
宿主机系统 | windows 11 |
虚拟机操作系统 | centos 7 |
虚拟机软件 | VMware |
ssh 工具 | Xshell 8.0 (free for school) |
软件包上传路径 | /root/softwares |
软件安装路径 | /usr/local |
JDK | jdk1.8 |
Hadoop | hadoop-3.4.1 |
由于虚拟机会占用大量的磁盘空间,故最好首先在VMware上修改工作区目录。具体修改方式为:编辑--首选项--工作区--虚拟机的默认位置。除此之外可以给虚拟机的内存空间调大使其具备一定灵活性,设置为主机预留最小内存为主机内存的一半:编辑--首选项--内存--预留内存。
我们可以首先对一台机器进行配置的修改,然后再用VMware的克隆功能将虚拟机拷贝三份,注意,这里请检查你的硬件资源是否充足,如果你的硬件资源不足,可以给每一台虚拟机分配较少的cpu核心和较少的磁盘空间,我这里给每一台虚拟机分配了40GB的磁盘空间。
虚拟机网络部署
在创建虚拟机时,网络模块选择NAT协议网络,为了保证虚拟机的ip地址固定可用,我们需要修改三个地方,一个是VMware的NAT网络设置,一个是宿主机windows的网络设置,还有一个是虚拟机内部的网卡配置。
VMware:
首先打开虚拟网络编辑器,然后点击 [更改设置]
在这里,我们把NAT模式的子网IP设置为192.168.10.0网段,指示NAT协议要把虚拟机的ip分配到这个网段,同时在【NAT设置】里需要设置网关为192.168.10.2,网关的最后一位一般都为2。然后点击【确定】来应用设置。
windows:
在上面的vmware的配置中,我们可以看到NAT模式用的是VMnet8这块网卡,然后我们需要在windows中修改这块网卡的网络适配器选项。在设置中搜索-【更改网络适配器设置】,然后找到VMnet8,点击更多属性,设置对应的网关和首选DNS,备用DNS可以填写8.8.8.8公共域名解析器。
VM Machine:
在虚拟机里面,我们需要进到网卡的配置文件里面,网卡的配置文件在
/etc/sysconfig/network-scripts/ifcfg-ens33
文件名是网卡设备名,可以通过ifconfig命令查看虚拟机的网络信息,然后找到正确的网卡,其名字就是我们要更改的配置文件名。
这里可以看到第一块网卡就是连接到外部网络的网卡,名为ens33。
通过vim命令打开配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
原先的BOOTPROTO是DHCP,指示ip地址动态分配,这里我们改成静态分配 BOOTPROTO='static'。除此之外把ip地址和网关以及DNS地址都设置好:
IPADDR=192.168.10.100
PREFEX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
然后保存退出之后,运用systemctl重启网络
systemctl restart network
然后ping一下百度和宿主机,能相互ping通说明配置成功。
ping baidu.com
ping 10.69.36.231 //这是我本机的ip 地址
能够ping通,然后关闭防火墙
systemctl stop firewalld
systemctl disable firewalld //禁止开机自启动
【配置成功】。
除此之外,为了便于我们识别和访问不同的结点,我们会对本机和其他结点命名,修改主机名通过hostname文件修改,主机映射可以通过hosts文件进行修改。
【vim编辑hostname文件】
vim /etc/hostname
修改本机设备标识名为hadoop100,如图所示
保存退出,随后修改hosts文件,创建主机映射:
vim /etc/hosts
末尾插入以下内容:
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
保存退出,重启机器并在终端输入hostname查看修改是否成功:
reboot
hostname
修改成功。
hadoop软件环境配置
hadoop是使用java编写的程序,故必然要给节点安装java的环境,这里我们使用java1.8的环境,最好是自己安装,而不是用yum命令,因为hadoop会检查JAVA_HOME的环境变量,如果没有配置,hadoop是会运行报错的。
【java1.8环境配置】
首先找到华为的java镜像网站:
https://repo.huaweicloud.com/java/jdk/
在里面找到最新的java8版本:8u202-b08
然后选择linux需要的x64压缩包:jdk-8u202-linux-x64-tar.gz
https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
在虚拟机里,cd到软件的存放目录,并解压软件包:
cd /root/softwares //这是我提前创建的,没有的话需要创建
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local //-C解压重定向到软件安装目录
mv /usr/local/jdk1.8.0_202 /usr/local/jdk-1.8.0 //改个名称
然后配置系统环境变量:
vim /etc/profile
插入以下几行(必须):
export JAVA_HOME=/usr/local/jdk-1.8.0 #注意等号两边不要有空格
export PATH=$PATH:$JAVA_HOME/bin
随后保存退出,用source命令激活
source /etc/profile
java -version看一下是否配置成功
java -version
【配置成功】
【hadoop环境配置】
我们首先去到清华的hadoop镜像站下载hadoop3.4.1
https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
下载之后,复制到虚拟机,注意vmware的复制功能不是很好用,会缺掉文件的大部分,故用winscp等scp工具来复制文件。
我们已经复制文件到~/softwares目录下之后,解压软件包:
tar -zxvf hadoop-3.4.1.tar.gz -C /usr/local/
然后配置环境变量信息:
vim /etc/profile
插入以下环境变量:
#hadoop_home
export HADOOP_HOME=/usr/local/hadoop-3.4.1
export PATH=$PATH:$HADOOP_HOME/sbin //集群管理脚本
export PATH=$PATH:$HADOOP_HOME/bin //hdfs基本指令
同样退出保存,并source激活
source /etc/profile
输入hadoop命令查看是否配置成功
hadoop version
出现如上结果代表【配置成功】
虚拟机克隆
我们的虚拟机hadoop100的基本环境已经配置好了,随后退出虚拟机,打开vmware,右键hadoop100虚拟机,点击管理--克隆,克隆两次,依次命名为Hadoop101,Hadoop102。
克隆的过程中,除了下面的一些选项特别配置以外,其他的都点击下一步就好:
克隆类型选择完整克隆;
名称需要修改为正确的名称;随后点击完成,这里根据设备的硬件速度需要等待的时间不同,所以请耐心等待几分钟。
克隆完成之后打开虚拟机,这里我们有两个地方需要修改,一个是克隆机的IP地址,另一个是hostname。
vim /etc/hostname
修改主机名,两台克隆机都要修改为正确的主机名。
vim /etc/sysconfig/network-scripts/ifcfg-ens33
这里将IP地址修改为节点对应的IP地址,保存退出。
reboot
重启虚拟机,两台机器都做完之后,相互ping 一下,同时ping一下百度
【配置完成】
虚拟机集群免密
配置hadoop集群需要涉及跨机器的数据传输,为了高效跨机器访问数据,需要对不同节点配置免密登录。所以我们在三个节点上都跑一次下面的指令:
1.ssh秘钥对生成, 使用rsa算法生成秘钥
ssh-keygen -t rsa
2.秘钥生成之后,会在用户的home目录生成一个.ssh隐藏文件夹,进入这个文件夹会有两个文件
cd ~/.ssh
ls -l
-rw-------. 1 root root 1675 11月 30 03:22 id_rsa
-rw-r--r--. 1 root root 396 11月 30 03:22 id_rsa.pub
3.使用ssh-copy-id指令传输秘钥到远程机器,这里我们把秘钥传到每一个节点让集群之间相互免密:
ssh-copy-id hadoop100
ssh-copy-id hadoop101
ssh-copy-id hadoop102
然后一直按回车或者输入yes,这时候目标节点的~/.ssh目录下会出现两个文件,一个是验证文件authorized_keys,另一个是known_hosts。前者是用来验证其他机器要免密登录时的私钥的,后者是标识本设备登录过哪些节点。
至此,免密登录配置完成,通过ssh hadoop100; ssh hadoop101; ssh hadoop102来确定是否需要密码登录,不需要密码则说明配置成功。
hadoop集群启动配置信息
真分布式的hadoop有主节点和从节点,我们选择hadoop100为主节点,然后到打开主节点虚拟机并修改hadoop集群启动的配置信息。
cd 到hadoop的安装目录:
cd $HADOOP_HOME //这里是我之前在环境变量已经配置好了,没有配置的需要自己去找安装路径
ls
bin include libexec licenses-binary logs NOTICE.txt sbin tmp
etc lib LICENSE-binary LICENSE.txt NOTICE-binary README.txt share
这里我们需要修改的是etc下的配置信息,故cd到对应目录
cd etc/hadoop
这里主要要修改四个文件:core-site.xml,hdfs-site.xml,hadoop.env.sh,workers
vim core-site.xml
插入以下信息:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.4.1/tmp</value>
<!--在初始化集群的时候一定要确保所有节点的tmp目录都不存在,否则有的节点启动不起来-->
</property>
</configuration>
同理,针对hdfs-site.xml,插入以下信息:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop101:9868</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
</configuration>
这里9870是主节点的http访问端口,可以在web上通过hadoop100的ip地址的9870端口来查看集群和hdfs的信息。
replication是备份的意思,表示要每个节点的文件备份几份,这里是真分布式,我们有三个节点,所以设置为3即可。secondary是针对SecondaryNameNode的配置,指定第二命名结点是hadoop101。
针对hadoop.env.sh,添加如下信息:
##JAVA_HOME
export JAVA_HOME=/usr/local/jdk-1.8.0
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
这里指示了JAVA_HOME以及在主节点,次节点和数据节点上登录的用户角色,这里设置为root确保最高权限。
最后针对workers,我们把workers的内容替换为实际要上线的工作节点,如图所示:
全部配置完成后保存退出。
集群配置信息分发
我们已经在hadoop100上成功地配置了基本信息,随后我们可以使用scp指令把etc文件夹发到其他节点,但是首先,在每一个节点(除了hadoop100)上先把原本的$HADOOP_HOME下的etc文件夹删除。
cd $HADOOP_HOME
rm -rf etc
然后回到hadoop100上,用scp把etc文件夹发给其他节点:
cd $HADOOP_HOME
scp etc hadoop101:$PWD
scp etc hadoop102:$PWD
至此集群的配置信息分发完毕。
集群初始化和启动
集群的初始化和启动只需要在主节点上发命令就好了,所以我们打开hadoop100,并进行操作
cd $HADOOP_HOME
rm -rf tmp//确保hadoop.tmp.dir目录不存在
hadoop namenode -format //初始化集群
随后使用脚本来启动集群:
start-dfs.sh
【以上过程的任何出现的命令不存在,都请检查环境变量的配置】
使用jps查看三台机器的java进程,可以看到在我们设置的主节点hadoop100上有NameNode进程和DataNode进程,Hadoop101上则有SecondaryNameNode进程和DataNode进程,Hadoop102上则只有DataNode进程。
至此集群启动完毕。可以通过windows宿主机的浏览器访问主节点的9870端口来查看集群信息,可以看到总的可用空间是107.44G,这说明各个机器的硬件资源确实被整合了:
可以点击Utilities-Browse the file system 来查看hdfs文件系统:
如果浏览器有上述界面则说明集群【启动成功】
词频统计案例-hdfs测试案例
这里我们通过编写java程序来以接口的方式访问文件系统,这里我们用一个官方的案例来使用hdfs
首先我们构建输入文件夹
cd ~
mkdir input
cd input
echo "a b c d e f g" >> file1 //给file1一些初始输入
for i in {1..100};do cat file1 >> file2; done//把file1的内容拷贝100份到file2,注意;的位置
ls -l
hdfs不是用的linux的文件系统,所以我们需要先把input文件夹上传到hdfs里面才能使用
上传指令 -put
cd ..
hdfs dfs -put input /input
在浏览器已经可以看到我们的input文件夹了
然后运行hdfs的案例jar包的程序来实现词频统计,以后想要运行自己的程序也可以自己写好代码之后导出为jar包,再这样运行我们自己的程序:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.1.jar wordcount /input /output
注意我们刚刚把input文件夹放到了hdfs的/input里,所以这里实际上的输入是/input 输出是/output,执行前确保输出目录不存在,否则无法执行。
等待执行结束之后,查看文件
hdfs dfs -cat /output/*
MapReduce成功利用hdfs执行了词频统计的功能。