由于学校开了门大数据的课程,在做实验的时候踩了许多坑,所以将Hadoop安装过程以及踩坑和如何避免踩坑在这里和大家分享一下。这次Hadoop平台的搭建主要是搭建一个三台服务器的集群,采用完全分布式的方式。看本博客前需要将linux系统在虚拟机上搭建好。
一、网络配置
注:三台服务器都需要配置网络。(也可以采用克隆的方式,但要记得对其他两台机器的网络信息进行修改)还是建议大家每台都操作一遍,熟悉过程。
Host-Only模式
虚拟机会与宿主机的虚拟网卡组成一个局域网,局域网中可使用单独的静态内部IP,只需要将网关设置为虚拟网卡的地址即可,这样,虚拟机之间可通过局域网互联,虚拟机通过网关与宿主机连接
不会多占用机房IP地址,适合上机时使用。如果对网络配置也不熟悉的朋友,可以参考我的另一篇关于网络配置的博客:https://blog.csdn.net/weixin_43800761/article/details/106742945
1.1 修改配置信息
修改IP地址要在这里修改,使用ipconfig命令不能永久修改
命令:vi /etc/sysconfig/network-scripts/ifcfg-网卡名
网卡名进入/etc/sysconfig/network-scripts/目录查看即可,CentOS7以后不再默认为eth0
IPADDR=192.168.137.150 实际地址须与GATEWAY在同一网段
NETMASK=255.255.255.0
GATEWAY=192.168.137.1 即VirtualBox Host-Only Network的IP地址
BOOTPROTO=static / dhcp static表示使用静态IP,DHCP使用动态IP
ONBOOT=yes 表示开机启动配置
1.2 修改DNS地址
命令:vi /etc/resolv.conf
增加配置:nameserver 114.114.114.114
或183.221.253.100、61.139.2.69
然后重启网络服务:service network restart
1.3 检验测试
命令:ping www.baidu.com ping其他域名亦可
1.4 修改主机名
使用hostname命令不能永久修改
命令:vi /etc/hostname
直接将主机名写入即可:node1
再执行命令:hostname 检查是否生效,若未生效,再执行命令:hostname node1临时修改一下。
还要修改host映射文件
命令:vi /etc/hosts
配置文件如下(IP地址和主机名以实际的为准):这里配置好三台的IP。
这样做的目的是:将IP地址和机器名相映射,这样再node和node之间通信的时候,可以直接使用主机名,也可以使用IP地址。
二、SSH免密登录
Hadoop集群通过Linux的SSH相互之间通信,故需配置SSH免密登录,否则节点间通信将被Linux拒绝
免密登录原理:即事先将RSA非对称加密的公钥由主节点拷贝到到其他节点,只需实现主节点至其他节点的免密即可.
2.1 去掉/etc/ssh/sshd_config的两行注释
去掉/etc/ssh/sshd_config的两行注释,打开RSA非对称密钥验证,所有节点都须操作。
命令:vi /etc/ssh/sshd_config
#RSAAuthentication yes
#PubkeyAuthentication yes
2.2 生成密钥对
- 主节点执行(node1)
命令:ssh-keygen -t rsa
生成key,不用输入密码,一直回车,生成密钥对放在 ~/.ssh 目录(ls -al可查看)
- 主节点执行(node1)
id_rsa.pub是公钥文件,将公钥文件内容复制到authorized_keys文件,并复制到其他节点的~/.ssh目录。
命令:cd ~/.ssh
进入到.ssh目录
命令:cat id_rsa.pub>> authorized_keys
命令:scp -r authorized_keys root@node1:~/.ssh/authorized_keys
本机(主节点)也需要免密才行。
命令:scp -r authorized_keys root@node2:~/.ssh/authorized_keys
将公钥文件复制到其他节点,节点名以实际的名称为准
命令:scp -r authorized_keys root@node3:~/.ssh/authorized_keys
注意: 在第一次执行的时候,是需要输入密码的,后面再换文件就不需要再输入密码了。
2.4 关闭防火墙
为了使node之间能够通信,还需要将节点的防火墙关闭。两种方式:
- 即时生效,重启后失效
service iptables stop
- 重启后永久生效
chkconfig iptables off
命令:systemctl stop firewalld.service
停止firewall
命令:systemctl disable firewalld.service
禁止firewall开机启动
由于我遇到了上述两种方式报错的情况,所以又提供了两种方式,读者哪种好使用哪种。
2.3 检查ssh
命令:ssh node2
命令:ssh node3
执行ssh将不再需要密码,若还需要,检查并重复前面的配置过程。
三、安装和配置JDK
前面已经实现了系统的安装,网络配置以及防火墙的关闭,到目前为止,多台计算机之间就可以通信了。由于Hadoop是基于Java语言环境的,所以还需要设置Java运行环境,JDK最好在1.8以上,这里使用1.8,最新的Hadoop需要下载JDK8。读者可以自行在官方下载:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
注意: 同时下载jdk-8u211-linux-x64.tar.gz和jdk-8u211-windows-x64.exe,虚拟机和宿主机要安装相同版本的JDK,以便后续学习和实验的进行(大版本相同即可)。
3.1 找到传上来的jdk文件并解压
命令:tar zxvf jdk-8u211-linux-x64.tar.gz
命令:mv jdk1.8.0_211 /home/
将解压后的目录移动至指定目录
3.2 配置环境变量
- 命令:
vi /etc/profile
在profile文件下面追加写入下面信息:
#java environment
export JAVA_HOME=/usr/java/jdk1.8.0_201
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
- 命令:
source /etc/profile
使配置文件生效。
3.3 测试检验
命令:java -version
若能显示版本则JDK安装配置完成,否则检查前面的步骤是否正确。
四、Hadoop完全分布式安装
4.1 Hadoop下载
版本:3.1.2,2019年2月6日发布
下载页面:https://hadoop.apache.org/releases.html
文件地址:https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
- 可用wget下载:
mkdir /home/hadoop
wget -P /home/hadoop https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
- 也可在宿主Windows中下载了,通过工具上传到Linux。(与JDK方式一样)。
4.2 文件解压
- 命令:
tar zxvf hadoop-3.1.2.tar.gz
然后再将解压后的目录移动至想要放置的位置,如:/home/hadoop/hadoop-3.1.2
- 在/home/hadoop目录下创建数据存放的文件夹,tmp、dfs、dfs/data、dfs/name。
4.3 配置各类文件
注意:这里配置的IP全部为主节点IP,首先在主节点进行配置。
首先,进入Hadoop的配置文件目录
cd /home/hadoop/hadoop-3.1.2/etc/hadoop
- 配置hadoop-env.sh
用vi编辑器打开目录/home/hadoop/hadoop-3.1.2/etc/hadoop/下的hadoop-env.sh配置文件
找到 # export JAVA_HOME= ,大概在54行的位置,去掉该行注释并添加JDK位置
配置前面安装jdk的位置:以实际地址为准
export JAVA_HOME=/home/jdk1.8.0_211
- 配置core-site.xml
用vi编辑器打开目录/home/hadoop/hadoop-3.1.2/etc/hadoop/下的core-site.xml配置文件
配置如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.137.150:9000</value> 以实际的主节点地址为准
</property>
<property>
<name>hadoop.tmp.dir</name> 原数据的目录位置
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
</configuration>
如图所示:
- 配置hdfs-site.xml
用vi编辑器打开目录/home/hadoop/hadoop-3.1.2/etc/hadoop/下的hdfs-site.xml配置文件
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.137.150:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.137.150:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
如图所示:
- 配置mapred-site.xml
用vi编辑器打开目录/home/hadoop/hadoop-3.1.2/etc/hadoop目录下的mapred-site.xml配置文件
配置如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.137.150:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.137.150:19888</value>
</property>
</configuration>
如图所示:
- 配置yarn-site.xml
用vi编辑器打开目录/home/hadoop/hadoop-3.1.2/etc/hadoop目录下的yarn-site.xml配置文件
配置如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.137.150:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192.168.137.150:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.137.150:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192.168.137.150:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.137.150:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
</configuration>
如图所示:
- 配置hadoop-env.sh、yarn-env.sh的JAVA_HOME
配置/home/hadoop/hadoop-3.1.2/etc/hadoop目录下hadoop-env.sh、yarn-env.sh的JAVA_HOME,不设置的话,启动不了,以实际地址为准。
export JAVA_HOME=/home/jdk1.8.0_211
如图:
- 配置Hadoop命令环境变量
命令:vi /etc/profile
在profile文件下面追加写入下面信息:
export HADOOP_HOME=/home/hadoop/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin
如图:
执行命令:source /etc/profile
环境变量即生效
4.4 配置worker并启动Hadoop集群
- 配置worker
配置/home/hadoop/hadoop-3.1.2/etc/hadoop目录下的workers,删除默认的localhost,增加2个从节点IP地址,以实际的为准。
- 将JDK、profile和Hadoop复制到各个节点对应位置上,通过scp传送
scp -r /home/jdk1.8.0_211 192.168.137.151:/home/
scp -r /home/jdk1.8.0_211 192.168.137.152:/home/
scp -r /etc/profile 192.168.137.151:/etc/
scp -r /etc/profile 192.168.137.152:/etc/
scp -r /home/hadoop 192.168.137.151:/home/
scp -r /home/hadoop 192.168.137.152:/home/
-
初始化hadoop
在主节点上启动hadoop,从节点会自动启动,进入/home/hadoop/hadoop-3.1.2目录。
(1)初始化,输入命令:bin/hdfs namenode -format
-
启动Hadoop
全部启动:sbin/start-all.sh
,也可以分开启动:sbin/start-dfs.sh
、sbin/start-yarn.sh
如果提示:there is no HDFS_NAMENODE_USER defined,则添加用户。
如图所示,出现了there is no HDFS_NAMENODE_USER defined
,则添加用户。
vi sbin/start-dfs.sh
vi sbin/stop-dfs.sh
在顶部空白处添加内容:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
如果提示:ERROR: there is no YARN_RESOURCEMANAGER_USER defined
.,则添加用户
vi sbin/start-yarn.sh
vi sbin/stop-yarn.sh
在顶部空白处添加内容:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
全部启动后:
停止服务,输入命令:sbin/stop-all.sh
- 查看进程
输入命令,jps
,可以看到相应的守护进程
主节点:NameNode、SecondaryNameNode
从节点:DataNode- 主节点
- 从节点
主节点也可同时运行NameNode和DataNode,只需要在workers文件中配置即可。
若守护进程不全,则进入/home/hadoop/hadoop-3.1.2/logs,查看日志以找到出错之处。
- 主节点
四、Hadoop完全分布式平台测试
- Web访问
- 输入地址:http://192.168.137.150:8088 在宿主机上的浏览器访问URL。
- 输入:http://192.168.0.2:50070/
至此Web访问正常。
- 测试HDFS上传文件
- 创建文件夹
命令:
bin/hdfs dfs -mkdir -p /user/xu/input
如下所示:
- 上传文件
命令:
bin/hdfs dfs -put NOTICE.txt /user/xu/input
如下所示:
- 执行结果
有兴趣的读者还可以尝试上传一个大文件,查看HDFS内部存储是怎样的。我在这里又进行了一些简单的测试,上传了一个大文件和一个小文件。
从这个可以看出来,小文件分别存在两个节点中。并且只有一个Block。
大文件也分别存在两个节点中,但是多了分块存储的操作。多个Block。
----------------------------------------------------------纸上得来终觉浅,绝知此事要躬行---------------------------------------------------------