hadoop集群部署(手动)
Hadoop部署流程:安装SSH->设置无密码访问->安装Java->添加JAVA_HOME环境变量->安装Hadoop->修改core-site.xml 和hdfs-site.xml配置文件->格式化NameNode->开启NameNode和DataNode守护进程
安装hadoop的依赖环境
Ubuntu18 一般带有java(可以用whereis javac和java -version查看java路径和版本)
若系统无自带java()
$ sudo apt-get install openjdk-8-jdk openjdk-8-jre
jdk-8的tar.gz压缩包的下载地址---(https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_openj9_8u242b08_openj9-0.18.1.tar.gz)
在.bashrc中加入下列
set java environment
JAVA_HOME=/home/hadoop/java
JRE_HOME=/home/hadoop/java/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
非单机式的hadoop都需要将ssh设置成免密码登陆
$ cd ~/.ssh #若没有该目录则运行一次 ssh localhost $ ssh-keygen -t rsa #会有提示,一直按回车键即可 $ cat ./id_rsa.pub >> ./authorized_keys #加入授权 $ chmod 600 ./authorized_keys #centos需要修改文件权限 $ chmod 700 ~/.ssh
国家互联网信息中心开源网址:https://mirrors.cnnic.cn
wget https ://mirrors.cnnic.cn/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
下载好hadoop的文件后
$ sudo tar -zxf hadoop-3.1.3.tar.gz -C /usr/local $ cd /usr/local $ sudo mv ./hadoop-3.1.3 ./hadoop $ sudo chown -R hadoop:hadoop ./hadoop
检查Hadoop是否可用以及Hadoop版本
$ cd /usr/local/hadoop/bin
$ ./hadoop version
若出现ERROR:JAVA_HOME is not set and could not be found.则是JAVA_HOME环境没有配置好。需要在环境变量中添加JAVA_HOME的路径
$ dpkg -L openjdk-8-jdk | grep '/bin/javac' # 该命令是除去路径末尾的'/bin/javac' $ vim ~/.bashrc # 在文件的末尾加入JAVA_HOME路径 $ Export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # 若没有运行第一条命令还需要在路径末尾加上/bin/javac
设置好后我们来检验一下是否设置正确:
$ echo $JAVA_HOME # 检验变量值 $ java -version $ $JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样,如下图所示:
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。
现在我们可以执行例子来感受下 Hadoop 的运行。
Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
$ cd /usr/local/hadoop $ mkdir ./input $ cp ./etc/hadoop/*.xml ./input $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+' $ cat ./output/*
首先在 Master 节点上完成准备工作,并关闭 Hadoop (/usr/local/hadoop/sbin/stop-dfs.sh),再进行后续集群配置。
为了便于区分,可以修改各个节点的主机名(在终端标题、命令行中可以看到主机名,以便区分)。在 Ubuntu/CentOS 7 中,我们在 Master 节点上执行如下命令修改主机名(即改为 Master,注意是区分大小写的):
$ sudo vim /etc/hostname
如果是用 CentOS 6.x 系统,则是修改 /etc/sysconfig/network 文件,改为 HOSTNAME=Master
CentOS中hostname设置
然后执行如下命令修改自己所用节点的IP映射:
$ sudo vim /etc/hosts
例如本教程使用两个节点的名称与对应的 IP 关系如下:
10.0.71.166 Master
10.0.71.167 Slave1
10.0.71.168 Slave2
我们在 /etc/hosts 中将该映射关系填写上去即可,如下图所示(一般该文件中只有一个 127.0.0.1,其对应名为 localhost,如果有多余的应删除,特别是不能有 “127.0.0.1 Master” 这样的记录):
修改完成后需要重启一下,重启后在终端中才会看到机器名的变化。后面的操作要注意区分 Master 节点与 Slave 节点的操作。
配置好后需要在各个节点上执行如下命令,测试是否相互 ping 得通,如果 ping 不通,后面就无法顺利配置成功:
$ ping Master -c 3 # 只ping 3次,否则要按 Ctrl+c 中断 $ ping Slave1 -c 3
例如我在 Master 节点上 ping Slave1,ping 通的话会显示 time
继续下一步配置前,请先完成所有节点的网络配置,修改过主机名的话需重启才能生效。
SSH无密码登陆节点
这个操作是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上。
首先生成 Master 节点的公匙,在 Master 节点的终端中执行(由于修改过主机名,所以还需要删掉原有的再重新生成一次):
$ rm ./id_rsa* # 删除之前生成的公匙(如果有) $ ssh-keygen -t rsa # 一直按回车就可以 $ cat ./id_rsa.pub >> ./authorized_keys
完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:
$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。执行 scp 时会要求输入 Slave1 上 hadoop 用户的密码(hadoop)
通过scp向远程主机拷贝文件
接着在 Slave1 节点上,将 ssh 公匙加入授权:
$ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略 $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_rsa.pub # 用完就可以删掉了
其他 Slave 节点,也要执行将 Master 公匙传输到 Slave 节点、在 Slave 节点上加入授权这两步。
这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了,可在 Master 节点上执行ssh连接测试下
如果配置完密钥后还是需要密码才能连接,则需要给.ssh目录和authorized_keys文件加权限:
$ sudo chmod 700 ~/.ssh
$ sudo chmod 600 ~/.ssh/authorized_keys
集群/分布式环境配置文件
集群/分布式模式需要修改hadoop目录下etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项:slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。
1, 文件workers(hadoop旧版本后是 slaves),将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用时就删掉,每行添加一个Slave节点机名称。
2, 文件 core-site.xml 改为下面的配置:
<configuration> <property> <name>fs.defaultFSname> <value>hdfs://Master:9000value> property> <property> <name>hadoop.tmp.dirname> <value>file:/home/hadoop/hadoop/tmpvalue> <description>Abase for other temporary directories.description> property> configuration>
3, 文件 hdfs-site.xml,dfs.replication 一般设为 3(冗余副本数),但我们只有一个 Slave 节点,所以 dfs.replication 的值还是设为 1:
<configuration> <property> <name>dfs.namenode.secondary.http-addressname> <value>Master:9868value> property> <property> <name>dfs.replicationname> <value>2value> property> <property> <name>dfs.namenode.name.dirname> <value>file:/home/hadoop/hadoop/tmp/dfs/namevalue> property> <property> <name>dfs.datanode.data.dirname> <value>file:/home/hadoop/hadoop/tmp/dfs/datavalue> property> configuration>
4, 文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:
<configuration> <property> <name>mapreduce.framework.namename> <value>yarnvalue> property> <property> <name>mapreduce.jobhistory.addressname> <value>Master:10020value> property> <property> <name>mapreduce.jobhistory.webapp.addressname> <value>Master:19888value> property> <property> <name>yarn.app.mapreduce.am.envname> <value>HADOOP_MAPRED_HOME=$HADOOP_HOMEvalue> property> <property> <name>mapreduce.map.envname> <value>HADOOP_MAPRED_HOME=$HADOOP_HOMEvalue> property> <property> <name>mapreduce.reduce.envname> <value>HADOOP_MAPRED_HOME=$HADOOP_HOMEvalue> property> configuration>
5, 文件 yarn-site.xml:
<configuration> <property> <name>yarn.resourcemanger.hostnamename> <value>Mastervalue> property> <property> <name>yarn.nodemanager.aux-servicesname> <value>mapreduce_shufflevalue> property> configuration>
如果集群内可以ping通但telnet端口不通则需要检查下防火墙配置,纯局域网的集群可以先关闭防火墙
centOS 6 $ sudo service iptables stop # 关闭防火墙服务 $ sudo chkconfig iptables off # 禁止防火墙开机自启,就不用手动关闭了 centOS7 $ sudo systemctl stop firewalld.service # 关闭firewall
$ sudo systemctl disable firewalld.service # 禁止firewall开机启动
ssh非默认22端口则需要修改./hadoop/etc/hadoop/hadoop.env.sh中HADOOP_SSH_OPTS值里加-p 端口号
export HADOOP_SSH_OPTS = { -p 55555 }
配置好后,将 Master 上的 Hadoop 文件夹复制到各个节点上。因为之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 Master 节点上执行:
$ sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件 $ sudo rm -r ./hadoop/logs/* # 删除日志文件
$ scp -r /home/hadoop/hadoop hadoop@Slave1:/home/hadoop
同样,执行将 hadoop文件夹传输到其他 Slave 节点上。
首次启动需要先在 Master 节点执行 NameNode 的格式化:
$ hdfs namenode -format # 首次运行需要执行初始化,之后不需要
接着可以启动 hadoop 了,启动需要在 Master 节点上进行:
$ start-dfs.sh $ start-yarn.sh $ mr-jobhistory-daemon.sh start historyserver
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,如下图所示:
在 Slave 节点可以看到 DataNode 和 NodeManager 进程,如下图所示:
缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。例如我这边一共有3 个Datanodes:
也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://master:9870/。如果不成功,可以通过启动日志排查原因。
执行测试MapReduce实例
执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:
$ hdfs dfs -mkdir -p /user/hadoop
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
$ hdfs dfs -mkdir input
$ hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
可以通过web页面查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:
接着就可以运行 MapReduce 作业了:
$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
运行时的输出信息与伪分布式类似,会显示 Job 的进度。
如果是在虚拟机上做的集群部署实验,可能会有点慢,但如果迟迟没有进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过调优 YARN 的内存配置解决。
同样可以通过 Web 界面查看任务进度 http://master:8088/cluster,在 Web 界面点击 “Tracking UI” 这一列的 History 连接,可以看到任务的运行信息
通过Web页面查看集群和MapReduce作业的信息
执行完毕后的输出结果:
MapReduce作业的输出结果
[hadoop@Master hadoop]$ hdfs dfs -cat output/*
如果执行过程中出现mapred-site.xml contains the below configuration:错误,按提示在mapred-site.xml中加入提示的配置信息
关闭 Hadoop 集群也是在 Master 节点上执行的:
$ stop-yarn.sh $ stop-dfs.sh $ mr-jobhistory-daemon.sh stop historyserver
此外,同伪分布式一样,也可以不启动 YARN做底层资源调配,但要记得改掉 mapred-site.xml 的文件名。
参考资料:http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/