安装前准备

下载hadoop2.6文件
链接:hadoop2.6
提取码:j97d
下载jdk 1.8
链接:jdk 1.8

不会下载的请百度 这里就不过多赘述了

下载Xshell 6 与 Xftp 6
官网:国外下载链接 | 国内下载链接

建议用国外下载链接
因考虑到比赛使用ssh链接 Cenos7.4内部ssh链接代码为:ssh -p22 用户名@地址
这里为方便均使用xshell进行连接

将下载的hadoop2.6文件上传至Cenos7.4系统中

QQ截图20191010003503.png

打开Cenos7.4系统钟的终端,输入 ip add 查询当前系统地址,其中 192.168.52.133 是该虚拟机的内网ip。
将其复制进Xshell6中新建会话

QQ截图20191010003430.png

QQ截图20191010003448.png

QQ截图20191010003816.png

可以看到上图已经成过连接上了。接着我们上传文件。
先依次执行以下代码

cd /mnt
mkdir hadoop2.6
mkdir jdk1.8

进入并创建hadoop2.6这个文件夹
然后点击软件上的小绿标将文件上传进系统中

QQ截图20191010004206.png

QQ截图20191010004330.png

jdk1.8上传操作同上


克隆虚拟机

首先我们关闭当前虚拟机

在VM软件中-》虚拟机-》管理-》克隆

QQ截图20191010005721.png

然后一直下一步直到这个页面选择完整克隆

因为链接克隆会降低虚拟机性能而且如果父虚拟机出现损坏克隆的虚拟机也会无法使用

QQ截图20191010010136.png

虚拟机名称约定,之后所有教程中,克隆的本体虚拟机为masterNode1,其他两个克隆出来的slaveNode1slaveNode2

QQ截图20191010010620.png

重复该操作,克隆出slaveNode1与slaveNode2两个虚拟机。

至此,我目前有这三个虚拟机。

QQ截图20191010010813.png


安装hadoop 2.6

解压 hadoop 和 jdk1.8

tar -zxvf /mnt/hadoop2.6/hadoop-2.6.0.tar.gz -C /usr/
tar -zxvf /mnt/jdk1.8/jdk-8u231-linux-x64.tar.gz -C /usr/ 

三台机器均运行以上操作 约定,若以下教程没有特别指出在某一台或某两台机器进行操作,则默认为三台机器均进行操作
注意这里千万不要进入目录中直接解压压缩包,因为会无限弹出文件解压的提示,这是因为什么我也不知道,但是不要进文件夹内解压就可以了,路径输入绝对路径就不会出现这个问题

配置jdk 1.8

执行

vim /etc/profile #编辑系统配置文件 配置java环境变量

在第54行输入

export JAVA_HOME=/usr/jdk1.8.0_231
#以下可以不输入
#export JRE_HOME=/usr/jdk1.8.0_231/jre
#export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
#export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

输入内容.png

保存并退出,并重新加载系统文件

source /etc/profile

检测jdk是否安装成功

java -version

创建数据文件夹

mkdir /home/hadoop
创建临时文件夹
mkdir /home/hadoop/temp
创建NameNode目录
mkdir /home/hadoop/dfs
mkdir /home/hadoop/dfs/name
创建data目录
mkdir /home/hadoop/dfs/data1
mkdir /home/hadoop/dfs/data2
mkdir /home/hadoop/dfs/data3

修改hadoop配置

vim /usr/hadoop-2.6.0/etc/hadoop/hadoop-env.sh #打开Hadoop配置文件进行编辑

修改hadoop配置.png

vim /etc/profile #打开系统环境变量

在之前添加jdk的地方添加如下代码

export HADOOP_INSTALL=/usr/hadoop-2.6.0
export PATH=$HADOOP_INSTALL/bin:$$HADOOP_INSTALL/sbin:$PATH

注意图上第二行代码 PATH 后的 HADOOP_INSTALL 少了一个 P 请不要忘记打了

保存并退出,运行以下代码

source /etc/profile #重新加载环境变量
hadoop version #检测hadoop是否成功安装

依次修改 core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

  • core-site.xml

    vim /usr/hadoop-2.6.0/etc/hadoop/core-site.xml

将xml中configuration内容更改为以下内容

<property>
<name>fs.defaultFS</name>
<value>hdfs://masterNode1:9000</value>
<description>指定namenode的hdfs协议的文件系统通信地址,,masterNode1为主机名,也可以指定为一个namenode服务(这个服务内部可以有多台namenode实现ha的namenode服务)</description>
</property>
<property>
    <name>io.file.buffer.size</name>
    <value>65536</value>
<description>读写缓存大小设定,该属性值单位为KB,65536KB即为64M</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
    <value>/home/hadoop/tmp/</value>
    <description>临时文件路径,默认为/tmp,在虚拟机中必须指定这一项为其他目录,否则随着虚拟机的重启,/tmp目录会自动消失</description>
</property>
  • hdfs-site.xml

    vim /usr/hadoop-2.6.0/etc/hadoop/hdfs-site.xml

将xml中configuration内容改为以下代码

