[TOC]
一、安装前准备工作
1、使用软件包情况
软件包 | 版本 |
---|---|
centos(redhat也是类似) | 7.2 x64 |
hadoop | 2.8.4 |
VMware workstations pro | 12.0 |
jdk | 1.8 |
2、系统环境准备
(1)关闭防火墙以及selinux
这个操作不是必须的,只是为了防止在一开始的过程中,因为防火墙的配置原因以及selinux的限制导致一些不必要的困难而已。
首先关闭防火墙:
//关闭防火墙并禁止开机自启动
systemctl stop firewalld
systemctl disable firewalld
接着关闭selinux:
//查看selinux开启状态,enforcing 为开启
getenforce
//首先更改selinux配置文件,防止重启后自动开启selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
//接着修改当前系统的selinux开启状态,0表示禁用
setenforce 0
(2)配置IP以及主机名
虚拟机所在网段 192.168.50.0/24,网关为 192.168.50.2,处于NAT网络模式中。
配置虚拟为静态IP:192.168.50.121
//首先关闭 NetworkManager 这个网络服务,经常干扰到网络问题
[root@localhost software]# systemctl stop NetworkManager
[root@localhost software]# systemctl disable NetworkManager
//然后修改网卡配置文件
[root@localhost software]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=83b16941-ca72-46ad-85d4-c32929147098
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.50.121
GATEWAY=192.168.50.2
NETMASK=255.255.255.0
DNS1=192.168.50.2
//最后重启网络 network 服务
[root@localhost software]# systemctl restart network
//查看ip是否设置成功
[root@localhost software]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ea:b1:f7 brd ff:ff:ff:ff:ff:ff
inet 192.168.50.121/24 brd 192.168.50.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feea:b1f7/64 scope link
valid_lft forever preferred_lft forever
修改主机名为 bigdata121:
[root@localhost software]# hostnamectl set-hostname bigdata121
//该命令同时修改当前系统用户名,以及 /etc/hostname 配置文件中的配置
(3)安装jdk
众所周知,hadoop 是使用java开发的,那么它就必须使用jdk来运行。下面开始安装jdk
//创建两个文件夹用于存放压缩包以及解压程序,software放压缩包,modules解压
[root@localhost software]# mkdir /opt/{software,modules}
//解压jdk 到modules 目录下
[root@localhost software]# tar zxf jdk-8u144-linux-x64.tar.gz -C /opt/modules/
//检查下本地是否有安装了其他版本的jdk,一般centos默认自带openjdk,最好卸载掉
[root@localhost software]# rpm -qa | grep java
[root@localhost software]# rpm -e xxxx
//配置jdk PATH环境变量
[root@localhost software]# vim /etc/profile.d/java.sh
#!/bin/bash
export JAVA_HOME=/opt/modules/jdk1.8.0_144
export PATH=$PATH:${JAVA_HOME}/bin
//让新的环境变量生效
[root@bigdata121 opt]# source /etc/profile.d/java.sh
//检查环境变量是否配置成功,正确显示下面的信息即为成功
[root@bigdata121 opt]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
[root@bigdata121 opt]# javac -version
javac 1.8.0_144
二、安装并配置hadoop
1、安装hadoop程序
//上传hadoop压缩包到 software,并解压到 modules
[root@bigdata123 opt]# tar zxf software/hadoop-2.8.4.tar.gz -C /opt/modules/
//设置hadoop环境变量,将bin以及sbin目录加入环境变量
[root@bigdata121 hadoop-2.8.4]# vim /etc/profile.d/hadoop.sh
#!/bin/bash
export HADOOP_HOME=/opt/modules/hadoop-2.8.4
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
[root@bigdata121 hadoop-2.8.4]# source /etc/profile.d/hadoop.sh
//检查配置是否正确,打印以下信息表示OK
[root@bigdata121 hadoop-2.8.4]# hadoop version
Hadoop 2.8.4
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 17e75c2a11685af3e043aa5e604dc831e5b14674
Compiled by jdu on 2018-05-08T02:50Z
Compiled with protoc 2.5.0
From source with checksum b02a59bb17646783210e979bea443b0
This command was run using /opt/modules/hadoop-2.8.4/share/hadoop/common/hadoop-common-2.8.4.jar
2、hadoop组件中的成员
hadoop项目主要包含yarn、MapReduce、HDFS这三大组件,以及包含Common这个辅助工具包。
(1)yarn
用于作业调度与集群资源管理的框架,里面包含以下成员:
ResourceManager(rm):
处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度
NodeManager(nm):
单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令
ApplicationMaster:
数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。其实就是MapReduce任务的driver端程序运行的地方
Container:
对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。负责运行map或者reduce任务
(2)HDFS
一个分布式文件系统,适用于一次写入多次读取的场景。里面包含以下成员:
NameNode(nn):
存储文件的元数据,如文件名、文件目录结构,文件属性等,以及每个文件的块列表和块所在的DataNode等。以及响应客户端对hdfs的读写操作。还有保存读写日志
DataNode(dn):
在本地文件系统中存储文件块数据,以及块数据的校验和
SecondaryNameNode(snn):
用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照,相当于对NameNode进行备份。
3、hadoop的三种安装模式
有三种安装模式:本地模式、伪分布式模式,完全分布式模式
(1)本地模式
这种模式下是直接使用本地文件系统作为存储系统,没有HDFS,没有yarn,只能用于测试MR程序,MR程序直接从本地文件系统读取文件。
步骤:
/*配置/opt/modules/hadoop-2.8.4/etc/hadoop/hadoop-env.sh
修改这个主要是为了防止系统中JAVA_HOME这个环境变量没有设置,而且这里获取JAVA_HOME的时候是没有判断是否为空,所以最好手动指定一下。如果确定系统中配置了的话,就无需改动。*/
[root@bigdata121 hadoop]# vim hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
改为:
export JAVA_HOME=/opt/modules/jdk1.8.0_144
这个过程中无需启动hadoop的任何服务,因为只是使用MR框架而已。无需用到hdfs以及yarn。
使用wordcount实例测试:
[root@bigdata121 opt]# mkdir testdir
//创建字符统计的源数据文件。
[root@bigdata121 opt]# echo "i am wang , so you are wang too . i just jin tao king ." > testdir/name.txt
//运行wordcount,hadoop jar 目标jar包 主类名 输入文件 输出文件
[root@bigdata121 opt]# cd modules/hadoop-2.8.4/share/hadoop/mapreduce/
[root@bigdata121 mapreduce]# hadoop jar hadoop-mapreduce-examples-2.8.4.jar wordcount /opt/testdir/name.txt /opt/testdir/name.txt.output
//查看词频统计结果
[root@bigdata121 mapreduce]# cat /opt/testdir/name.txt.output/part-r-00000
, 1
. 2
am 1
are 1
i 2
jin 1
just 1
king 1
so 1
tao 1
too 1
wang 2
you 1
注意:如果同时启动了伪分布模式或者完全分布模式,本地模式就无法使用了,因为会默认到hdfs集群中寻找文件。而不是到本地文件系统中找文件。
(2)伪分布式模式
就是在一台机器上部署完整的hadoop环境,具备yarn,hdfs,mapreduce功能。
主要有以下几个组件和角色:
组件 | 包括角色 |
---|---|
HDFS | NameNode, SecondaryNameNode,DataNode |
YARN | ResourceManager,NodeManager |
需要修改的配置文件,在 $HADOOP_HOME/etc/hadoop/:
1>core-site.xml
<configuration>
<!--指定HDFS中namenode的地址以及端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata121:9000</value>
</property>
<!--指定hadoop中hdfs保存数据块和元数据块的目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.8.4/data/tmp</value>
</property>
</configuration>
2>hdfs-site.xml
<configuration>
<!--hdfs中数据的副本数,默认是3 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--指定secondarynameNode的http server地址,可通过访问该页面查看hdfs集群工作状态 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata121:50090</value>
</property>
<!--各个节点间的权限认证,可以通过密码或者秘钥验证。默认开启 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
3>yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!--指定reducer获取数据方式为shuffle机制-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定yarn的resourceManager的主机名为 bigdata121-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata121</value>
</property>
<!--启动日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--指定日志保留时间为7天,单位是秒-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
4>mapred-site.xml
<configuration>
<!--指定mr运行与yarn之上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--指定mr任务历史服务器的地址以及端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata121:10020</value>
</property>
<!--指定mr任务历史页面地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata121:19888</value>
</property>
</configuration>
修改完配置文件后,对NameNode 进行格式化,生成hdfs需要的环境:
[root@bigdata121 hadoop-2.8.4]# hdfs namenode -format
注意:不要重复格式化,否则后面会无法启动hdfs集群,如果需要重复格式化,请先手动删除原来的hdfs的文件目录
接着启动集群:
//启动hdfs相关的进程,如 nameNode,DataNode ,对应的是关闭是 stop-dfs.sh
[root@bigdata121 hadoop-2.8.4]# start-dfs.sh
//启动yarn,对应的是关闭是 stop-yarn.sh
[root@bigdata121 hadoop-2.8.4]# start-yarn.sh
也可以使用 start-all.sh 一起启动集群相关服务,但是该脚本已经弃用,不建议继续使用,建议使用上面的分部方式。
jps查看相关进程是否启动:
[root@bigdata121 sbin]# jps
15649 SecondaryNameNode
15493 DataNode
18278 Jps
15368 NameNode
15804 ResourceManager
15901 NodeManager
可以看到已经正常启动了
也可以使用web查看相关的管理页面:
http://bigdata121:8088 yarn管理页面
http://bigdata121:50070 HDFS管理页面
(3)完全分布式模式
在至少3台机器上部署完整的hadoop环境,具备yarn,hdfs,mapreduce功能。
在配置完全分布式之前,因为我们在启动每个进程时(datanode,namenode等这些进程),都需要手动输入启动进程所在的机器的用户密码。以及在关闭时,也是需要手动输入密码,这样过于繁琐。所以一般都会配置集群机器之间使用秘钥登录,这样就无需手动输入密码了。
首先准备3台机器,因为一般hdfs中默认都是3副本,所以最少DataNode为3台机器。可以使用上面的伪分布式虚拟机克隆出两台虚拟机即可。各台主机的ip,以及启动的hadoop的进程情况规划如下:
bigdata121 | bigdata122 | bigdata123 | |
---|---|---|---|
ip | 192.168.50.121/24 | 192.168.50.122/24 | 192.168.50.123/24 |
HDFS | NameNode, SecondaryNameNode | DataNode | DataNode |
YARN | ResourceName, | NodeManager | NodeManager |
1> 配置三台机器之间可以秘钥登录(包括自己登录自己),三台主机执行下面的命令:
//生成秘钥
[root@bigdata122 ~]# ssh-keygen
//将公钥复制到三台机器的USER_HOME/.ssh目录下
[root@bigdata122 ~]# ssh-copy-id bigdata121
[root@bigdata122 ~]# ssh-copy-id bigdata122
[root@bigdata122 ~]# ssh-copy-id bigdata123
2> 配置三台机器时间同步
因为处于同一集群中,需保证时间一致,否则容易出现问题,导致集群紊乱。使用ntp同步时间
//能够联网
[root@bigdata121 ~]# /usr/sbin/ntpdate cn.ntp.org.cn
//无法联网情况下,手动修改
[root@bigdata121 ~]# data -s "xxxx"
3>配置文件修改
主要配置文件和伪分布式模式中是一样,除了将副本数修改为2。另外还需修改以下文件。
etc/hadoop/slaves 主要用于指定 DataNode 的主机名(主机名和ip均可,但要保证能解析到主机名),如:
//加上 datanode ip或者主机名
[root@bigdata121 hadoop-2.8.4]# cat etc/hadoop/slaves
bigdata122
bigdata123
然后按按照伪分布式模式格式化即可
4>启动集群
启动只需在NameNode以及 ResourceManager所在的机器上启动即可。他们会分别取其他机器上启动对应的 dataNode以及NodeManager(其实就是用ssh类似的方式远程到其他主机上执行启动服务的脚本而已,这就是为啥要配置免密登录了)。
NameNode:
[root@bigdata121 hadoop-2.8.4]# start-dfs.sh
Starting namenodes on [bigdata121]
bigdata121: starting namenode, logging to /opt/modules/hadoop-2.8.4/logs/hadoop-root-namenode-bigdata121.out
bigdata123: starting datanode, logging to /opt/modules/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata123.out
bigdata122: starting datanode, logging to /opt/modules/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata122.out
Starting secondary namenodes [bigdata121]
bigdata121: starting secondarynamenode, logging to /opt/modules/hadoop-2.8.4/logs/hadoop-root-secondarynamenode-bigdata121.out
看日志就知道,分别到三台主机启动对应的进程服务
ResourceManager:
[root@bigdata121 hadoop-2.8.4]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/modules/hadoop-2.8.4/logs/yarn-root-resourcemanager-bigdata121.out
bigdata123: starting nodemanager, logging to /opt/modules/hadoop-2.8.4/logs/yarn-root-nodemanager-bigdata123.out
bigdata122: starting nodemanager, logging to /opt/modules/hadoop-2.8.4/logs/yarn-root-nodemanager-bigdata122.out
注意:NameNode以及 ResourceManager必须是所在的机器上启动,如果两者不是在同一台机器上的话,就必须分别到各自的机器单独启动。
5>配置过程中遇到的问题
常见问题是datanode中无法启动datanode进程。查看 HADOOP_HOME/logs/xxx.log 启动日志得知,是namenode和datanode的clusterID不同导致无法启动。这种情况一般出现在重复格式化的时候,导致clusterID不同。解决方法就是删掉namenode数据目录,然后重新格式化即可。
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/194249.html