正文开始@Assassin
前一篇博客 Hadoop单机模式部署 中已经配置好了jdk环境,对hadoop软件也进行了安装和基本配置;本篇博客承接前篇,简单记录一下Hadoop伪分布式模式部署,伪分布式的部署应该会比较规范一点了,这里会新建一个hadoop用户来进行与hadoop相关的操作
考虑到单机模式部署中已经将部署地前置工作(jdk,hadoop下载安装)做的差不多了,这里就不再做无用功了,直接从环境的配置方面开始记录~~
注:
我的hadoop版本是 hadoop 2.10.1
我的jdk版本是 jdk 1.8
jdk环境建议配置在系统环境变量之中,确保每个用户都能够正常使用
[ninghai@centos ~]$ sudo vim /etc/profile
vim 进入 /etc/profile
文件下:
在 /etc/profile
文件的末尾添加如下信息:jdk的CLASSPATH
在此无需配置
jdk的解压目录最好放在PATH路径中,让系统能够默认查找到(非PATH路径会查找不到jdk),PATH中一般包含 /usr/local
,/bin
,/usr/bin:
,/opt
等,建议解压路径选择 /opt
:
pwd输出一下jdk的解压路径:
JAVA_HOME=/opt/jdk1.8.0_251 #jdk解压目录
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin #拼接原有PATH,同时添加jdk的bin及jre/bin
#执行export导出,提升为全局
export JAVA_HOME
export PATH
添加JAVA_HOME
,PATH
等信息,使其信息更改为如下图所示:
文件修改完成后保存退出,使用source指令刷新一下环境变量:
[ninghai@centos ~]$ source /etc/profile
刷新之后执行如下指令查看修改结果:
[ninghai@centos ~]$ java -version
显然 ninghai 用户正常配置了java环境
切换成 root 环境来确认是否全局环境中各个用户都能正常使用jdk:
到这里能确定jdk系统环境变量配置成功
考虑到上篇博客中hadoop的搭建都是在同一个普通用户下,这样显然是不太规范的,这里新建一个hadoop普通用户来进行对于hadoop单独的配置,这样既不用考虑用户作用域的问题(因为jdk配置是全局的),也隔离了可以使用hadoop的用户,也就是保证hadoop由专有的用户来管理(工作中基本上采用这种模式)
新建一个hadoop用户:
[ninghai@centos ~]$ sudo useradd hadoop
[ninghai@centos ~]$ sudo passwd hadoop
如果输入的密码太简单,不符合系统的建议,会报出提示,这只是一个小警告而已,继续输入密码确认即可修改;(建议密码还是设置地较复杂更好)
接下来使用密码登录hadoop普通用户:
[ninghai@centos ~]$ su - hadoop
whoami
指令显示当前是hadoop用户:
使用 xshell 将 hadoop 2.10.1 软件包 上传至 hadoop 用户:
ls -l 查看一下文件:
将 .tar.gz 压缩包解压缩:
[hadoop@centos hadoop-2.10.1]$ tar -zxvf hadoop-2.10.1.tar.gz -C .
[hadoop@centos ~]$ vim ~/.bash_profile
pwd
指令得到hadoop解压目录的路径:
在 ~/.bash_profile
文件中追加如下信息:
HADOOP_HOME=/home/hadoop/hadoop-2.10.1 #hadoop解压路径
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ##拼接原有PATH,同时添加hadoop_home的bin及hadoop_home的sbin
export HADOOP_HOME #导出HADOOP_HOME,提升为全局
修改文件信息为如下所示:
保存退出后使用source
刷新环境变量:
[hadoop@centos hadoop-2.10.1]$ source ~/.bash_profile
[hadoop@centos ~]$ hadoop version
伪分布模式运行Hadoop需要先进行相关配置,并启动守护进程(后台运行),基本配置文件所在路径为Hadoop的安装目录下的etc文件夹,也就是:
$HADOOP_HOME/etc/hadoop
,在当前环境中路径为:
/home/hadoop/hadoop-2.10.1/etc/hadoop
[hadoop@centos hadoop]$ cd /home/hadoop/hadoop-2.10.1/etc/hadoop
hadoop-env.sh文件是在启动hadoop进程时,系统会自动调用的一个脚本文件;在此文件中需配置前置环境,也就是告诉OS去哪查找jdk;
[hadoop@centos hadoop]$ vim hadoop-env.sh
vim 进入到 hadoop-env.sh 文件中,找到文件中的第25行JAVA_HOME
:
将其更改为如下所示:保存退出即完成
core-site.xml 文件是Hadoop的核心配置文件,全部配置项可参考官方文档:我是官方文档!
在这里需指定几个配置项,其中必须指定的是访问的端口;每一个配置项都有其默认值;配置信息如下:
<configuration>
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/hadoop-2.10.1/datavalue>
property>
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop:9000value>
property>
<property>
<name>fs.trash.intervalname>
<value>60value>
property>
configuration>
第一个配置项:指定的是hadoop临时文件存放的路径,比如在执行格式化操作之后,会生成一些跟集群相关的信息,如果不指定路径的话,这些信息默认会保存在 /tmp
目录下:
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/hadoop-2.10.1/datavalue>
property>
第二个配置项:是namenode
的一个访问协议,也是一个比较关键的配置项,包含协议,主机号,端口号等:
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop:9000value>
property>
第三个配置项:指定的是当文件删除之后,想让其保留多长时间;也就是开启了类似回收站的机制,默认是0min,指定时间之后就能在规定时间内在对应目录中找回文件:
<property>
<name>fs.trash.intervalname>
<value>60value>
property>
现在使用 vim 编辑 core-site.xml
文件:
[hadoop@centos hadoop]$ vim core-site.xml
hdfs-site.xml 是跟HDFS相关的一个核心配置文件;其全部配置项可参考官方文档:我是官方文档!
在这里修改基本的配置文件:
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>
<property>
<name>dfs.namenode.http-addressname>
<value>hadoop:50070value>
property>
configuration>
第一个配置项:Hadoop默认的块存储份数为3,Hadoop本身是一个全分布式的软件,设置冗余存储机制的目的和作用便是保证数据不丢失,现在使用伪分布式主要是进行简单的测试,所以这里给块数设置为1;
<property>
<name>dfs.replicationname>
<value>1value>
property>
第二个配置项:这里将权限校验的功能关闭掉,避免之后用API的方式去进行调用的时候,不会出现一些权限相关的问题;但是当真正在工作时的生产环境中去部署的时候就不需要去添加此配置,默认为True,也就是默认是需要有相关的权限才能进行操作;
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>
第三个配置项:namenode的http访问地址和端口可以手动进行指定,这里指定端口号为50070;这里需要注意的是,通常情况下端口号前填写的应该是ip地址,这里用了hadoop进行了替代,所以说在整个配置项完成之后还需要建立名称和ip地址的映射;
<property>
<name>dfs.namenode.http-addressname>
<value>hadoop:50070value>
property>
现在使用 vim 编辑 hdfs-site.xml
文件:
[hadoop@centos hadoop]$ vim hdfs-site.xml
mapred-site.xml 是Hadoop计算功能模块相关配置文件,全部配置项可参考官方文档:我是官方文档!
直接指定执行任务的方式为YARN,这样一来,在控制台也就是网页当中可以看到整个的任务信息,默认的方式为local;
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
这里需要注意,mapred-site.xml
原来的配置文件的名称为mapred-site.xml.template
,这里需要先将其重命名为mapred-site.xml
:
重命名为mapred-site.xml
:
[hadoop@centos hadoop]$ mv mapred-site.xml.template mapred-site.xml
现在使用 vim 编辑mapred-site.xml
文件:
[hadoop@centos hadoop]$ vim mapred-site.xml
yarn-site.xml 是Yarn资源调度相关配置文件,比如说指定在进行任务运行的时候分配多大的内存,统一地由谁来调配;全部配置项可参考官方文档:我是官方文档!
具体配置项如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>hadoopvalue>
property>
<property>
<name>yarn.nodemanager.resource.memory-mbname>
<value>1536value>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
configuration>
第一个配置项:指定资源统一由谁来进行调配,这里是 resourcemanager
;还有指定所在的机器,也就是计算的主体,这里是 hadoop;
<property>
<name>yarn.resourcemanager.hostnamename>
<value>hadoopvalue>
property>
第二个配置项:主要是对第二个配置项进行配置,分配给容器的物理内存量一般来说需要跟虚拟机的内存成正比,我的虚拟机的内存是2G,一般最多分配虚拟机内存的 3/4,我这里自然也就是分配了 2048 * 0.75 = 1536M的空间;分配的空间太多就可能对其他进程的运行造成影响了;小伙伴们可以根据自己虚拟机的实际情况是指定一下,设置为 -1则为自动分配,不设置默认为8192M;
<property>
<name>yarn.nodemanager.resource.memory-mbname>
<value>1536value>
property>
第三个配置项:指定NodeManager
获取数据的方式,这里设置的是mapreduce_shuffle
,如果有多个,可以在value
处用逗号分隔
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
现在使用 vim 编辑yarn-site.xml
文件:
[hadoop@centos hadoop]$ vim yarn-site.xml
slaves 是从节点配置文件,在slaves当中要配置它的从节点是哪个;当前是配置伪分布式,也就是说主节点跟从节点都是自己,所以将 slaves 文件中的localhost直接改成hadoop即可;
[hadoop@centos hadoop]$ vim slaves
将localhost修改为hadoop:保存退出
修改完成之后还需在hosts文件中添加一个hadoop的映射;
配置用户名hadoop映射:
为方便维护和使用,在配置文件中均使用新建的hadoop用户名进行了配置,所以在启动前要确保用户名hadoop能够成功解析成ip地址,注意不要使用127.0.0.1,如果之前配置过单机模式,需要修改过来
首先查看一下本机的ip地址:
[hadoop@centos hadoop]$ ifconfig
[hadoop@centos hadoop]$ sudo vim /etc/hosts
将其信息修改为如下图所示:建立ip地址与hadoop之间的映射
[hadoop@centos hadoop]$ ping -c 5 hadoop
使用ping指令测试hadoop,得到回应即表示映射成功
到这里就可以去启动hadoop了,在启动之前,建议去配置一个本地的SSH的免密登录,这里也是方便将来把伪分布式扩展成全分布式;
在Centos系统中已经默认安装并启动了SSH服务,配置免密码登录可以使Hadoop在使用的过程中更加方便;
[hadoop@centos ~]$ ssh-keygen -t rsa
#整个过程一直回车即可
# 第一个hadoop为用户名,第二个hadoop为ip地址,这里hadoop名称与ip地址做了映射,可根据实际情况进行修改
[hadoop@centos ~]$ ssh-copy-id hadoop@hadoop
# 输入一次hadoop用户的密码即可通过验证
Now try logging into the machine, with: "ssh 'hadoop@hadoop'"
and check to make sure that only the key(s) you wanted were added.
已经成功添加了,使用 ssh hadoop@hadoop
测试一下;
# 第一次登录可能会出现验证提示,输入yes后回车,如果不需要输入密码直接登录则配置成功
[hadoop@centos ~]$ ssh hadoop@hadoop
在hadoop集群启动之前,先做一个格式化的操作,格式化主要是去生成集群自己需要的信息,比如主节点的唯一id等,主要是通过id来确认哪些主机归集群管理,也就是说是通过id来与主机进行绑定和对应的;
第一次使用Hadoop时需要进行初始化,该操作只需要执行一次,完成后会根据core-site.xml中的配置,在对应的目录下自动创建相应的文件夹:
[hadoop@centos ~]$ hdfs namenode -format
由于已经配置了环境变量,可以直接执行sbin目录下的脚本:start-all.sh,如果需要停止可以执行 stop-all.sh:
[hadoop@centos ~]$ start-all.sh
第一次启动采取谨慎点的措施,为了让细节显得更加直观,这里采用分步的方式去启动hadoop:
[hadoop@centos ~]$ start-dfs.sh
出现几个相关的进程,有利于我们去排查错误,如果有错误可以到对应的logs文件夹去查看,每一个进程都会有相应的输出日志;出现一个0.0.0.0的添加,输入yes确认:
接下来启动 start-yarn.sh:
[hadoop@centos ~]$ start-yarn.sh
jps为安装配置好JDK环境后的命令,可以查看到当前用户下的Java进程,如果无法正常使用需检查JDK的环境变量配置:
[hadoop@centos ~]$ jps
出现如下图所示的5个进程,证明成功(不包括jps本身)。需要注意的是,如果进程在启动一小段时间之后自动消失则证明该进程存在问题,需要根据日志信息进行排查;
出现 namenode主节点,数据存储服务相关的datanode,以及SecondaryNameNode;证明dfs正确;
出现 NodeManager (运行在单个节点上的代理),ResourceManager (是整个Yarn集群中最重要的组件之一,其主要的功能包括ApplicationMaster的管理);证明yarn正确;
到这里 整个hadoop集群的启动及运行就正常完成了~
不关闭防火墙可能导致无法访问 Hadoop 的 Web UI 界面:
# 查看防火墙状态
[hadoop@centos ~]$ sudo firewall-cmd --state
# 关闭防火墙:
[hadoop@centos ~]$ sudo systemctl stop firewalld.service
查看HDFS Web UI 界面,ip为虚拟机的IP地址,端口为 50070:
查看NameNode和DataNode Web UI 界面,端口为 50070:
查看SecondaryNameNode Web UI 界面,端口为 50090:
查看ResourceManager Web UI 界面,端口为 8088:
查看NodeManager Web UI 界面,端口为 8042:
切换路径到 /home/hadoop/hadoop-2.10.1/share/hadoop/mapreduce
目录下:
[hadoop@centos ~]$ cd /home/hadoop/hadoop-2.10.1/share/hadoop/mapreduce
在 mapreduce 下创建一个测试文件 data.txt:
good better best
never let it rest
till good is better
and better best
good good study
day day up
today is a good day
将此文件上传至HDFS文件系统内(这里直接传到了HDFS根路径下。也可以自行创建目录):
[hadoop@centos mapreduce]$ hadoop fs -put data.txt /
执行作业,测试 wordcount:
[hadoop@centos mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.10.1.jar wordcount /data.txt /wc_result
[hadoop@centos mapreduce]$ hadoop fs -cat /wc_result/part-r-00000