<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/dfs/name</value>
<description>hdfs元数据存存储目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/dfs/data1,/home/hadoop/dfs/data2,/home/hadoop/dfs/data3</value>
<description>DataNode在本地文件系统中存放块的路径,如果是多个路径,请用逗号隔开,会自动选用多个目录进行数据存储,生产环境中每一个路径应该对应一个磁盘的挂载点</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>备份数量,默认备份数2,伪分布式则将其配置成1</description>
</property>
<property>
<name>dfs.blocksize</name>
<value>33554432</value>
<description>设置大文件系统HDFS块,,默认值为64M</description>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
<description>NameNode服务器线程数,用于处理来自DataNodes的RPC</description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<description>是否开通HDFS的Web接口,默认端口是50070</description>
</property>
  • mapred-site.xml
    不知道为什么这个 2.6 里面没有mapred-site.xml 反而有一个 mapred-site.xml.template

那么我们运行下面代码

cp /usr/hadoop-2.6.0/etc/hadoop/mapred-site.xml.template /usr/hadoop-2.6.0/etc/hadoop/mapred-site.xml

然后

vim /usr/hadoop-2.6.0/etc/hadoop/mapred-site.xml

将xml中configuration内容更改为以下内容

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>执行框架设置为Hadoop的YARN</description>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
<description>对maps的资源限制,单位mb</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx819M</value>
<description>maps中对jvm child设置堆大小</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
<description>设置 reduces的资源限制,单位mb</description>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1638M</value>
<description>reduces对 jvm child设置的堆大小</description>
</property>
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>256</value>
<description>更高的内存限制,而对数据进行排序的效率,单位mb</description>
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>50</value>
<description>在文件排序中更多的流合并为一次</description>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>50</value>
<description>通过reduces从很多的map中读取较多的平行副本</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>masterNode1:10020</value>
<description>历史作业记录服务器的IP和端口号,请填写集群的yarn主机的访问地址</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>masterNode1:19888</value>
<description>历史作业记录的UI显示IP和端口号,请填写集群的yarn主机的访问地址</description>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
<description>历史作业记录在HDFS中的存放位置</description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
<description>已完成历史作业记录在HDFS中的存放位置</description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
<description>未完成历史作业记录在HDFS中的存放位置</description>
</property>
  • yarn-site.xml

    vim /usr/hadoop-2.6.0/etc/hadoop/yarn-site.xml

将xml中configuration内容更改为以下内容

<property>
<name>yarn.resourcemanager.hostname</name>
<value>masterNode1</value>
<description>设置ResourceManager,也就是yarn主机的地址</description>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>masterNode1:8032</value>
<description>Yarn总管理器IPC通讯地址,客户端通过该地址向RM提交应用程序,杀死应用程序等,默认值是设置的hostName:8032</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>masterNode1:8030</value>
<description>yarn总管理器调度程序的IPC通讯地址,通过该地址向RM申请资源、释放资源,默认值是设置的hostName:8030</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>masterNode1:8031</value>
<description>NodeManager通过该地址向RM汇报心跳,领取任务等。默认值是设置的hostName:8031</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>masterNode1:8033</value>
<description>管理员通过该地址向RM发送管理命令等。默认值是设置的hostName:8033</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>masterNode1:8088</value>
<description>用户可通过该地址在浏览器中查看集群各类信息,默认值是设置的hostName:8088</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>NodeManager上运行的附属服务。需配置成mapreduce_shuffle才可运行MapReduce程序</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>启用的资源调度器主类</description>
</property>
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>是否强制检查虚拟内存的使用配额,如果内存不够的时候系统就会使用swap空间内存,而hadoop会强制检查使用的虚拟内存的数额,如果使用的虚拟内存的数量大于真实内存的2.1倍,会自动杀死相关字进程。</description>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
<description>表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。推荐在slaveNode中将这个数值设定为1</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>3</value>
<description>单个任务可申请的最多虚拟CPU个数,默认是32。</description>
</property>

修改slaves文件

Slaves的配置只在NameNode上生效,由它告诉主机有哪些dataNode节点,只有记录在其中的机器提交数据才会被接收,其他会被拒绝。
本项在 masterNode1 中修改其他主机无需修改

vim /usr/hadoop-2.6.0/etc/hadoop/slaves

添加以下内容

masterNode1
slaveNode1
slaveNode2

退出并保存

格式化NameNode

运行如下代码

cd /usr/hadoop-2.6.0 #首先进入到hadoop安装目录
hadoop namenode -format #格式化NameNode

出现以下结果则为格式化成功

格式化namenode.png

修改hosts

修改hosts 将名称 masterNode1、slaveNode1、slaveNode2 分别指向ip

vim /etc/hosts

我修改完之后如下图,每个人每台机子的ip都可能不一样请按照你的实际情况配置

修改hosts.png

设置免密登录

masterNode1 服务器上运行

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #创建免登录密钥
ssh-copy-id root@slaveNode1 #发送给slaveNode1
ssh-copy-id root@slaveNode2
ssh-copy-id root@masterNode1
ssh slaveNode1 #测试是否可以免密登录

若可以免密登录 至此免密设置成功

启动集群

最后启动集群即可,这里就不详细说了

/usr/hadoop-2.6.0/sbin/start-all.sh #启动集群
/usr/hadoop-2.6.0/sbin/stop-all.sh #停止集群

如果启动出现问题,请检查是否进行了上一步设置免密登录

额外命令

关闭防火墙

sudo ufw disable #ubuntu 
centos7
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止防火墙开机启动

疑难杂症

问:出现 localhost:mv:无法获取"/usr/hadoop-2.6.0/logs/hadoop-root-datanode-masterNode1.out"的文件状态(stat): 没有那个文件或目录

答:请检查hadoop目录下 slaves 配置中是否把 localhost 删除

问:出现 masterNode1 运行 start-all.sh 脚本 却没有启动 slaveNode 的程序

答:请立即检查 slaves 文件配置