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.defaultFS</name>
                <value>hdfs://Master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/home/hadoop/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:9868</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/home/hadoop/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>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
</configuration>

5, 文件 yarn-site.xml

<configuration>
        <property>
                <name>yarn.resourcemanger.hostname</name>
                <value>Master</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </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/

猜你喜欢

转载自www.cnblogs.com/abc987plm/p/12661486.html