前言:
💞💞大家好,书生♡,今天主要和大家分享一下大数据技术框架Hadoop的组成之一的hdfs,希望对大家有所帮助。感谢大家关注点赞。
💞💞前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
目录
1. 分布式的基础架构分析
大数据时代的到来,人们对数据的依赖性越来越大、上网产生的数据量急剧增加、信息量爆炸式增长。因此,只是通过增加计算机的硬盘容量处理数据难以达到要求,这样将所有的数据存储和处理在同一台计算机上便不可行了。此时通过增加计算机的横向容量,即增加计算机的数量,将数据分布在多台计算机上的Hadoop 分布式计算便诞生了。而HDFS是Hadoop 分布式计算的一个重要组成部分,分布式文件系统。
大数据体系中,分布式的调度一般分为两个部分:
- 去中心化管理
- 中心化管理
1.1 去中心化
去中心化就是服务期之前根据规则去协调。
例如区块链
1.2 中心化
中心化:有一个中心节点(服务器)来统筹其它服务器的工作,统一指挥,统一调派,避免混乱。
这种模式,也被称之为:一主多从模式,简称主从模式(Master And Slaves)
大数据框架,大多数的基础架构上,都是符合:中心化模式的。
这种模式,也被称之为:一主多从模式,简称主从模式(Master And Slaves)
主从架构(中心化):
- 主角色 master: 发号施令,负责任务的接受和分配
- 从角色 slave: 负责干活
主备架构:可以解决中心化存在的问题- 主角色active : 正常工作
- 备角色standby : 观察主角色工作,并实时备份主角色数据,当主角色宕机后,立即上位
我们是今天的内容HDFS就是中心化管理
2. HDFS的基础架构
因为我们的HDFS就是中心化:所以我们的HDFS其中也是主从结构,就是有一个中心节点(服务器),还有其他好几个从服务器去处理数据。
HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一
全称是:Hadoop Distributed File System(Hadoop分布式文件系统)
是Hadoop技术栈内提供的分布式数据存储解决方案
可以在多台服务器上构建存储集群,存储海量的数据
2.1 HDFS的角色分配
HDFS的角色分配:
NameNode:是集群中的主角色或主节点,负责 DataNode的管理工作DataNode:是集群中的从角色或从节点, 负责数据文件的读或写
SecondaryNameNode: 是集群中的辅助角色或辅助节点,负责帮助NameNode完成管理工作(负责元数据的合并工作).
NameNode:简称为NN
DataNode:简称为DN
SecondaryNameNode:简称为SNN
在开发中,我们的NN只有一个,就是只有一个主服务器,会有多个DN从服务器,以及一个SNN帮助NameNode完成管理工作(负责元数据的合并工作).。
在开发中我们可能会遇见主服务器宕机的时候,那么我们一般的处理方法是使用主备服务器,也就是会说我们会同时运行多个NN服务器,但是对外处理请求的只有一个,一旦这个坏了,另外一个马上连接。
HDFS是一个标准的主从架构
注意: 通常情况下, NameNode的服务器性能,要比DataNode高.(cpu和内存大)
3. HDFS集群环境部署
3.1 部署hadoop的前提条件
关于HDFS的环境部署,我们只需要了解就可以了。在公司中我们一般使用配置好的服务器。
前期准备:
- 有三台服务器
- 验证服务器的网络畅通
- 可以进行ssh免密登录
- 关闭防火墙及selinux
- 安装jdk
- 时间同步
关于这些准备,在我的上一个博客中详细的讲述了,大家可以去看看上一篇博客的内容。
HDFS集群环境部署
配置好环境以后,我们需要下载Hadoop的安装包:
Hadoop的下载网址:https://hadoop.apache.org/releases.html
Hadoop的下载网址:https://archive.apache.org/dist/hadoop/common/
3.2 安装部署
3.2.1 部署步骤
-
将hadoop安装包上传到/export/software目录下
-
将该安装包进行解压
cd /export/software
tar -zxvf 安装包名 -C ../server
3. 创建一个软连接
cd /export/server
ln -s hadoop-3.3.0/ hadoop
- 修改配置文件
4.1 先进入配置文件的文件目录:
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核心配置文件
4.2 打开workers文件(配置参会该集群工作的服务器有哪些)
vim workers
# 将内部文件修改为如下内容
node1
node2
node3
4.3 打开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
4.4 打开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的标签内部,多余的标签要删掉
4.5 打开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>
4.6 准备数据存储目录
# 进入root权限,创建目录
# node1
mkdir -p /data/nn
mkdir /data/dn
# node2, node3
mkdir -p /data/dn
4.7 将hadoop目录复制到node2和node3中
这个scp的代码在下面会给大家讲解,这里大家只要知道这个是复制文件的就可以。具体用法后面会讲。
scp -r /export/server/hadoop node2:/export/server
scp -r /export/server/hadoop node3:/export/server
4.8 配置环境变量
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
注意:使用source /etc/profile进行激活
3.2.2 初始化NameNode
由于我们的NameNode在node1上,所以只在node1上执行该代码即可
可以理解为我们要存储元数据,先要构建一个元数据的结构文件,后续将数据不断的在该文件中增删改查.
hadoop namenode -format
3.2.3 启动服务
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh
服务启动后,可以使用jps查看服务进程
jps
3.2.4 如果出现服务启动问题去日志文件中找答案
- cd到logs目录中
cd /export/server/hadoop/logs
- 找到故障服务的.log文件
- 使用grep进行筛选
# 通常我们筛选的都是error或者warning, 如果是info证明没有异常
cat hadoop-hadoop-datanode-node1.log | grep WARN
4. HDFS的服务启停
4.1 对整个hadoop服务的启动和关闭
会将hadoop中的hdfs,yarn服务都会启动
start-all.sh
stop-all.sh
4.2 一键启停hdfs集群
下方指令是针对于整个hdfs的启停.在node1中执行该命令, node2, node3中的服务都会被启动. 前提是免密登录
# 一键启动
start-dfs.sh
# 一键停止
stop-dfs.sh
4.3 单起单停
# 只能控制当前服务器中服务的启停
hdfs --daemon start|stop|status namenode|datanode|secondarynamenode
使用浏览器访问服务,验证服务器是否启动
namenode所在服务器的ip地址:9870192.168.88.100:9870
5.HDFS的Shell操作
hdfs的文件结构和linux中基本一致 : 树状结构
hdfs中也划分目录和文件,目录只能存储子目录和文件, 文件只能存储数据
文件和数据的区别???
文件是用来存储数据的,磁盘中数据以文件的形式存储起来,方便后续查找使用,数据不一定以文件的形式展示.
hdfs的shell命令格式:
# 新写法
hdfs dfs -命令 [-选项] [参数]
# 老写法
hadoop fs -命令 [-选项] [参数]
注意: 在hdfs dfs - 之后或hadoop fs -之后和linux终端指令基本没有区别
关于hdfs的相关命令,我们可以通过命令才查看
hdfs dfs 查看hdfs有哪些命令
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]
5.1 ls指令查看hdfs中的文件目录信息
hdfs dfs -ls 路径 路径要从根路径指定
hadoop fs -ls 路径
5.2 hdfs的文件目录操作
- hdfs dfs -mkdir /路径
- hdfs dfs -touch /路径/文件
- hdfs dfs -mv 原始路径 目标路径
- hdfs dfs -cp 原始路径 目标路径
- hdfs dfs -rm -r /路径
hdfs dfs -mkdir -p /itcast/itheima
5.3 文件的上传和下载
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中 没有工作目录的概念,更没有相对路径的概念.
5.4 练习
在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
6.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
数据存储: