使用Docker方式部署
参考链接:
http://kiwenlau.com/2016/06/12/160612-hadoop-cluster-docker-update/
VMware虚拟机搭建
最早接触的虚拟机就是VMware,先下载好Linux镜像,我用的CentOS7.3,安装好系统之后再下好各种基础软件压缩包,然后拷贝三份,这样一共四个节点,一个主节点,一个主备。
准备工作:
配置host,即/etc/hosts;
配置主节点到从节点ssh免密登录:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@slave1
……
安装Jdk,无须赘述。
基本流程:
1. 解压hadoop-2.2.0.tar.gz存放到某一目录下,我直接放到用户目录/home/hadoop/下了;
2. 修改解压后的目录中的文件夹etc/hadoop下的xml配置文件,包括hadoop-env.sh、mapred-site.xml、core-site.xml、hdfs-site.xml和yarn-site.xml;
- hadoop-env.sh:顾名思义,这是配置hadoop环境变量的;配置项是JAVA_HOME
- mapred-site.xml:配置mapreduce。
- core-site.xml:fs.deafaultFS,指定active name;
- hdfs-site.xml:配置hdfs。配置项有:dfs.nameservices-集群命名服务,自定义;dfs.ha.namenodes.${ns}-命名服务中namenode逻辑名称,自定义;
- yarn-site.xml:配置yarn。配置项有:yarn.resourcemanager.hostname
- slaves:从节点。
以上这些配置在主节点更改,更改完了再用scp指令同步到其他三个节点即可。
3. 格式化并启动HDFS;
操作均在hadoop部署目录下进行。
- 启动JournalNode:在各个JournalNode节点上,输入以下命令启动journalnode服务:sbin/hadoop-daemon.sh start journalnode
;
- 在[nn1]上,对其进行格式化:bin/hdfs namenode -format
,并启动:sbin/hadoop-daemon.sh start namenode
。
- 在[nn2]上,同步nn1的元数据信息:bin/hdfs namenode -bootstrapStandby
,并启动sbin/hadoop-daemon.sh start namenode
。
- 这时nn1和nn2均处理standby状态,将[nn1]切换为Active:bin/hdfs haadmin -transitionToActive nn1
。
- 在[nn1]上,启动所有datanodesbin/hadoop-daemons.sh start datanode
。
- 关闭hadoop集群,在[nn1]上,输入以下命令:sbin/stop-dfs.sh
。
4. YARN。
5. 集成Spark。
- 下载和hadoop对应的spark版本,解压。
- 更改配置文件conf目录下的spark-default.conf和spark-env.sh以及slaves:
spark-default.conf中配置项:spark.yarn.jar
spark-env.sh中配置项:
slaves配置项:与hadoop一样。
注意事项:
(1)使用Journal Node方式配置主备NameNode。为此,需要至少准备3个节点作为Journal Node,这三个节点可与其他服务,比如NodeManager共用节点,这也是为什么集群最少要四个节点的缘故。
(2)主备两个NameNode应位于不同机器上,这两台机器不要再部署其他服务,即它们分别独享一台机器。
(3)主备NameNode之间有两种切换方式:手动切换和自动切换,其中,自动切换是借助Zookeeper实现的,因此,需单独部署一个Zookeeper集群(通常为奇数个节点,至少3个)。这里是手动方式切换的。
(4)有时在nn1上启动datanode时会失败,发现从节点并没有运行datanode,这有可能是因为多次格式化导致主从节点的clusterID不同所致,根据hdfs-site.xml中配置的dfs.datanode.data.dir和dfs.datanode.name.dir路径,找到current/VERSION文件,将其中的clusterID改为一致即可。不要随意格式化,停止集群时sbin/stop-dfs.sh
,启动集群时sbin/start-dfs.sh
(5)可以像JAVA_HOME一样将HADOOP_HOME加入环境变量,这样每次输入指令就不用再跑到安装目录下了。
(6)spark-shell yarn-client时任务提交失败,报错如下:
ERROR spark.SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.
查看yarn界面也是显示FAILED,从application_id点进去查看更详细的报错信息,发现有句:
Diagnostics: Container pid=50908,containerID=container_1520878883647_0004_02_000001] is running beyond virtual memory limits. Current usage: 34.8 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.
更改yarn-site.xml配置:
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.5</value>
</property>
配置成2.5的虚存,但这只是权宜之计。
(7)运行Hadoop和Spark 的停止脚本stop-dfs.sh、stop-yarn.sh、stop-all.sh都无法停止进程,提示信息:
no org.apache.spark.deploy.worker.Worker to stop
、no namenode to stop
之类,再jps发现进程仍然没有 停止。
原因在停止脚本里,查看hadoop-daemon.sh
发现:# HADOOP_PID_DIR The pid files are stored. /tmp by default.
if [ "$HADOOP_PID_DIR" = "" ]; then
HADOOP_PID_DIR=/tmp
fi
也就是说不配置$HADOOP_PID_DIR这个环境变量的话默认去/tmp文件夹找,而这个文件夹系统会定期清理的。
同样查看spark-daemon.sh
发现:SPARK_PID_DIR The pid files are stored. /tmp by default.
同一个问题。
解决:在hadoop-env.sh/yarn-env.sh
中添加或更改该环境变量即可:
export HADOOP_PID_DIR=//home/hadoop/hadoop_tmp
同理在yarn-env.sh
和spark-env.sh
中同样添加环境变量。
参考资料:
http://www.nekomiao.me/2016/08/10/hadoop-without-datanode/
https://www.cnblogs.com/purstar/p/6293605.html
https://www.cnblogs.com/simplestupid/p/4693513.html