使用虚拟机搭建Hadoop(伪分布式搭建、分布式搭建)

学了一个学期的Hadoop,终于把这块大骨头啃掉了,泪目!!!
这篇文章更像是一个学习Hadoop的总结

Hadoop伪分布式、分布式搭建

一、准备工作

1、hadoop压缩包

这个官网都会有,下载好压缩包备着,我使用的是2.7.1版本

2、jdk压缩包

这是Java的运行环境,因为Hadoop是基于Java的,所以需要配置Java环境

3、Xshell

使用虚拟机搭建Hadoop(伪分布式搭建、分布式搭建)
它可以配合Xftp传输文件到虚拟机上

4、Xftp

使用虚拟机搭建Hadoop(伪分布式搭建、分布式搭建)
配合Xshell使用传输文件

我会写一篇教程让大家学会使用这两个主要工具

5、VM虚拟机

使用虚拟机搭建Hadoop(伪分布式搭建、分布式搭建)

这个就不多赘述了,你想学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端,或者重新启动一次虚拟机。

上一篇:MapReduce 订单和商品pid替换(Reduce Join)基本实现


下一篇:Hadoop部署