学了一个学期的Hadoop,终于把这块大骨头啃掉了,泪目!!!
这篇文章更像是一个学习Hadoop的总结
Hadoop伪分布式、分布式搭建
一、准备工作
1、hadoop压缩包
这个官网都会有,下载好压缩包备着,我使用的是2.7.1版本
2、jdk压缩包
这是Java的运行环境,因为Hadoop是基于Java的,所以需要配置Java环境
3、Xshell
它可以配合Xftp传输文件到虚拟机上
4、Xftp
配合Xshell使用传输文件
我会写一篇教程让大家学会使用这两个主要工具
5、VM虚拟机
这个就不多赘述了,你想学Hadoop这个都不知道的话说不过去了。网上有很多安装教程,大家可以参考后安装VM虚拟机,我这里用的是12pro版本
二、Hadoop伪分布式
1、安装Java
在/usr/local新建一个jvm的文件夹
cd /usr/local
mkdir jvm
进入jvm目录,将jdk的压缩包通过xftp导入虚拟机,tar -zxvf
解压到当前目录下
2、配置环境变量
vi ~/.bashrc
编辑环境变量,加入如下目录(我的安装目录:/usr/local/jvm/jdk)
export JAVA_HOME=/usr/local/jvm/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
source ~/.bashrc
让.bashrc
立即生效,通过java -version
查看环境变量是否配置成功
3、安装Hadoop
将Hadoop安装包通过Xftp导入虚拟机,解压到当前文件夹(/usr/local/hadoop)
修改配置文件core-site.xml和hdfs-site.xml当中的
<configuration>
</configuration>
core-site.xml修改(/usr/local/hadoop/etc/hadoop
目录下)
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml修改(/usr/local/hadoop/etc/hadoop
目录下)
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
4、格式化NameNode
配置完成后格式化NameNode
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。
5、配置Hadoop、start-dfs.sh和start-yarn.sh环境变量
vi ~/.bashrc
打开环境变量配置,添加如下路径(export PATH最好放在最后)
export HADOOP_HOME=/usr/local/hadoop
export PATH=${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin:$PATH
source ~/.bashrc
使配置立即生效,输入hadoop version
确定是否配置成功。
之后可以在任意位置输入start-all.sh
启动Hadoop服务。
6、启动Hadoop
输入start-all.sh
,启动Hadoop(建议回到根目录操作)
7、通过Web端口访问HDFS
需要注意的是,无法访问Web端的原因可能是你的NameNode节点挂了(配置文件没配好),还有就是防火墙没有关闭。这里针对防火墙问题无法访问给出解决方案
systemctl stop firewalld
systemctl disable firewlld
第一条命令停止防火墙,第二条命令永久关闭防火墙,之后就可以通过localhost:50070端口访问
三、Hadoop分布式
我这里演示的例子为一台主机master
和一台从机slave
,本质其实是一样的,如果你需要多台从机,相当于加入多个slave
,只不过hostname和IP不可以重复,我会在下面的配置中加入注释
0、安装Java
参考伪分布式,先在master
主机上安装Java环境
1、修改hostname
由于Hadoop分布式会有多台机器,每个机子的hostname不能相同
vi /etc/hostname
修改hostname,hostname $(cat /etc/hostname)
hostname修改后立即生效
将集群中所有机子的IP都加入到/etc/hosts
中(这一步所有从机也需要配置)
[root@slave hadoop]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.117.150 master #主机
192.168.117.151 slave #从机
#192.168.117.152 slave02
#192.168.117.153 slave03
2、配置环境变量
vi ~/.bashrc
编辑环境变量,加入如下目录(我的安装目录:/usr/local/jvm/jdk)
export JAVA_HOME=/usr/local/jvm/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}
source ~/.bashrc
让.bashrc
立即生效,通过java -version
查看环境变量是否配置成功
所有从机也需要配置更新环境变量
3、设置ssh免密
设置免密之后你每次启动Hadoop就不用再输入密码了,连接从机也不用输入密码,方便主机登入从机
在master
上,输入cd ~/.ssh
检查你是否有.ssh文件夹。如果没有,输入ssh localhost
输密码用ssh连一下本地,就有.ssh文件夹了。在该文件夹下输入ssh-keygen -t rsa
进入命令后按流程按回车(有3次回车),然后在该目录下会生成密钥
3.1 设置本地免密
后在.ssh目录下输入cat id_rsa.pub >> authorized_keys
这样你ssh localhost
就不用输入密码了。
[root@slave .ssh]# cat id_rsa.pub >> authorized_keys
[root@slave .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts #可以看到多出了authorized_keys文件
[root@slave .ssh]# ssh localhost
Last login: Wed Dec 1 15:33:55 2021 from ::1 #直接连接
3.2 设置从机免密登录
将生成好的密钥拷贝到从机上
ssh-copy-id -i root@slave
#ssh-copy-id -i root@slave02
#ssh-copy-id -i root@slave03
root@的就是你从机的hostname,拷贝好后输入ssh root@slave
验证
[root@master ~]# ssh slave
Last login: Wed Dec 1 16:02:37 2021 from 192.168.117.150
[root@slave ~]# exit
登出
Connection to slave closed.
可以看到不需要再进行密码验证了
4、配置Hadoop
修改master主机上core-site.xml文件(/usr/local/hadoop/etc/hadoop
目录下):
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
# 注意开放的是主机的9000端口,所以localhost要改成主机的hostname
</property>
</configuration>
修改hdfs-site.xml文件(/usr/local/hadoop/etc/hadoop
目录下):
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
#加入如下配置,不加也没啥影响
<property>
<name>dfs.namenode.secorndary.http-address</name>
<value>master:50090</value>
#localhost修改成主机的名字
</property>
</configuration>
修改主机中的slaves(/usr/local/hadoop/etc/hadoop
目录下)配置文件,将从机的hostname加入
[root@master hadoop]# cat slaves
slave #我的从机hostname
#slave02
#slave03
5、拷贝文件
将配置好的主机中的hadoop和jdk拷贝到从机
scp -r <需要拷贝的文件目录> <从机hostname>:<拷贝到从机的目录>
scp -r /usr/local/hadoop slave:/usr/local #将主机hadoop文件拷贝到从机local目录下
#scp -r /usr/local/hadoop slave02:/usr/local
#scp -r /usr/local/hadoop slave03:/usr/local
scp -r /usr/local/jvm slave:/usr/local #将主机jvm文件拷贝到从机jvm目录下
#scp -r /usr/local/jvm slave02:/usr/local
#scp -r /usr/local/jvm slave03:/usr/local
不要忘记从机的
.bashrc
环境变量配置,参考主机的环境变量,配置好后source
更新!!!
6、格式化NameNode
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
格式化操作只需要在master主机上运行一次就行
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。
hdfs在hadoop的bin目录下
7、验证集群是否启动成功
主机上输入start-all.sh
,启动后输入jps
[root@master hadoop]# jps
13845 NameNode
14182 ResourceManager
14875 Jps
14029 SecondaryNameNode
在从机上输入jps
[root@slave ~]# jps
10405 DataNode
11045 Jps
10509 NodeManager
可以看到,主机的NameNode节点已经启动,从机的DataNode节点启动
该集群搭建成功
8、通过Web端口访问HDFS
systemctl stop firewalld
systemctl disable firewlld
第一条命令停止防火墙,第二条命令永久关闭防火墙,之后就可以通过localhost:50070端口访问,点击Web界面上方的DataNodes,可以在该界面看到主机的从机信息
如果无法显示datanode,但是jps上都有datanode,检查hosts,每个从机的hosts里都要有整个集群的IP
stop-all.sh
然后service network restart
每一个机子的网卡,之后再访问web端,或者重新启动一次虚拟机。