本文主要介绍了 Hadoop 的三种运行模式以及配置的方式。html
Hadoop 的运行模式分为三种:java
Standalone(本地模式/单机模式/local模式)node
该模式下没有任何守护进程,用户程序和 Hadoop 程序运行在同一个 Java 进程,使用的文件系统是本地文件系统而不是分布式文件系统,此模式下通常用于本地调试。web
Pseudo-Distributed(伪集群模式)shell
在单机上模拟集群模式,各守护进程运行在单独的 Java 进程当中,使用的文件系统是 HDFSapache
Fully-Distributed(集群模式)ubuntu
守护进程运行在集群上,使用的文件系统也是 HDFScentos
本次配置基于 Hadoop2.9.2,其中 Standalone 在 CentOS 7.2 系统下进行配置, Pseudo-Distributed 模式在 MacOS 10.14.4 上进行配置,Fully-Distributed 模式在腾讯云主机上进行配置,集群由两台云主机组成,分别运行 Ubuntu 14.04.1 和 CentOS 7.2 系统。bash
Java 7/8ssh
Hadoop 2.7.x to 2.x 支持 Java 7/8,其它 Hadoop 版本支持的 Java 版本请点击 🔗 进行查询
下载:
sudo yum install java-1.8.0-openjdk-devel //centos 安装 Java8,ubuntu 下须要用 apt-get 进行安装
复制代码
配置环境变量:
cd ~
vi .bash_profile
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
source .bash_profile
复制代码
ssh 和 rsync: 用 ssh
和 rsync
命令测试后发现 Centos 自己就有,因此无须进行安装。
Hadoop
sudo wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz
tar -zxvf hadoop-2.9.2.tar.gz
复制代码
这里的下载地址最好根据云主机所在的区域进行选择,若是是国内的云主机最好使用国内的镜像地址,这样下载会快不少。
下载解压以后的 Hadoop 默认就是 Standalone 模式,可直接运行 wordcount 进行测试
mkdir input //hadoop 的同级目录建立
cp hadoop-2.9.2/LICENSE.txt input/
hadoop-2.9.2/bin/hadoop jar hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //运行 wordcount
cat output/part-r-00000 //查看结果
复制代码
同时再开一个终端在做业运行的时候输入 jps 查看进程
能够看到 Standalone 模式下 Hadoop 只会启动 RunJar 进程来运行整个做业
修改 etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> <!--配置访问 nameNode 的 URI-->
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> <!--指定临时目录,MapReduce 和 HDFS 的许多路径配置依赖此路径-->
<value>/home/hadoop/tmp</value>
</property>
</configuration>
复制代码
修改 etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> <!--配置文件的副本数量-->
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value> <!--关闭防火墙-->
</property>
</configuration>
复制代码
配置免密登陆
ssh localhost 测试可否免密登陆(若是可以则跳过如下操做)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
复制代码
修改 etc/hadoop/hadoop-env.sh(若是提示找不到 JAVA_HOME)
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //上面配置的 JAVA_HOME 好像没起做用
复制代码
格式化 HDFS
bin/hdfs namenode -format
复制代码
启动 HDFS
sbin/start-dfs.sh
复制代码
启动后输入 jps 看到如下进程即成功,这个时候能够经过 http://localhost:50070/ 访问 NameNode
运行 wordcount
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
bin/hdfs dfs -mkdir /user/<username>/input
bin/hdfs dfs -put LICENSE.txt /user/<username>/input //建立文件夹并上传文件
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //运行 wordcount
bin/hdfs dfs -cat output/part-r-00000 //显示结果
复制代码
在另外一终端输入 jps 能够看到运行时的如下进程
依旧是用 RunJar 提交,只是读取和写入采用了 HDFS。
经过 YARN 执行 Job(可选配置,不过为了更接近真实集群仍是建议配置)
修改 etc/hadoop/mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vi etc/hadoop/mapred-site.xml
复制代码
增长如下内容
<configuration>
<property>
<name>mapreduce.framework.name</name> <!--代表运行在 YARN 上-->
<value>yarn</value>
</property>
</configuration>
复制代码
修改 etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name><!--设置resourcemanager的hostname-->
<value>localhost</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 获取数据的方式-->
<value>mapreduce_shuffle</value>
</property>
</configuration>
复制代码
启动 YARN
sbin/start-yarn.sh
复制代码
启动成功后能够经过 http://localhost:8088/ 访问 ResourceManager 节点,而且输入 jps 会显示如下进程
其中 ResourceManager 和 NodeManager 是属于 YARN 的进程。
重复 7
的操做,输入 jps 查询进程
能够看到新增长了 YarnChild 进程和 MRAppMaster 进程,之因此有两个 YarnChild 进程是由于输入文件夹中存在两个文本文件,这说明了 MapReduce 是经过建立多个进程并行计算的。
集群包括两个节点,节点名分别为 master 和 slave,master 和 slave 的节点配置过程基本一致,如下是配置过程(两个节点差别配置会进行注明,建议先配置好 master 节点的 Hadoop,而后用 scp 命令复制到 slave 节点进行修改。):
修改 /etc/hosts
152.136.76.12 master //腾讯云公网ip
94.191.43.137 slave
复制代码
免密登陆(⚠️两个节点的登陆名必须一致,这里都为 root)
master 节点配置本机免密登陆以及移动公钥到子节点
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
scp ~/.ssh/id_rsa.pub root@slave:~/
slave 节点配置 master 节点免密登陆
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
复制代码
修改 etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> <!--配置访问 nameNode 的 URI-->
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> <!--指定临时目录,MapReduce 和 HDFS 的许多路径配置依赖此路径-->
<value>/home/hadoop/tmp</value>
</property>
</configuration>
复制代码
修改 etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> <!--配置文件的副本数量-->
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value> <!--关闭防火墙-->
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave:50090</value> <!-- 指定secondarynamenode位置 -->
</property>
</configuration>
复制代码
修改 etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> <!--代表运行在 YARN 上-->
<value>yarn</value>
</property>
</configuration>
复制代码
修改 etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name><!--设置resourcemanager的hostname-->
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 获取数据的方式-->
<value>mapreduce_shuffle</value>
</property>
</configuration>
复制代码
修改 etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //master 和 slave 填入各自路径
export HADOOP_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs //能够本身选定
复制代码
修改 etc/hadoop/mapred-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
复制代码
修改 etc/hadoop/yarn-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
export YARN_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs
复制代码
修改 etc/hadoop/slaves
master
slave
复制代码
启动 HDFS 和 YARN
bin/hdfs namenode -format //首次运行时格式化
sbin/start-dfs.sh
sbin/start-yarn.sh
复制代码
在 master 和 slave 节点分别输入 jps 后有
运行 wordcount(与伪分布式中一致)
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
bin/hdfs dfs -mkdir /user/<username>/input
bin/hdfs dfs -put LICENSE.txt /user/<username>/input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output
bin/hdfs dfs -cat output/part-r-00000
复制代码
继续用 jps 查看两台主机的进程
能够看到集群模式中的进程与伪集群模式中的进程没有区别,惟一的区别在于进程在不一样的主机上运行。
这里主要记录配置过程当中遇到的一部分错误
Container exited with a non-zero exit code 1. Error file: prelaunch.err.
该错误是在腾讯云主机上配置的伪集群模式运行 wordcount 时出现的,尝试了网上的一些办法都没有解决。最后采用本身电脑配置再运行一遍成功,多是由于云主机的配置问题。
在 YARN 上运行 Java.net.ConnectException: Connection refused
多是防火墙的缘由,根据 🔗 中的提示解决
没法外网访问VM中的 Hadoop YARN 的8088端口
没法经过云主机 ip:8088 访问 YARN 的 Web 页面时,不妨经过 netstat -nlp | grep java
查看当前提供 web 服务的端口,若是 ip 是 127.0.0.1 证实存在问题,须要修改 hosts,具体过程见 🔗。
slave: bash: line 0: cd: /root/hadoop/hadoop-2.9.2: No such file or directory
配置集群模式时出现,主要缘由是手动配置 slave 时 Hadoop 存放路径与 master 不一致,只须要将 slave 的 Hadoop 放在与 master 的同一路径下便可解决。