Hadoop学习笔记(一)Hadoop集群
一、介绍
Hadoop集群有三种模式:
- 本地模式:即系统自身的文件系统。
- 伪分布式模式:即在一台机子上运行所有角色。
- 完全分布式模式:根据划分,不同机子拥有不同的角色来进行协同工作。
二、伪分布式搭建
建虚拟机
配置联网
查看当前网卡名称 (ip addr)
进入网络配置文件的目录(cd /etc/sysconfig/network-scripts) (ls)
编辑网络配置文件(vi ifcfg-ens33)
Code修改配置文件:
BOOTPROTO=static
ONBOOT=yes
添加:
IPADDR=本机IP
NETMASK=255.255.255.0
GATEWAY=NAT模式网关IP
DNS1=8.8.8.8再重新启动网络配置(service network restart)
测试网络是否畅通(本地PING 虚拟机IP,虚拟机ping外网)
更改主机名
Codevi /etc/hostname
将里面的内容替换为需要的主机名配置主机名(域名)映射文件,整个集群都写上去
Codevi /etc/hosts
新建:
127.0.0.1 localhost
192.168.xxx.xxx XXX安装JDK1.8,配置环境变量(Hadoop是JAVA开发)
解压Hadoop(这里使用hadoop-3.0)
修改Hadoop配置文件
- 修改 vi hadoop-env.sh 的JAVA环境变量为自己的
xmlexport JAVA_HOME=/home/hadoop/app/jdk1.8.0_131
- 修改 vi core-site.xml xml
<configuration>
<!-- hdfs://xxx其中hdfs是协议,xxx是核心主机,默认端口号9000 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://weekend01:9000</value>
</property>
<!-- 配置Hadoop的临时工作目录存放数据,默认/tmp/hadoop-${user.name} -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop-3.1.2/tmp/</value>
</property>
</configuration> - 修改 vi hdfs-site.xml xml
<configuration>
<!-- 指定HDFS副本的数量,默认是3份。副本数不要超过节点数量。这里只有一台机器所以写1 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration> - 修改 vi mapred-site.xmlxml
<configuration>
<!-- 指定mr运行时框架,这里指定在yarn上,默认是local在本地跑 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration> - 修改 vi yarn-site.xml xml
<configuration>
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>weekend01</value>
</property>
<!-- reduce获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
关闭防火墙(CentOS7如下)
shell关闭防火墙
systemctl stop firewalld.service
关闭防火墙随开机启动
systemctl disable firewalld.service
--------------------------------------------------------------------------
>sudo systemctl enable firewalld.service //"开机启动"启用
>sudo systemctl disable firewalld.service //"开机自启"禁用
>sudo systemctl start firewalld.service //启动防火墙
>sudo systemctl stop firewalld.service //停止防火墙
>sudo systemctl status firewalld.service //查看防火墙状态配置Hadoop环境变量
Codeexport JAVA_HOME=/home/hadoop/app/jdk1.8.0_131
export HADOOP_HOME=/home/hadoop/app/hadoop-3.1.2
export PATH=$PATH:$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin
更新配置
source /etc/profile启动Hadoop
初始化
Code首次启动Hadoop集群时,必须对其HDFS进行格式化。格式化本质上是进行一些清理和准备工作,因为此时的HDFS在物理上还是不存在的。格式化只能在主角色(NameNode)所在的机器上进行。
hdfs namenode -format启动
Codehdfs(namenode + datanode + secondarynamenode):
start-dfs.sh
yarn资源管理调度(resourcemanager + nodemanager):
start-yarn.sh
TIP:如果遇到Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).问题,搜索文章:在CentOS 7中配置免密码登录SSH时遇到错误
还有一个是启动所有进程(不推荐)
start-all.sh
关闭所有进程
stop-all.sh
查看进程
Code$> jps
显示5个进程:
2960 ResourceManager
3392 Jps
2550 DataNode
3079 NodeManager
2440 NameNode(仅仅是一个目录的功能)
2734 SecondaryNameNode
通过WEB-UI查看
Code角色 URL 说明
NameNode http://NN_host:port/ 默认端口是9870
ResourceManager http://RM_host:port/ 默认端口是8088
MapReduce Job History Server http://JHS_host:port/ 默认端口是19888
配置SSH
Code1)检查是否安装了ssh相关软件包(openssh-server + openssh-clients + openssh)
$yum list installed | grep ssh
2)检查是否启动了sshd进程
$>ps -Af | grep sshd
3)在client侧生成公私秘钥对。
$>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
4)生成~/.ssh文件夹,里面有id_rsa(私钥) + id_rsa.pub(公钥)
5)追加公钥到~/.ssh/authorized_keys文件中(文件名、位置固定)
$>cd ~/.ssh
$>cat id_rsa.pub >> authorized_keys
6)修改authorized_keys的权限为644.
$>chmod 644 authorized_keys
7)测试
$>ssh localhost
三、完全分布式搭建
将上述伪分布式机器克隆3台出来(其中01作为名称节点,02-04作为数据节点),记得设置文件夹共享(默认是关闭:设置,选项,文件夹共享,总是启用)
修改hostname和ip地址文件还有host映射
Code$sudo vi /etc/hostname # 修改主机名
$sudo vi /etc/hosts # 新增4台机子的IP以及对应的主机名
$sudo vi /etc/sysconfig/network-scripts/ifcfg-ensxxxx # IP文件目录
$service network restart # 重启网络服务重新配置SSH
Code1) 在s201机器上删除所有机器上的SSH文件
$ssh s203 rm -r /home/wbw/.ssh/*
$ssh s204 rm -r /home/wbw/.ssh/*
$ssh s205 rm -r /home/wbw/.ssh/*
$rm -r .ssh/*
2)s201机器生成密钥对,并通过SCP发送给其余机器(不用sudo)
$ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 追加公钥到authorized_keys
$cat id_rsa.pub >> authorized_keys
$chmod 644 authorized_keys
# 分发
$scp id_rsa.pub wbw@s201:/home/wbw/.ssh/authorized_keys
$scp id_rsa.pub wbw@s202:/home/wbw/.ssh/authorized_keys
$scp id_rsa.pub wbw@s203:/home/wbw/.ssh/authorized_keys
$scp id_rsa.pub wbw@s204:/home/wbw/.ssh/authorized_keys配置完全分布(目录为${hadoop_home}/etc/hadoop/)
core-site.xml(根据集群规划,S201为名称节点)
xml<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://s201/</value>
</property>
<!--- 配置新的本地目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/wbw/hadoop</value>
</property>
</configuration>hdfs-site.xml(因为这里有3个数据节点,所以副本改成3)
xml<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>mapred-site.xml(不变)
yarn-site.xml(根据集群规划,S201为resourcemanager)
xml<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>s201</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>slaves(workers)
Code清空里面的所有内容!根据集群规划,数据节点在s202,s203,s204上。然后添加:
s202
s203
s204hadoop-env.sh(Hadoop的JAVA环境,如果之前没有配的化,要记得设置)
将整个配置文件夹分发到其余机器对应的配置文件夹里
Codescp -r full wbw@s202:/soft/hadoop/etc/
scp -r full wbw@s203:/soft/hadoop/etc/
scp -r full wbw@s204:/soft/hadoop/etc/
!!!注意这里的full是我自己的文件夹,正常应该只有一个名为hadoop的文件夹!!!
剩余数据清理
CodeTIP:如果之前有用过Hadoop(比如这个是克隆来的,而克隆之前用过了。所以对一些文件进行清理后,重新初始化)
1)删除临时目录文件
进入主目录下的临时文件夹
$cd /tmp
删除hadoop的临时文件(用SSH操作其余机器)
$rm -rf hadoop-wbw
$ssh s202 rm -rf /tmp/hadoop-wbw
$ssh s203 rm -rf /tmp/hadoop-wbw
$ssh s204 rm -rf /tmp/hadoop-wbw
2)删除Hadoop日志文件
进入Hadoop安装目录下的logs文件夹
$cd /soft/hadoop/logs/
删除所有文件(用SSH操作其余机器)
$rm -rf *
$ssh s202 rm -rf /soft/hadoop/logs/*
$ssh s203 rm -rf /soft/hadoop/logs/*
$ssh s204 rm -rf /soft/hadoop/logs/*初始化文件系统并启动
Code$hadoop namenode -format
$start-all.sh
# 查看进程
$jps
s201:
2178 ResourceManager
1964 SecondaryNameNode
2478 Jps
1743 NameNode
s202:
1825 Jps
1699 NodeManager
1588 DataNode
s203:
1536 NodeManager
1425 DataNode
1650 Jps
s204:
1522 NodeManager
1411 DataNode
1636 Jps
发现启动成功!再次通过WEB-UI查看,发现确实启动成功!(注意关闭防火墙)
四、启动命令
4.1 批量启动节点
Hadoop的一些启动脚本里面执行的内容(如果启动失败,可以查看日志,即Hadoop安装目录下的logs文件夹):
$>start-all.sh //start-dfs.sh + start-yarn.sh |
4.2 单独启动节点
启动s201上的NameNode
Code[wbw@s201 /soft/hadoop/sbin]$hadoop-daemon.sh start namenode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
[wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
============= s201 : /soft/jdk/bin/jps ==============
5272 NameNode
5342 Jps
============= s202 : /soft/jdk/bin/jps ==============
2587 Jps
============= s203 : /soft/jdk/bin/jps ==============
2395 Jps
============= s204 : /soft/jdk/bin/jps ==============
2360 Jps在s201上启动所有DataNode
Code[wbw@s201 /soft/hadoop/sbin]$hadoop-daemons.sh start datanode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --workers --daemon start" instead.
[wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
============= s201 : /soft/jdk/bin/jps ==============
7019 NameNode
7246 Jps
============= s202 : /soft/jdk/bin/jps ==============
3837 Jps
3775 DataNode
============= s203 : /soft/jdk/bin/jps ==============
3494 Jps
3432 DataNode
============= s204 : /soft/jdk/bin/jps ==============
3459 Jps
3397 DataNode在s202上停止DataNode
Code[wbw@s201 /soft/hadoop/sbin]$ssh s202
Last login: Thu Feb 13 18:41:00 2020 from s201
[wbw@s202 /home/wbw]$hadoop-daemon.sh stop datanode
WARNING: Use of this script to stop HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon stop" instead.
[wbw@s202 /home/wbw]$exit
logout
Connection to s202 closed.
[wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
============= s201 : /soft/jdk/bin/jps ==============
7286 Jps
7019 NameNode
============= s202 : /soft/jdk/bin/jps ==============
3945 Jps
============= s203 : /soft/jdk/bin/jps ==============
3432 DataNode
3516 Jps
============= s204 : /soft/jdk/bin/jps ==============
3397 DataNode
3480 Jps
五、节点的服役与退役
在生产环境中,肯定会有新的节点加入,以及旧的节点退出。因此就需要进行一些设置。
5.1 前期准备
克隆一台虚拟机,模拟一个新的节点,这里选s204克隆到s205,然后对IP、主机名等信息进行设置。再到s201中更新hosts文件。但是,因为是克隆的,所以datanode并不纯净,因此需要进行清理操作。
进入Hadoop安装目录,清空logs目录下的所有日志文件
Code[wbw@s205 /soft/hadoop/logs]$rm -rf *
清空Hadoop临时文件目录
Code[wbw@s205 /home/wbw/hadoop]$rm -rf *
启动datandoe以及nodemanager
Code[wbw@s205 /home/wbw]$hadoop-daemon.sh start datanode
[wbw@s205 /home/wbw]$yarn-daemon.sh start nodemanager查看进程,发现运行正常
Code[wbw@s205 /home/wbw]$jps
1633 NodeManager
1332 DataNode
1726 Jps
5.2 添加新节点
创建/修改dfs.include文件(这里暂时称它为白名单,即要想连接上NameNode就必须在这个名单上)中包含新节点名称,该文件在nn的本地目录
Code[wbw@s201 /soft/hadoop/etc]$touch dfs.hosts
[wbw@s201 /soft/hadoop/etc]$vi dfs.hosts
添加如下内容:
s202
s203
s204
s205 //新节点在hdfs-site.xml文件中添加属性
xml<property>
<name>dfs.hosts</name>
<value>/soft/hadoop/etc/dfs.hosts</value>
</property>在yarn-site.xml文件中添加属性
xml<property>
<name>yarn.resourcemanager.nodes.include-path</name>
<value>/soft/hadoop/etc/dfs.hosts</value>
</property>在NameNode上刷新节点
Code$hdfs dfsadmin -refreshNodes
$yarn rmadmin -refreshNodes在slaves(workers)文件中添加新节点ip(主机名)【该文件仅仅是让Hadoop启动的时候,向这些主机发送DataNode启动命令】
Code[wbw@s201 /soft/hadoop/etc/hadoop]$vi workers
添加如下内容:
s202
s203
s204
s205单独启动新的节点中的datanode以及nodemanager(建议去新节点的机器上执行jps命令,查看进程状态。实验时,一开始新节点的nodemanager是启动的,但是添加完,在NameNode上刷新节点后,莫名停止了)
Code$hadoop-daemon.sh start datanode
$yarn-daemon.sh start nodemanager通过WEB-UI查看状态,发现s205添加成功(也可以通过命令$hdfs dfsadmin -report查看)
5.3 退役节点
添加退役节点的ip到黑名单,不要更新白名单。
Code[wbw@s201 /soft/hadoop/etc]$touch dfs.hosts.exclude
[wbw@s201 /soft/hadoop/etc]$vi dfs.hosts.exclude
添加如下内容:
s204配置hdfs-site.xml
xml<property>
<name>dfs.hosts.exclude</name>
<value>/soft/hadoop/etc/dfs.hosts.exclude</value>
</property>配置yarn-site.xml
xml<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/soft/hadoop/etc/dfs.hosts.exclude</value>
</property>刷新NameNode节点
Code$hdfs dfsadmin -refreshNodes
$yarn rmadmin -refreshNodes查看WEB-UI状态(也可以通过命令$hdfs dfsadmin -report查看)
- 绿勾消失了(状态为decommisstion in progress)
- 当所有的要退役的节点都报告为Decommissioned,数据转移工作已经完成。
从白名单删除节点,并刷新节点
Code$hdfs dfsadmin -refreshNodes
$yarn rmadmin -refreshNodes查看WEB-UI,确定退役成功。同时文件块也成功转移。
从slaves(workers)文件中删除退役节点
5.4 黑白名单
在新增和退役节点的时候,有一个黑白名单的设置。这里的黑白名单有一定的优先级:
include // dfs.hosts
exclude // dfs.hosts.include
include | exclude | Interpretation |
---|---|---|
No | No | 不能连接 |
No | Yes | 不能连接 |
Yes | No | 可以连接 |
Yes | Yes | 可以连接,将会退役状态 |
解释:Yes和No分别代表主机名是否存在于黑白名单中,以及DataNode能否连接到NameNode。
六、配置第二名称节点
修改hdfs-site.xml文件
<property> |
如果不配置这个属性,那么第二名称节点会和名称节点在一台主机上。
效果:
============= s201 : jps ============== |
七、Hadoop端口介绍
Hadoop 3 相对于Hadoop 2 在端口号上有一些改变:
分类 | 应用 | Haddop 2.x port | Haddop 3 port |
---|---|---|---|
NNPorts | Namenode | 8020 | 9820 |
NNPorts | NN HTTP UI | 50070 | 9870 |
NNPorts | NN HTTPS UI | 50470 | 9871 |
SNN ports | SNN HTTP | 50091 | 9869 |
SNN ports | SNN HTTP UI | 50090 | 9868 |
DN ports | DN IPC | 50020 | 9867 |
DN ports | DN | 50010 | 9866 |
DN ports | DN HTTP UI | 50075 | 9864 |
DN ports | Namenode | 50475 | 9865 |