前言:说真的我是真不喜欢搭建Hadoop,什么奇葩问题都有。最近有个课程需要做这个实验,无奈自己的mac空间不够我折腾,特意租了三个服务器来做这个实验。我其实也是差不多照着网上的教程来的,但他们说的都不是很细,遇到的问题也很多。下面这篇博客记录了我在三台服务器上搭建Hadoop完全分布式的记录。本地的搭建也适用,并不要求是云服务器。如果是用云服务器来搭建的朋友,推荐使用xshell6来操作。
OK进入正题。我的结构是用阿里云(Centos7.5)作为master,腾讯云(Centos6.3)作为两个slave。博客分成三个部分:
一、环境设置:
在安装好Linux系统的基础上,在master节点上先做以下准备工作:(云服务器自带操作系统)
自行切换到root模式下,可以避免权限的 干扰。虽然不推荐这样,但学习阶段不用care。
1.安装jdk1.8:到甲骨文的官网自行下载jdk1.8 linux版本的,当然也可以通过wget+下载网址来下载。
下载完之后
在usr下面创建一个java文件夹:mkdir java
然后通过解压指令:tar -zxvf +jdk的名字 -C +解压路径(也就是/usr/java)
等待解压完成,输入指令vi /etc/profile配置java环境变量。推荐大家这样配置!profile是对全局用户均有效。
.barshrc那个是运行时有效,具体百度。然后加入下面的内容。注意路径的替换:
export JAVA_HOME=/usr/java/jdk1.8.0_231
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
然后通过指令:source /etc/profile
控制台输入:jave -version(注意空格)
ok配置成功!三台主机都要配置!!
2.关闭防火墙:其实centos的防火墙默认是关闭了,但是为了防止这个问题的影响,还是要关闭一下:
防火墙一定要关闭!不然后面会影响我们访问hadoop的本地web页面
没有任何输出则证明执行成功。
3.修改hosts文件:(root模式)
这一步非常关键!一定不能填错IP地址。(如果是本地的话则没有这个限制)云服务器一般会有公网和内网两个IP。首先在master上hosts文件需要填入的是:master内网ip(我这里是阿里云服务器,因此填入阿里云的内网ip),然后填入两个slave的外网IP。然后再修改两个slave的hosts文件,内容填入三台服务器的外网IP即可。
打个码。。毕竟是我自己的服务器。配置完master,务必配置两台slave,网上说的什么发送这个hosts配置给其它两台slave,其实没必要也不需要。按照我下面说的去配。
这里给大家的建议是:在哪台机器上配置就用自己的内网IP,其它机器用外网IP。在这里解释一下内网和外网ip。外网ip是服务器映射提供的,可以自由更改,内网ip则是你服务器的真实ip,不可更改,就是我们常说的每台主机都有一个独一无二的ip地址。
4.创建Hadoop用户:(这一步可以跳过,全在root模式下,可以避免权限问题)
后面Hadoop环境的配置都要在这个用户下面了。
adduser hadoop --> passward hadoop 然后输入密码。
之后切换到Hadoop用户:su hadoop。
到此准备工作完成!
二、设置master和slave之间免密登录
这是搭建Hadoop最恶心的部分了,很多奇怪的问题都是从这产生的。废话不多话进入正题。
1.创建公匙:
创建完后,在三台主机上都执行下面的指令:
ssh-copy-id localhost
ssh-copy-id slave1
ssh-copy-id slave2
也可以将名字替换成IP,但前面已经在host文件映射过Ip和名字的关系了。执行完三条指令,分别测试:ssh localhost、ssh slave1 ssh slave2.可以看到成功免密登录。
三、安装hadoop并配置:
以前博客给的其实都不太能用了,那些安装包的地址都失效了,如果你有可视化的操作界面,直接到hadoop官网下载然后解压,安装包大小在300MB左右。如果是服务器这边只有大黑框,可以通过wget指令来实现安装:这里贴一个还能用的下载源:http : //archive.apache.org/dist/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
下面开始配置hadoop的文件:
1.修改core-site.xml:
<configuration>
<!--配置hdfs文件系统的命名空间-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value> <!--这里注意替换自己的主机名字-->
</property>
<!-- 配置操作hdfs的存冲大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!-- 配置临时数据存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/hadoop-2.8.5/tmp</value> <!--这里注意替换自己的hadoop路径,这里需要在hadoop-2.8.5的目录创建一个tmp文件夹-->
</property>
</configuration>
2.修改hdfs-site.xml
用mkdir命令在hadoop-2.8.5目录下创建hdfs文件夹,然后再hdfs里面分别创建name和data文件夹。
<configuration>
<!--配置副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--hdfs的元数据存储位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/hadoop-2.8.5/hdfs/name</value> <!--注意替换-->
</property>
<!--hdfs的数据存储位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/hadoop-2.8.5/hdfs/data</value> <!--注意替换-->
</property>
<!--hdfs的namenode的web ui 地址-->
<property>
<name>dfs.http.address</name>
<value>Master:50070</value> <!--注意替换-->
</property>
<!--hdfs的snn的web ui 地址-->
<property>
<name>dfs.secondary.http.address</name>
<value>0.0.0.0:50090</value> <!--这里照着我输入就好了,改成这个后面才能正常访问hadoop本地的web页面-->
</property>
<!--是否开启web操作hdfs-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--是否启用hdfs权限(acl)-->
<property>
<name>dfs.permissions</name>
<value>false</value> </property>
</configuration>
3.配置mapred-site.xml
这里注意一下,如果没有这个文件,对mapred.site.xml.template编辑也是一样的。
<configuration>
<!--指定maoreduce运行框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value> </property>
<!--历史服务的通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value> <!--注意替换-->
</property>
<!--历史服务的web ui地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value> <!--注意替换-->
</property>
</configuration>
4.配置yarn-site.xml
凡是涉及到主机名和路径的自行替换成自己的。
<configuration>
<!-- Site specific YARN configuration properties -->
<!--指定resourcemanager所启动的服务器主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1</value>
</property>
<!--指定mapreduce的shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定resourcemanager的内部通讯地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8032</value>
</property>
<!--指定scheduler的内部通讯地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<!--指定resource-tracker的内部通讯地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8031</value>
</property>
<!--指定resourcemanager.admin的内部通讯地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<!--指定resourcemanager.webapp的ui监控地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
</configuration>
5.配置slaves:直接加入slave1 slave2 。替换成自己的主机名字。
6.配置hadoop-env.sh、yarn-env.sh、mapred-env.sh 在里面加入自己的jdk路径。如果不知道jdk路径输入whereis java。加入下面的内容:/usr/java/jdk1.8.0_231。注意替换自己的路径。
7.配置完成!将该文件打包发送到其它两台服务器上面。
打包指令:tar -zcvf +新压缩的文件名 +被压缩的文件名。
发送指令: scp +待发送的文件名+ 用户名@主机名:/接受路径
如: scp hadoop-2.8.5.tar.gz root@slave1:/home/hadoop
8.配置hadoop的环境变量:
vi /etc/profile
添加下面的内容,注意替换自己的路径:如果用到的路径没有相应的文件夹就自己创建。请注意三台主机都要配置!!
export HADOOP_HOME=/usr/opt/hadoop/hadoop-2.8.5
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_LOG_DIR=/usr/opt/hadoop/hadoop-2.8.5/logs
export YARN_LOG_DIR=$HADOOP_LOG_DIR
执行指令source /etc/profile 然后控制台输入 hadoop version 输出hadoop的版本说明配置成功。
四、运行结果
1.启动hadoop:
首先进入hadoop的sbin目录,格式化namenode:hdfs namenode -format
输入指令:start-all.sh会启动所有的服务,就不需要到salve1在去启动yarn。
等待它完成。
然后控制台输入jps:
可以看到hadoop所有的服务都已经成功启动。
然后我们访问hadoop的本地web页面:
浏览器输入:http://116.62.111.210:50070/ 这里注意替换成自己服务器的公网ip!!
然后可以看到下面的界面:
对了还可以访问9000端口跑wordcount程序,可以看到结果。这里演示了。修改任何hadoop文件都要先运行stop-all.sh停掉所有的hadoop服务器,修改完成后务必记得格式化namenode。到此一个hadoop-2.8.5正式搭建完成!
这里说一下博主搭建的心得吧。其实hadoop搭建不难,网上有些人写的帖子确实垃圾,漏了很多内容,但我这篇绝对是我踩了诸多的坑后总结的。