搭建分布式Hadoop的填坑纪录

1 每个节点ssh免密连接本机

	cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
	ssh-keygen -t rsa              # 会有提示,都按回车就可以
	cat id_rsa.pub >> authorized_keys  # 加入授权
	chmod 600 ./authorized_keys    # 修改文件权限

排错:

如果ssh链接服务器是出现:

	Agent admitted failure to sign using the key

解決方式 使用 ssh-add 指令将私钥 加进来 (根据个人的密匙命名不同更改 id_rsa)

	$ ssh-add   ~/.ssh/id_rsa 

再通过ssh 主机名 就可以实现无密码登录了。

2 每个节点配置hostname和hosts

	$sudo vim /etc/hostname

主节点仅留一行Master,从节点仅留一行Slaver$

	$sudo vim /etc/hosts

形式是:ip(空格)节点名称(MasterSlaver1Slaver2...)。就像
127.0.0.1 localhost localhost4 localhost4.localdomain4
::1 localhost localhost6 localhost6.localdomain6

	192.168.1.2  Master
	192.168.1.3  Slaver1

3 设置ssh能免密登录所有Slavers

注意:执行这一步前,要删除节点中原有的id_rsa和id_rsa.pub,再重新生成密钥对。

4 删除操作系统中预装的jdk

	$ rpm -qa | grep java #列出已经安装的jdk


	$ rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111-2.6.7.2.el7_2.x86_64 #删除全部,noarch文件可以不用删除

如果还没有删除,则用yum -y remove去删除他们。

5 安装准备好的jdk

5.1 配置环境变量(顺便把后续要装的软件的路径也一起搞定了)

vim ~/.bashrc

	export JAVA_HOME=/home/hadoop/opt/jdk1.8.0_101
	export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
	export HADOOP_HOME=/home/hadoop/opt/hadoop
	export HADOOP_INSTALL=$HADOOP_HOME
	export HADOOP_MAPRED_HOME=$HADOOP_HOME
	export HADOOP_COMMON_HOME=$HADOOP_HOME
	export HADOOP_HDFS_HOME=$HADOOP_HOME
	export YARN_HOME=$HADOOP_HOME
	export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
	export ZOOKEEPER_HOME=/home/hadoop/opt/zookeeper
	export HBASE_HOME=/home/hadoop/opt/hbase
	export ROCKETMQ_HOME=/home/hadoop/opt/RocketMQ/devenv
	export ROCKETMQ_CLASSPATH=$ROCKETMQ_HOME/lib
	export NAMESRV_ADDR='10.61.2.118:9876;10.61.2.119:9876'
	export MAVEN_HOME=/home/hadoop/opt/maven
	export SCALA_HOME=/home/hadoop/opt/scala
	export SPARK_HOME=/home/hadoop/opt/spark
	export PATH=$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$ROCKETMQ_HOME/bin:$MAVEN_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH

使变量设置生效

	$source ~/.bashrc    

5.2 测试

	java -version
	$JAVA_HOME/bin/java -version  # 与直接执行 java -version 一样
	Shell 命令

如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样。

6 在Master上安装Hadoop

6.1 环境变量

6.2 配置

修改/hadoop/etc/hadoop/中的配置文件。
注意,Master是只作为NameNode还是即作为NameNode又作为DataNode,需要考量。

集群/分布式模式需要修改 /home/hadoop/opt/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。

1, 文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。

本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加一行内容:Slave1。

2, 文件 core-site.xml 改为下面的配置:

	<configuration>
	        <property>
	                <name>fs.defaultFS</name>
	                <value>hdfs://Master:9000</value>
	        </property>
	        <property>
	                <name>hadoop.tmp.dir</name>
	                <value>file:/home/hadoop/opt/hadoop/tmp</value>
	                <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-address</name>
	                <value>Master:50090</value>
	        </property>
	        <property>
	                <name>dfs.replication</name>
	                <value>1</value>
	        </property>
	        <property>
	                <name>dfs.namenode.name.dir</name>
	                <value>file:/home/hadoop/opt/hadoop/tmp/dfs/name</value>
	        </property>
	        <property>
	                <name>dfs.datanode.data.dir</name>
	                <value>file:/home/hadoop/opt/hadoop/tmp/dfs/data</value>
	        </property>
	</configuration>

4, 文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:

	<configuration>
	        <property>
	                <name>mapreduce.framework.name</name>
	                <value>yarn</value>
	        </property>
	        <property>
	                <name>mapreduce.jobhistory.address</name>
	                <value>Master:10020</value>
	        </property>
	        <property>
	                <name>mapreduce.jobhistory.webapp.address</name>
	                <value>Master:19888</value>
	        </property>
	</configuration>

5, 文件 yarn-site.xml:

	<configuration>
	        <property>
	                <name>yarn.resourcemanager.hostname</name>
	                <value>Master</value>
	        </property>
	        <property>
	                <name>yarn.nodemanager.aux-services</name>
	                <value>mapreduce_shuffle</value>
	        </property>
	</configuration>

6.3 删除/hadoop/tmp/(如果有的话)和logs/

7 复制Master上的hadoop到所有Slavers的/home/hadoop/opt/

8 在Master上格式化NameNode

	$hdfs namenode -format       # 首次运行需要执行初始化,之后不需要

成功的话,会看到 "successfully formatted" 和 "Exitting with status 0" 的提示,若为 "Exitting with status 1" 则是出错。

9 关闭所有节点的防火墙

	$systemctl stop firewalld.service    # 关闭firewall
	$systemctl disable firewalld.service # 禁止firewall开机启动

10 在Master上启动hadoop

10.1 启动进程

	$start-dfs.sh
	$start-yarn.sh
	$mr-jobhistory-daemon.sh start historyserver

10.2 验证

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程。

缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。

在 Slave 节点可以看到 DataNode 和 NodeManager 进程。

10.3 排错

执行hadoop namenode -format出现了

Cannot create directory /usr/hadoop/tmp/hdfs/name/current

则有可能需要修改tmp的权限。

	$chown -R hadoop:hadoop ~/opt/hadoop/tmp

然后重启hadoop。

	$stop-yarn.sh
	$stop-dfs.sh
	$mr-jobhistory-daemon.sh stop historyserver

11 示例程序

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作。

执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:

	$hdfs dfs -mkdir -p /user/hadoop
	$hdfs dfs -mkdir input
	$hdfs dfs -put /home/hadoop/opt/hadoop/etc/hadoop/*.xml input

通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中。可以访问 Web 界面 http://localhost:50070/ 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

接着就可以运行 MapReduce 作业了:

	$hadoop jar  /home/hadoop/opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

运行时的输出信息与伪分布式类似,会显示 Job 的进度。

可能会有点慢,但如果迟迟没有进度,比如 5 分钟都没看到进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改 YARN 的内存配置解决。

同样可以通过 Web 界面查看任务进度 http://master:8088/cluster,在 Web 界面点击 "Tracking UI" 这一列的 History 连接,可以看到任务的运行信息。前提是你开启了YARN。

执行完后输出结果:

	$hdfs dfs -cat output/*

注意:按照上面的一系列操作,如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成 mapred-site.xml.template,需要用时改回来就行。否则在该配置文件存在,而未开启 YARN 的情况下,运行程序会提示 "Retrying connect to server: 0.0.0.0/0.0.0.0:8032" 的错误,这也是为何该配置文件初始文件名为 mapred-site.xml.template。

12 Web UI

12+1 参考文献

原文地址:https://www.cnblogs.com/d0main/p/7080845.html