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。