一: 分布式的基础架构分析[重要]
集群架构模式:
主从架构(中心化):
主角色 master: 发号施令,负责任务的接受和分配
从角色 slave: 负责干活
主备架构:可以解决中心化存在的问题
主角色active : 正常工作
备角色standby : 观察主角色工作,并实时备份主角色数据,当主角色宕机后,立即上位.
去中心化模式 : 例如区块链
hadoop中的HDFS集群和Yarn集群都是主从模式架构.
二、HDFS的基础架构[重要]
HDFS的角色分配:
**NameNode:**是集群中的主角色或主节点,负责 DataNode的管理工作
**DataNode:**是集群中的从角色或从节点, 负责数据文件的读或写
SecondaryNameNode: 是集群中的辅助角色或辅助节点,负责帮助NameNode完成管理工作(负责元数据的合并工作).
NN
在开发中只有一个主服务,容易出现单点故障
,在主从架构中,一旦主服务不可用,整个服务都不可用使用
主备方式
解决单点故障运行多个NN,但是对外处理请求的只有一个
一般公司选择是一主一备方案
一个典型的HDFS集群中会有多个DataNode,但是活跃的NameNode只能有一个,如果集群资源不足,则需要扩展DataNode节点数量.如果元数据管理能力不足,则需要给namenode提升服务器性能.
HDFS是一个标准的主从架构
注意: 通常情况下, NameNode的服务器性能,要比DataNode高.(cpu和内存大)
三、HDFS集群环境部署[了解]
前期准备:
有三台服务器
验证服务器的网络畅通
可以进行ssh免密登录
关闭防火墙及selinux
安装jdk
时间同步
下载hadoop安装包:
官网下载的hadoop安装包不能直接使用,需要进行编译后才可以使用
但是我们自己下载编译的安装包会出现警告
由于官网给我们的是最大化编译,在linux windows 和 mac平台中都能够运行,但是在linux运行时,与windows和mac相关的代码会报警告,在windows 和mac运行时一样
为了解决警告问题我们对于安装包一般会从新编辑后再编译
我们已经给大家编译好了对应的安装包,直接使用即可.
集群规划
在公司中由大数据运维人员进行大数据环境安装
1-申请服务器 说明cpu核心数 内存大小,磁盘大小 服务器数量
2-编写部署文档,规划服务运行形式
3-文档审核后就开始部署服务器
node1: cpu 2*1 内存 4G 60Gnode2: cpu 1*1 内存 2G 60G
node3: cpu 1*1 内存 2G 60G
通过分析可知, node1服务器性能最好,可以作为主服务使用,将我们的主角色部署在node1上
但是,NameNode和SecondaryNameNode都是服务器内存消耗的大户,且SNN会将NN的元数据进行获取合并,所以建议放置在两台不同的服务上
最优方案是每个服务一台服务器
角色分配
node1: NameNode DataNode
node2: DataNode SecondaryNameNode
node3: DataNode
node4 : DataNode
node5 : DataNode
.....
hadoop用户创建,并配置免密登录
此处我们使用root用户权限进行环境部署,但是在企业开发中,会创建一个普通用户用户环境部署,而root用户负责将部署时需要的权限分配给普通用户
将hadoop安装包上传到/export/software目录下
将该安装包进行解压
cd /export/software tar -zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz -C ../server
- 创建一个软连接
cd /export/server ln -s hadoop-3.3.0/ hadoop
- 修改配置文件
先进入配置文件的文件目录
cd /export/server/hadoop/etc/hadoop/
workers: 配置从节点(DataNode)有哪些 hadoop-env.sh: 配置Hadoop的相关环境变量 core-site.xml: Hadoop核心配置文件 hdfs-site.xml: HDFS核心配置文件 yarn-site.xml: yarn核心配置文件 mapred-site.xml: mapreduce核心配置文件
打开workers文件(配置参会该集群工作的服务器有哪些)
vim workers # 将内部文件修改为如下内容 node1 node2 node3
打开hadoop-env.sh文件,配置hadoop的基础环境变量
vim hadoop-env.sh # 在文件末尾添加如下内容 export JAVA_HOME=/export/server/jdk # java安装目录 export HADOOP_HOME=/export/server/hadoop # hadoop安装目录 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop # hadoop配置文件目录 export HADOOP_LOG_DIR=$HADOOP_HOME/logs # hadoop日志文件目录 #文件最后添加 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
打开core-site.xml文件,配置hadoop的一些基础服务配置信息
xml文件时以成对标签的形式进行kv结构的修饰
标签内部的名称就是key值,两个标签中间的数据就是value
vim core-site.xml # 在文件末尾添加如下内容 # 在文件内部填入如下内容 <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> # 注意要卸载configuration的标签内部,多余的标签要删掉
打开hdfs-site.xml文件,配置hdfs的相关服务信息
# 在文件内部填入如下内容 <property> <name>dfs.datanode.data.dir.perm</name> <value>700</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/data/nn</value> </property> <property> <name>dfs.namenode.hosts</name> <value>node1,node2,node3</value> </property> <property> <name>dfs.blocksize</name> <value>268435456</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/dn</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>node2:9868</value> </property>
准备数据存储目录
# 进入root权限,创建目录
# node1
mkdir -p /data/nn
mkdir /data/dn
# node2, node3
mkdir -p /data/dn
将hadoop目录复制到node2和node3中
scp -r /export/server/hadoop node2:/export/server
scp -r /export/server/hadoop node3:/export/server
配置环境变量
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
注意:使用source /etc/profile进行激活
初始化NameNode
由于我们的NameNode在node1上,所以只在node1上执行该代码即可
可以理解为我们要存储元数据,先要构建一个元数据的结构文件,后续将数据不断的在该文件中增删改查.
hadoop namenode -format
启动服务
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh
警告不用在意,是告诉我们该目录之前没有,现在需要创建
服务启动后,可以使用jps查看服务进程
如果出现服务启动问题去日志文件中找答案
- cd到logs目录中
cd /export/server/hadoop/logs
- 找到故障服务的.log文件
- 使用grep进行筛选
# 通常我们筛选的都是error或者warning, 如果是info证明没有异常 cat hadoop-hadoop-datanode-node1.log | grep WARN
四、HDFS的服务启停[重要]
对整个hadoop服务的启动和关闭
会将hadoop中的hdfs,yarn服务都会启动
start-all.sh
stop-all.sh
一键启停hdfs集群
下方指令是针对于整个hdfs的启停.在node1中执行该命令, node2, node3中的服务都会被启动. 前提是免密登录
# 一键启动
start-dfs.sh
# 一键停止
stop-dfs.sh
单起单停
# 只能控制当前服务器中服务的启停
hdfs --daemon start|stop|status namenode|datanode|secondarynamenode
注意: 在开发中,一般我们的服务不会频繁启停,如果服务出现故障进行单起单停,否则影响面太广.
使用jps执行查看服务是否启动
使用浏览器访问服务,验证服务器是否启动
namenode所在服务器的ip地址:9870192.168.88.100:9870
五、HDFS的Shell操作(了解)
hdfs的完整路径:
hdfs://node1:8020/root/test
hdfs的文件结构和linux中基本一致 : 树状结构
hdfs中也划分目录和文件,目录只能存储子目录和文件, 文件只能存储数据
文件和数据的区别???
文件是用来存储数据的,磁盘中数据以文件的形式存储起来,方便后续查找使用,数据不一定以文件的形式展示.
hdfs的shell命令格式:
# 新写法
hdfs dfs -命令 [-选项] [参数]
# 老写法
hadoop fs -命令 [-选项] [参数]
注意: 在hdfs dfs - 之后或hadoop fs -之后和linux终端指令基本没有区别
hadoop中的shell命令
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum [-v] <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-concat <target path> <src path> <src path> ...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] [-s] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge [-immediate] [-fs <path>]]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] [-s <sleep interval>] <file>]
[-test -[defswrz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
Generic options supported are:
-conf <configuration file> specify an application configuration file
-D <property=value> define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port> specify a ResourceManager
-files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machines
The general command line syntax is:
command [genericOptions] [commandOptions]
注意: 与linux中使用方法基本相同的指令我们不过多讲解
例如:ls mkdir touch.....
ls指令查看hdfs中的文件目录信息
hdfs dfs -ls 路径 路径要从根路径指定
hadoop fs -ls 路径
hdfs的文件目录操作
hdfs dfs -mkdir /路径
hdfs dfs -touch /路径/文件
hdfs dfs -mv 原始路径 目标路径
hdfs dfs -cp 原始路径 目标路径
hdfs dfs -rm -r /路径
文件的上传和下载
put指令: 从linux 服务器本地上传到hdfs文件系统中
hdfs dfs -put 本地文件路径(写绝对路径) hdfs的路径
hdfs dfs -put /var/log/messages /
get命令: 从hdfs文件系统将文件下载到linux文件系统中
hdfs dfs -get hdfs的文件路径 本地文件路径
hdfs dfs -get /sparklog/local-1664869425770.lz4 /root
注意: 在hdfs中使用任何文件或目录,要使用绝对路径进行查找,在hdfs中 没有工作目录的概念,更没有相对路径的概念.
练习
在hdfs中创建文件夹:/itcast/itheima,如存在请删除
hdfs dfs -ls /
hdfs dfs -mkdir -p /itcast/itheima
上传/etc/hosts文件到hdfs的/itcast/itheima内
hdfs dfs -put /etc/hosts /itcast/itheima
查看hdfs中刚刚上传的文件内容
hdfs dfs -put /etc/hosts /itcast/itheima
向hdfs中上传的文件追加:itheima到最后一行
echo itheima > a.txt
hdfs dfs -appendToFile /root/a.txt /itcast/itheima/hosts
下载hdfs中上传的文件到本地任意目录
hdfs dfs -get /itcast/itheima/hosts /root
在hdfs中创建文件夹:/itcast/bigdata,将/itcast/itheima/hosts文件复制到/itcast/bigdata内
hdfs dfs -mkdir /itcast/bigdata
hdfs dfs -cp /itcast/itheima/hosts /itcast/bigdata
在hdfs中将/itcast/itheima/hosts文件重命名为/itcast/itheima/myhost
hdfs dfs -mv /itcast/itheima/hosts /itcast/itheima/myhosts
在hdfs中删除/itcast文件夹
hdfs dfs -rm -r /itcast
六、HDFS webUI的使用(掌握)
我们可以使用node1:9870打开hdfs的网页端,但是前提是必须配置windows系统下的主机映射,否则只能使用ip访问
192.168.88.100:9870
打开C:\Windows\System32\drivers\etc\hosts文件
在下方写入主机映射内容
192.168.88.100 node1 node1.itcast.cn 192.168.88.101 node2 node2.itcast.cn 192.168.88.102 node3 node3.itcast.cn
MAC电脑,使用mac电脑终端打开
sudo vim /etc/hosts
1-查看datanode状态
2-文件系统操作
数据存储说明