当前位置: 首页 > news >正文

Hadoop入门学习笔记——三、使用HDFS文件系统

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7
课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd=5ay8

Hadoop入门学习笔记(汇总)

目录

  • 三、使用HDFS文件系统
    • 3.1. 使用命令操作HDFS文件系统
      • 3.1.1. HDFS文件系统基本信息
      • 3.1.2. HDFS文件系统的2套命令体系
      • 3.1.3. 创建文件夹
      • 3.1.4. 查看指定目录下的内容
      • 3.1.5. 上传文件到HDFS指定目录下
      • 3.1.6. 查看HDFS中文件的内容
      • 3.1.7. 从HDFS下载文件到本地
      • 3.1.8. 复制HDFS文件(在HDFS系统内复制)
      • 3.1.9. 追加数据到HDFS文件中
      • 3.1.10. 移动或重命名HDFS文件(在HDFS系统内移动)
      • 3.1.11. 删除HDFS文件
      • 3.1.12. 其他HDFS命令
    • 3.2. HDFS Web浏览
    • 3.3. HDFS系统权限
      • 3.3.1. 修改HDFS文件权限
      • 3.3.2. 修改HDFS文件所属用户和组
    • 3.4. 使用Jetbrians产品插件——Big Data Tools操作HDFS
      • 3.4.1. 安装Big Data Tools插件
      • 3.4.2. 安装Hadoop并配置环境变量
      • 3.4.3. 配置Big Data Tools插件
      • 3.4.4. 使用Big Data Tools插件
      • 3.4.5. 使用读取本地Hadoop配置文件的方式创建HDFS连接
    • 3.5. 使用NFS网关功能将HDFS挂载到Windows系统(Windows系统必须为专业版,否则无法挂载)
      • 3.5.1. 在HDFS端配置NFS
      • 3.5.2. 验证NFS是否正常
      • 3.5.3. 在Windows系统中挂载HDFS文件系统
    • 3.6. 修改HDFS数据块的副本数量
      • 3.6.1. HDFS副本块数量的配置
      • 3.6.2. 指定某一个文件的HDFS副本块个数
      • 3.6.3. 使用fsck命令检查文件的副本数量
      • 3.6.4. block配置
    • 3.7. NameNode元数据管理维护
    • 3.8. HDFS系统数据读写流程
      • 3.8.1. HDFS数据写入流程
      • 3.8.2. HDFS数据读取流程

三、使用HDFS文件系统

3.1. 使用命令操作HDFS文件系统

3.1.1. HDFS文件系统基本信息

  • HDFS和Linux系统一样,均是以/作为根目录的组织形式;
  • 如何区分HDFS和Linux文件系统:
    • Linux文件系统以file://作为协议头,HDFS文件系统以hdfs://namenode:port作为协议头;
    • 例如,有路径/usr/local/hello.txt,在Linux文件系统中表示为file:///usr/local/hello.txt,在HDFS文件系统中表示为hdfs://node1:8020/usr/local/hello.txt
    • 但一般情况下,协议头是可以省略的,使用Linux命令时,会自动识别为file://协议头,使用HDFS命令时,会自动识别为hdfs://namenode:port协议头;
    • 但如果需要再使用HDFS命令操作Linux文件时,需要明确使用file://协议头。

3.1.2. HDFS文件系统的2套命令体系

老版本
用法:hadoop fs [generic options]

新版本
用法:hdfs dfs [generic options]

两套命令用法完全一致,效果完全一样,但某些特殊命令需要选择hadoop或hdfs命令。

3.1.3. 创建文件夹

用法:
hadoop fs -mkdir [-p] <path> ...
hdfs dfs -mkdir [-p] <path> ...
path为待创建的目录
-p 选项意思与Linux的mkdir -p一样,自动逐层创建对应的目录。
例如:
hadoop fs -mkdir -p file:///home/hadoop/test 在Linux系统下创建/home/hadoop/test文件夹;
hadoop fs -mkdir -p hdfs://node1:8020/itheima/bigdata 在HDFS中创建/itheima/bigdata文件夹;
hdfs dfs -mkdir -p /home/hadoop/itcast 在HDFS中创建/home/hadoop/itcast文件夹;

3.1.4. 查看指定目录下的内容

用法:
hadoop fs -ls [-h] [-R] [<path> ...]
hdfs dfs -ls [-h] [-R] [<path> ...]
path为指定的目录路径
-h 人性化显示size
-R 递归查看指定目录及其子目录。
例如:
hdfs dfs -ls / 查看HDFS 根目录下的内容
hadoop fs -ls / 查看HDFS 根目录下的内容,与上面等效
hdfs dfs -ls -R / 递归查看HDFS根目录下的内容
hdfs dfs -ls file:/// 查看当前这台Linux机器根目录下的内容
hdfs dfs -ls -h / 查看HDFS根目录下的内容,当文件大小大于1k之后,其大小会有单位,便于人的阅读;

3.1.5. 上传文件到HDFS指定目录下

用法:
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>
-f 当目标文件已存在时,覆盖目标文件
-p 保留访问和修改时间,所有权和权限
localsrc 要上传的本地(Linux系统)文件的路径
dst 要保存在HDFS中的具体路径。
例如:
hadoop fs -put file:///home/hadoop/test.txt hdfs://node1:8020/ 将本地/home/hadoop/下的test.txt文件上传到HDFS的根目录下的完整写法;
hdfs dfs -put test2.txt / 将本地当前目录下的test2.txt文件上传到HDFS的根目录下;
hdfs dfs -put -f test2.txt / 将本地目录下的test2.txt文件上传到HDFS的根目录下,并强制覆盖原有的test2.txt文件;

3.1.6. 查看HDFS中文件的内容

用法:
hadoop fs -cat <src> ...
hdfs dfs -cat <src> ...
读取大文件时,可以使用管道符配合more
hadoop fs -cat <src> | more
hdfs dfs -cat <src> | more
例如:
hadoop fs -cat /test.txt 查看HDFS根目录下test.txt文件的内容
hdfs dfs -cat /test2.txt | more 查看HDFS根目录下的test2.txt文件的内容,可以翻页,适用于查看大文件

3.1.7. 从HDFS下载文件到本地

用法:
hadoop fs -get [-f] [-p] <src> ... <localdst>
hdfs dfs -get [-f] [-p] <src> ... <localdst>
-f 当目标文件已存在时,覆盖目标文件
-p 保留访问和修改时间,所有权和权限
src 要下载的HDFS文件路径
localdst 要保存在本地Linux系统中的路径。
例如:
hadoop fs -get /test.txt . 将HDFS根目录下的test.txt文件下载到本地Linux系统的当前目录下;
hadoop fs -get -f /test.txt . 将HDFS根目录下的test.txt文件下载到本地Linux系统的当前目录下,若本地已存在test.txt,则强制覆盖;
hdfs dfs -get /test2.txt . 将HDFS根目录下的test2.txt文件下载到本地的当前目录下;

3.1.8. 复制HDFS文件(在HDFS系统内复制)

用法:
hadoop fs -cp [-f] <src> ... <dst>
hdfs dfs -cp [-f] <src> ... <dst>
-f 若目标文件存在,则强制覆盖目标文件
src HDFS文件系统中被复制的文件路径
dst 要复制到的HDFS文件系统目标路径
例如:
hadoop fs -cp /test.txt /home/ 将HDFS根目录下的test.txt文件复制到HDFS文件系统/home/目录下
hadoop fs -cp /test.txt /home/abc.txt 将HDFS根目录下的test.txt文件复制到HDFS文件系统/home/目录下,并将其改名为abc.txt

3.1.9. 追加数据到HDFS文件中

用法:
hadoop fs -appendToFile <localsrc> ... <dst>
hdfs dfs -appendToFile <localsrc> ... <dst>
localsrc Linux系统的本地文件路径,要追加的内容放在这个文件里
dst HDFS文件系统中被追加的文件,如果文件不存在则创建该文件
在HDFS系统中想要修改文件,仅有两种方式:删除 或 追加
例如:
hadoop fs -appendToFile append.txt /test.txt 将Linux本地当前目录下的append.txt文件中的内容追加到HDFS系统根目录下test.txt文件中去

3.1.10. 移动或重命名HDFS文件(在HDFS系统内移动)

用法:
hadoop fs -mv <src> ... <dst>
hdfs dfs -mv <src> ... <dst>
src HDFS文件系统中的源文件
dst HDFS文件系统中的目标位置
例如:
hadoop fs -mv /test.txt /itheima 将HDFS系统根目录下的test.txt文件移动到HDFS系统/itheima/目录里
hdfs dfs -mv /test2.txt /itheima/abc.txt 将HDFS系统根目录下的test2.txt文件移动到HDFS系统/itheima/目录里,并将其改名为abc.txt

3.1.11. 删除HDFS文件

用法:
hadoop fs -rm [-r] [-skipTrash] URI [URI ...]
hdfs dfs -rm [-r] [-skipTrash] URI [URI ...]
-r 删除文件夹时需要此参数,删除文件时不用
-skipTrash 跳过回收站,直接删除(彻底删除)
回收站功能默认是关闭的,如果需要开启,需要修改core-site.xml配置文件。
例如:
hadoop fs -rm -r /home 删除HDFS系统中的/home文件夹
hdfs dfs -rm /itheima/test.txt 删除HDFS系统中/itheima目录下的test.txt文件

配置开启Hadoop的回收站
修改core-site.xml配置文件vim /export/server/hadoop/etc/hadoop/core-site.xml

<property><!--回收站保留的时间,1440的单位是分钟,代表着1天,超过这个时间之后,删除的文件就彻底删除了--><name>fs.trash.interval</name><value>1440</value>
</property><property><!--指垃圾回收的检查间隔,应该是小于或者等于fs.trash.interval,120分钟即每2小时检查一次,检查时发现如果有文件的删除时间大于上面的1440,就从回收站里面删掉,也就是彻底删除了--><name>fs.trash.checkpoint.interval</name><value>120</value>
</property>

无需重启集群,在哪个机器配置的,在哪个机器执行命令就生效。即如果只是在node1节点配置了,那只有在node1节点执行删除命令才有用,在其他节点执行是没用的!!!
回收站默认位置在:/user/用户名(hadoop)/.Trash

删除HDFS系统内的文件hadoop fs -rm /itheima/abc.txt会看到有如下提示

[hadoop@node1 ~]$ hadoop fs -rm  /itheima/abc.txt
2023-12-02 14:58:06,322 INFO fs.TrashPolicyDefault: Moved: 'hdfs://node1:8020/itheima/abc.txt' to trash at: hdfs://node1:8020/user/hadoop/.Trash/Current/itheima/abc.txt

可以看到,虽然输入的是rm命令,但实际上HDFS系统会将要删除的文件移动到hdfs://node1:8020/user/hadoop/.Trash/Current/目录下。
此时,可以使用 hadoop fs -ls -R /命令查看,当开启回收站后,HDFS系统会在根目录下默认创建/user/当前用户/Current的目录(当前用户为hadoop)
在这里插入图片描述
当然,也可以通过参数-skipTrash实现彻底删除,不让被删除的文件进入回收站
hadoop fs -rm -r -skipTrash /itheima 彻底删除(不进入回收站)HDFS根目录下的itheima文件夹,此命令执行效果如下:

[hadoop@node1 ~]$ hadoop fs -rm -r -skipTrash /itheima
Deleted /itheima

可以看到,和不开回收站时,执行rm命令的效果一样。

3.1.12. 其他HDFS命令

官方文档:https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
在这里插入图片描述

3.2. HDFS Web浏览

除了上述的命令方式外,还可以通过HDFS NameNode节点的Web页面操作文件系统,入口在http://node1:9870/中
在这里插入图片描述
在这里插入图片描述
在Web页面中可以查看,但是没法操作文件,因为HDFS系统的权限是给hadoop用户的,但是Web页面默认情况下其实是个匿名用户(dr.who)
在这里插入图片描述
当然,也可以让Web页面拥有权限,需要修改core-site.xml配置文件,增加如下配置:

<property><name>hadoop.http.staticuser.user</name><value>hadoop</value>
</property>

将Web页面的权限设置成hadoop用户。

但是,不推荐这样做:

  • HDFS WEBUI,只读权限挺好的,简单浏览即可
  • 如果给与高权限,会有很大的安全问题,造成数据泄露或丢失

3.3. HDFS系统权限

HDFS系统有自己独立的权限体系,但其权限类型与Linux一致,都是按照读(r)、写(w)、可执行(x)进行授权,权限分为三组,从左到右依次是所有者的权限、所有组的权限、其他用户权限。通过hadoop fs -lshdfs dfs -ls命令可以查看到HDFS系统内各文件和文件夹的权限。
在这里插入图片描述
但与Linux不同的是,在Linux系统中超级用户是root,但在HDFS系统中,超级用户是启动namenode的用户(本示例中就是hadoop用户),如果在HDFS系统中的文件时遇到Permission denied等权限不足的报错提醒时,首先要检查的就是当前用户是否为启动namenode的用户。

3.3.1. 修改HDFS文件权限

用法:
hadoop fs -chmod [-R] 777 <path>
hdfs dfs -chmod [-R] 777 <path>
例如:
hadoop fs -chmod 777 /test3.txt 将HDFS根目录下的test3.txt文件的权限修改成所有人可读、可写、可执行

[hadoop@node1 ~]$ hadoop fs -chmod 777 /test3.txt
[hadoop@node1 ~]$ hdfs dfs -ls /test3.txt
-rwxrwxrwx   3 hadoop supergroup  268037352 2023-12-05 10:48 /test3.txt

3.3.2. 修改HDFS文件所属用户和组

用法:
hadoop fs -chown [-R] hadoop:supergroup <path>
hdfs dfs -chown [-R] hadoop:supergroup <path>
例如:
hadoop fs -chown root:supergroup /test.txt 将HDFS根目录下的test.txt文件的所有者修改为root用户,所有组为supergroup。

[hadoop@node1 ~]$ hadoop fs -chown root:supergroup /test.txt
[hadoop@node1 ~]$ hdfs dfs -ls /test.txt
-rw-r--r--   3 root supergroup         44 2023-12-02 15:11 /test.txt

3.4. 使用Jetbrians产品插件——Big Data Tools操作HDFS

3.4.1. 安装Big Data Tools插件

在任意的Jetbrians产品(如IntelliJ IDEA、PyCharm等)中,打开Settings-Plugins,搜索、安装Big Data Tools;
在这里插入图片描述
安装完成后,根据提示,重启IDE即可;
在这里插入图片描述
重启IDE后,可在IDE的右侧看到Big Data Tools的工作Tab。
在这里插入图片描述

3.4.2. 安装Hadoop并配置环境变量

1、下载Hadoop(之前其实下载):https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
2、下载后,将其解压到本地(Windows系统)的任意路径(注意:直接解压到对应的路径,不要先解压再复制或移动,因为其里面部分文件夹的路径名长度超过了Windows系统的限制,如果复制或移动的话,可能会导致部分文件夹复制失败),如:D:\Software\Work\hadoop-3.3.4;
3、在“此电脑-属性-高级系统设置-环境变量”中,增加HADOOP_HOME环境变量,其值为D:\Software\Work\hadoop-3.3.4;
在这里插入图片描述
4、下载
hadoop.dll:https://github.com/steveloughran/winutils/blob/master/hadoop-3.0.0/bin/hadoop.dll
winutils.exe:https://github.com/steveloughran/winutils/blob/master/hadoop-3.0.0/bin/winutils.exe
5、将hadoop.dll和winutils.exe放入$HADOOP_HOME/bin目录中;

3.4.3. 配置Big Data Tools插件

1、打开Big Data Tools插件,新建一个HDFS链接;
在这里插入图片描述
2、Authentication Type选择为Explicit uri,File System URI修改为namenode的地址,Username修改为集群中启动HDFS的用户名,然后点击Test connection按钮,测试连通性,若显示Connected,则代表配置正确(前提是HDFS集群已启动);
在这里插入图片描述
若在测试连接时提示HADOOP_HOME环境变量未配置,但又确实已经配置了的情况下,可以尝试重启Windows系统解决。
在这里插入图片描述3、创建完毕后,可以看到与命令行一致的HDFS系统目录结构。在这里插入图片描述

3.4.4. 使用Big Data Tools插件

1、可以在HDFS上右键,通过New Directory…创建新目录;
在这里插入图片描述
2、可以在任意文件夹上右键,通过Upload from Disk…将本地的文件或文件夹上传至HDFS;
在这里插入图片描述
3、可以鼠标左键双击HDFS系统内的文件,直接打开HDFS系统里的文件进行查看;
在这里插入图片描述
4、可以在文件或文件夹上右键,选择Save To Disk… 将HDFS系统中的文件下载到本地;
在这里插入图片描述
5、还有其他一些删除、复制、重命名等功能,均可通过该插件进行图形化界面操作。

3.4.5. 使用读取本地Hadoop配置文件的方式创建HDFS连接

1、除了上述使用namenode的IP和端口号的方式,也可以使用读取本地的Hadoop配置创建HDFS连接;
2、前序步骤已将Hadoop安装包解压在了D:\Software\Work\hadoop-3.3.4目录,此时,需要从node1虚拟机中,将虚拟机的Hadoop的所有配置文件(即/export/server/hadoop-3.3.4/etc/hadoop目录下所有的配置文件)打包下载到本地,并用虚拟机上的Hadoop配置文件覆盖本地的所有配置文件;
3、使用虚拟机中的配置文件覆盖本地的配置文件后,需要注意配置文件中的node1在本地的hosts文件中是否配置正确的IP地址,或者直接将配置文件中的节点名称改成节点对应IP地址也可以;
4、在Big Data Tools插件中进行配置,选择HADOOP_HOME/etc/hadoop路径即可;
在这里插入图片描述

3.5. 使用NFS网关功能将HDFS挂载到Windows系统(Windows系统必须为专业版,否则无法挂载)

3.5.1. 在HDFS端配置NFS

1、在node1虚拟机中,使用命令cd /export/server/hadoop-3.3.4/etc/hadoop进入hadoop配置文件夹;
2、使用vim core-site.xml命令打开配置文件,并在其中追加如下内容:

  <property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value></property>

其中:
hadoop.proxyuser.hadoop.groups配置项的值为 *,表示允许hadoop用户代理任何其他用户组;
hadoop.proxyuser.hadoop.hosts配置型的值为 *,表示允许代理任意服务器的请求。
3、使用vim hdfs-site.xml命令打开配置文件,并在其中追加如下内容:

  <property><name>nfs.superuser</name><value>hadoop</value></property><property><name>nfs.dump.dir</name><value>/tmp/.hdfs-nfs</value></property><property><name>nfs.exports.allowed.hosts</name><value>192.168.88.1 rw</value></property>

其中:
nfs.superuser配置项的值为hadoop,表示NFS操作HDFS系统时,所使用的用户为hadoop(即超级用户);
nfs.dump.dir配置项的值为/tmp/.hdfs-nfs,表示NFS接收数据上传时使用的临时目录的路径;
nfs.exports.allowed.hosts配置项的值为192.168.88.1 rw,表示NFS允许连接的客户端的IP和权限,rw表示具有读和写的权限,IP部分也可以使用*表示所有IP均可连接(这里的192.168.88.1地址是本地电脑在虚拟机网络中的IP地址,如果这里不是虚拟机,而是真实服务器,则需要使用本机对应的公网IP或局域网IP),同时如果有多个电脑需要连接,也可以写成192.168.88.1 rw;10.0.3.5 rw;192.168.88.113 rw;的方式配置允许连接的客户端IP和权限;
4、将上述修改的两个配置文件分发到node2和node3节点

[hadoop@node1 hadoop]$ scp core-site.xml hdfs-site.xml node2:`pwd`/
core-site.xml                                                                       100% 1334     1.7MB/s   00:00
hdfs-site.xml                                                                       100% 1617     1.9MB/s   00:00
[hadoop@node1 hadoop]$ scp core-site.xml hdfs-site.xml node3:`pwd`/
core-site.xml                                                                       100% 1334     1.6MB/s   00:00
hdfs-site.xml                                                                       100% 1617     2.0MB/s   00:00

5、使用stop-dfs.sh停止HDFS集群(必须以hadoop用户身份);
6、停止虚拟机系统的NFS相关进程(必须以root用户身份

# 切换成root用户
su root
# 关闭CentOS系统的nfs服务
systemctl stop nfs
# 关闭NFS服务的开机自启动,后面用HDFS自带的nfs服务
systemctl disable nfs
# 卸载rpcbind服务,后面使用HDFS自带的rpcbind服务
yum remove -y rpcbind

7、以root用户身份,使用hdfs --daemon start portmap命令启动HDFS自带的rpcbind功能,可通过jps命令查看当前进程情况,可以看到已经有一个Portmap进程启动了;
在这里插入图片描述
8、以hadoop用户身份启动HDFS自带的NFS服务:

# 切换为hadoop用户
su - hadoop
# 启动HDFS自带的NFS服务
hdfs --daemon start nfs3

9、使用start-dfs.sh命令启动HDFS集群

3.5.2. 验证NFS是否正常

以下操作需要在node2或node3执行,因为node1刚才已经卸载了系统自带的rpcbind服务,缺少了必要的2个命令。
1、执行rpcinfo -p node1命令,如果看到有mountd和nfs出现,则代表正常情况;
在这里插入图片描述
2、执行showmount -e node1命令,看到/ 192.168.88.1,表示允许192.168.88.1这个IP连接到HDFS的根目录(/);
在这里插入图片描述

3.5.3. 在Windows系统中挂载HDFS文件系统

1、开启Windows的NFS功能:在控制面板-程序-启用或关闭Windows功能中,找到NFS服务,勾选上,点击确定,进行开启(此操作需要操作系统为专业版,若是家庭版则无法开启NFS功能);
在这里插入图片描述
2、在Windows命令提示符(CMD)内输入:net use X: \\192.168.88.101\!
在这里插入图片描述
上述命令中,X表示将HDFS文件系统挂在成本地的X盘,这里可以改成任何没有被占用的盘符;

3、上述命令执行成功后,打开资源管理器,可以看到已经挂载好的X盘,双击即可打开查看HDFS文件系统中的文件和文件夹,也可以进行文件的上传、下载 、复制、移动、查看文件内容等,但是无法修改文件内容;
在这里插入图片描述
4、在X盘上右键选择“断开连接”,可以卸载HDFS系统(相当于umount命令)。
在这里插入图片描述

3.6. 修改HDFS数据块的副本数量

3.6.1. HDFS副本块数量的配置

1、如果没有单独配置,在HDFS中一个数据块默认大小为256MB,一个数据块默认的副本数量为3;
2、可以通过在hdfs-site.xml文件中修改如下配置,修改HDFS数据块的默认副本数量:

  <property><name>dfs.replication</name><value>3</value></property>

dfs.replication属性用于配置数据块的默认副本数量,该配置默认为3。如果需要修改这个属性,需要在每一台服务器的hdfs-site.xml文件中进行修改;
3、修改完成后,需要重启集群,配置才能生效。

3.6.2. 指定某一个文件的HDFS副本块个数

1、除了配置文件外,可以在上传的时候,为当前要上传的文件临时指定副本块数量,该指定仅对当前要上传的文件起作用,命令如下:

# 将本地的test.txt文件上传到HDFS系统的/tmp/文件夹下,并设置test.txt文件上传后的数据块副本数量为2
hadoop fs -D dfs.replication=2 -put test.txt /tmp/

2、对已经存在于HDFS系统中的文件,修改hdfs-site.xml文件中的dfs.replication属性时,不会导致这些文件的副本数量变化,但可以通过命令来实现:

# 将HDFS系统中的path路径所示的文件或文件夹的副本数量修改为2(也可以改成别的数字)
hadoop fs -setrep [-R] 2 path

-R 表示对指定路径的子目录及其下属文件也生效
例如:

hadoop fs -setrep 1 /test_3.txt

3.6.3. 使用fsck命令检查文件的副本数量

我们可以使用fsck命令检查文件的副本数量,用法:

hdfs fsck path [-files [-blocks [-locations]]]

fsck可以检查指定路径是否正常;
-files 可以列出路径内的文件状态
-files -blocks 输出文件块报告(由几个块,由几个副本)
-files -blocks -locations 可以输出每一个block的详情
用法:

hdfs fsck /test.txt -files -blocks -locations

命令执行结果如下:
在这里插入图片描述

3.6.4. block配置

对于块(block),HDFS系统默认设置为256MB一个块,也就是1GB文件会被分为4个block存储。块大小也可以通过在hdfs-site.xml文件中修改如下配置进行修改:

  <property><name>dfs.blocksize</name><value>268435456</value></property>

dfs.blocksize配置项的单位是byte,上面写的268435456即是256MB(1MB=1024KB,1KB=1024byte)

3.7. NameNode元数据管理维护

NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。

  1. 每次对HDFS系统的操作,均被edits文件记录;
  2. edits达到大小上限后,会开启新的edits文件进行记录;
  3. 定期进行edits的合并操作:
    • 如果当前没有fsimage文件,则将全部的edits合并为第一个fsimage文件;
    • 如果当前已经存在fsimage文件,将全部的edits和已经存在的fsimage进行合并,形成新的fsimage文件;
  4. 重复上述1-3步骤。

在前面介绍Hadoop配置时,在hdfs-site.xml配置文件中,配置了dfs.namenode.name.dir属性,值为/data/nn,通过查看node1服务器的/data/nn下的current目录,可以看到当前集群的edits文件和fsimage文件:
在这里插入图片描述

元数据合并的控制参数

对于元数据的合并,是一个定时执行的过程,基于hdfs-site.xml配置文件中的:

  • dfs.namenode.checkpoint.period属性配置,默认为3600(单位:秒),即1小时执行一次合并;
  • dfs.namenode.checkpoint.txns属性配置,默认1000000(单位:次),即100万次事务执行一次合并;
    上述两个条件,只要有一个达到,就触发一次合并动作。
    检查是否达到条件,默认60秒回检查一次,若想修改这个检查间隔,可以通过修改:
  • dfs.namenode.checkpoint.check.period属性配置,默认60(单位:秒)

元数据合并的工作是由SecondaryNameNode进程负责,NameNode只负责记录流水账(edits文件):
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage文件),然后合并完成并提供给NameNode使用。
所以在启动HDFS集群时,必须要启动SecondaryNameNode,否则就没有程序去合并edits,导致的结果就是随着HDFS的运行,查询效率会越来越低。

3.8. HDFS系统数据读写流程

3.8.1. HDFS数据写入流程

在这里插入图片描述

  1. 客户端向NameNode发起请求;
  2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址;
  3. 客户端向指定的DataNode发送数据包;
  4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode;
  5. 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4;
  6. 写入完成客户端通知NameNode,NameNode做元数据记录工作。

关键信息点:

  • NameNode不负责数据写入,只负责元数据记录和权限审批;
  • 客户端直接向1台DataNode写数据,这个DataNode一般是 == 离客户端最近(网络距离) == 的那一个;
  • 数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)。

3.8.2. HDFS数据读取流程

在这里插入图片描述

  1. 客户端向NameNode申请读取某文件;
  2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表;
  3. 客户端拿到block列表后自行寻找DataNode读取即可。

关键信息点:

  • 数据同样不通过NameNode提供;
  • NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的,这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取。

相关文章:

Hadoop入门学习笔记——三、使用HDFS文件系统

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 三、使用HDFS文件系统3.1. 使用命令操作HDFS文件系统3.1.…...

JavaWeb—html, css, javascript, dom,xml, tomcatservlet

文章目录 快捷键HTML**常用特殊字符替代:****标题****超链接标签****无序列表、有序列表****无序列表**:ul/li 基本语法**有序列表ol/li:****图像标签(img)**** 表格(table)标签****表格标签-跨行跨列表格****form(表单)标签介绍****表单form提交注意事项**div 标签p 标签sp…...

LangChain 31 模块复用Prompt templates 提示词模板

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…...

深入理解 Git 分支管理:提升团队协作与开发效率

目录 前言1 什么是分支2 分支的好处2.1 并行开发的支持2.2 独立性与隔离性2.3 灵活的版本控制2.4 提高安全性和代码质量2.5 项目历史的清晰记录 3 Git 分支操作命令3.1 git branch -v3.2 git branch 分支名称3.3 git checkout 分支名称3.4 git merge 分支名称3.5 git rebase 分…...

WPF StackPanel

StackPanel是一个控件容器&#xff0c;它按照一个方向&#xff08;水平或垂直&#xff09;堆叠子元素&#xff0c;使得它们沿一个轴线对齐。你可以在StackPanel中放置其他控件&#xff0c;如按钮、标签、文本框、图片等等。这些控件的排列方式由StackPanel按照指定的方向自动确…...

由正规表达式构造DFA,以及DFA的相关化简

目录 1.由正规式到DFA 首先讲如何从正规式到NFA 如何从NFA到DFA 2.DFA的化简 3.DFA和NFA的区别 1.由正规式到DFA 正规式--->NFA---->DFA 首先讲如何从正规式到NFA 转换规则: 例题1&#xff1a;这里圆圈里面的命名是随意的&#xff0c;只要能区别开就可以了 如何…...

模式识别与机器学习(九):Adaboost

1.原理 AdaBoost是Adaptive Boosting&#xff08;自适应增强&#xff09;的缩写&#xff0c;它的自适应在于&#xff1a;被前一个基本分类器误分类的样本的权值会增大&#xff0c;而正确分类的样本的权值会减小&#xff0c;并再次用来训练下一个基本分类器。同时&#xff0c;在…...

【JAVA】分布式链路追踪技术概论

目录 1.概述 2.基于日志的实现 2.1.实现思想 2.2.sleuth 2.2.可视化 3.基于agent的实现 4.联系作者 1.概述 当采用分布式架构后&#xff0c;一次请求会在多个服务之间流转&#xff0c;组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题&#xff1a;…...

ZooKeeper 使用介绍和原理详解

目录 1. 介绍 重要性 应用场景 2. ZooKeeper 架构 服务角色 数据模型 工作原理 3. 安装和配置 下载 ZooKeeper 安装和配置 启动 ZooKeeper 验证和管理 停止和关闭 4. ZooKeeper 数据模型 数据结构和层次命名空间&#xff1a; 节点类型和 Watcher 机制&#xff…...

模式识别与机器学习(八):决策树

1.原理 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树状模…...

Pinely Round 3 (Div. 1 + Div. 2)(A~D)(有意思的题)

A - Distinct Buttons 题意&#xff1a; 思路&#xff1a;模拟从&#xff08;0,0&#xff09;到每个位置需要哪些操作&#xff0c;如果总共需要4种操作就输出NO。 // Problem: A. Distinct Buttons // Contest: Codeforces - Pinely Round 3 (Div. 1 Div. 2) // URL: https…...

在Linux下探索MinIO存储服务如何远程上传文件

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 创建Buckets和Access Keys二. Linux 安装Cpolar三. 创建连接MinIO服务公网地…...

持续集成交付CICD:Linux 部署 Jira 9.12.1

目录 一、实验 1.环境 2.K8S master节点部署Jira 3.Jira 初始化设置 4.Jira 使用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins slave &#xff08;从节点&#xff09; jira9.12.1…...

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况 1、查看进程 #jps 查看所有java进程 #top 查看cpu占用高进程 输入m &#xff1a;根据内存排序 topMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffers Swap: 0k total, 0k used, 0k free, 6…...

nginx安装letsencrypt证书

1.安装推荐安装letsencrypt证书的客户端工具 官方推荐通过cerbot客户端安装letsencrypt 官方推荐使用snap客户端安装cerbot客户端 apt install snapd snap install --classic certbot 建立certbot软链接&#xff1a;ln -s /snap/bin/certbot /usr/bin/certbot 2.开始安装letse…...

docker笔记1-安装与基础命令

docker的用途&#xff1a; 可以把应用程序代码及运行依赖环境打包成镜像&#xff0c;作为交付介质&#xff0c;在各种环境部署。可以将镜像&#xff08;image&#xff09;启动成容器&#xff08;container&#xff09;&#xff0c;并提供多容器的生命周期进行管理&#xff08;…...

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC&#xff0c;是Visual studio code的缩写&#xff0c;是由微软开发的跨平台的轻量级编辑器&#xff0c;支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…...

Opencv中的滤波器

一副图像通过滤波器得到另一张图像&#xff0c;其中滤波器又称为卷积核&#xff0c;滤波的过程称之为卷积。 这就是一个卷积的过程&#xff0c;通过一个卷积核得到另一张图片&#xff0c;明显发现新的到的图片边缘部分更加清晰了&#xff08;锐化&#xff09;。 上图就是一个卷…...

<JavaEE> 基于 TCP 的 Socket 通信模型

目录 一、认识相关API 1&#xff09;ServerSocket 2&#xff09;Socket 二、TCP字节流套接字通信模型概述 三、回显客户端-服务器 1&#xff09;服务器代码 2&#xff09;客户端代码 一、认识相关API 1&#xff09;ServerSocket ServerSocket 常用构造方法ServerSocke…...

[THUPC 2024 初赛] 二进制 (树状数组单点删除+单点查询)(双堆模拟set)

题解 题目本身不难想 首先注意到所有查询的序列长度都是小于logn级别的 我们可以枚举序列长度len&#xff0c;然后用类似滑动窗口的方法&#xff0c;一次性预处理出每种字串的所有出现位置&#xff0c;也就是开N个set去维护所有的位置。预处理会进行O(logn)轮&#xff0c;每…...

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…...

使用GBASE南大通用负载均衡连接池

若要使用负载均衡连接池功能&#xff0c;需要在连接串中配置相关的关键字。有关更详细的关键字信息在 GBASE南大通用 连接参数表‛中介绍。假设存在如下场景&#xff1a;  现有集群中存在 4 个节点&#xff1a; 192.168.9.173, 192.168.9.174, 192.168.9.175, 192.168.9.17…...

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火&#xff0c;大多数技术组件都是运行在JVM上的&#xff0c;Flink也是运行在JVM上&#xff0c;基于JVM的数据分析引擎都需要将大量的数据存储在内存中&#xff0c;这就不得不面临JVM的一些问题&#xff0c;比如Ja…...

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中&#xff0c;抽象出了23种设计模式&#xff0c;用以解决对象的创建、组合、使用三种场景。在并发编程中&#xff0c;针对线程的操作&#xff0c;也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…...

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例2 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非对称式密…...

simulinkveristandlabview联合仿真——模型导入搭建人机界面

目录 1.软件版本 2.搭建simulink仿真模型 编译错误 3.导入veristand并建立工程 4.veristand导入labview labview显示veristand工程数据 labview设置veristand工程数据 运行labview工程 1.软件版本 matlab2020a&#xff0c;veristand2020 R4&#xff0c;labview2020 SP…...

k8s中Helm工具实践

k8s中Helm工具实践 1&#xff09;安装redis-cluster 先搭建一个NFS的SC&#xff08;只需要SC&#xff0c;不需要pvc&#xff09;&#xff0c;具体步骤此文档不再提供&#xff0c;请参考前面相关章节。 下载redis-cluster的chart包 helm pull bitnami/redis-cluster --untar…...

推荐算法架构7:特征工程(吊打面试官,史上最全!)

系列文章&#xff0c;请多关注 推荐算法架构1&#xff1a;召回 推荐算法架构2&#xff1a;粗排 推荐算法架构3&#xff1a;精排 推荐算法架构4&#xff1a;重排 推荐算法架构5&#xff1a;全链路专项优化 推荐算法架构6&#xff1a;数据样本 推荐算法架构7&#xff1a;特…...

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…...

uniapp点击tabbar之前做判断

在UniApp中&#xff0c;可以通过监听 tabBar 的 click 事件来在点击 tabBar 前做判断。具体步骤如下&#xff1a; 在 pages.json 文件中配置 tabBar&#xff0c;例如&#xff1a; {"pages":[{"path":"pages/home/home","name":"h…...

DLLNotFoundException:xxx tolua... 错误打印

DLLNotFoundException:xxx tolua... 错误打印 一、DLLNotFoundException介绍二、Plugins文件夹文件目录结构如下&#xff1a; 三、Plugins中的Android文件夹四、Plugins中的IOS文件夹这里不说了没测试过不过原理应该也是选择对应的平台即可五、Plugins中的x86和X86_64文件夹 一…...

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…...

【投稿】北海 - Rust与面向对象(二)

模板方法 Rust提供了trait&#xff0c;类似于面向对象的接口&#xff0c;不同的是&#xff0c;将传统面向对象的虚函数表从对象中分离出来&#xff0c;trait仍然是一个函数表&#xff0c;只不过是独立的&#xff0c;它的参数self指针可以指向任何实现了该trait的结构。 从对象中…...

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…...

阿里云 ARMS 应用监控重磅支持 Java 21

作者&#xff1a;牧思 & 山猎 前言 今年的 9 月 19 日&#xff0c;作为最新的 LTS (Long Term Support) Java 版本&#xff0c;Java 21 正式 GA&#xff0c;带来了不少重量级的更新&#xff0c;详情请参考 The Arrival of Java 21 [ 1] 。虽然目前 Java 11 和 Java 17 都…...

C++ 类的析构函数和构造函数

构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。主要用来在创建对象时初始化对象即为对象成员变量赋初始值。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用…...

STM32——CAN协议

文章目录 一.CAN协议的基本特点1.1 特点1.2 电平标准1.3 基本的五个帧1.4 数据帧 二.数据帧解析2.1 帧起始和仲裁段2.2 控制段2.3 数据段和CRC段2.4 ACK段和帧结束 三.总线仲裁四.位时序五.STM32CAN控制器原理与配置5.1 STM32CAN控制器介绍5.2 CAN的模式5.3 CAN框图 六 手册寄存…...

数据结构-如何巧妙实现一个栈?逐步解析与代码示例

文章目录 引言1.栈的基本概念2.选择数组还是链表&#xff1f;3. 定义栈结构4.初始化栈5.压栈操作6.弹栈操作7.查看栈顶和判断栈空9.销毁栈操作10.测试并且打印栈内容栈的实际应用结论 引言 栈是一种基本但强大的数据结构&#xff0c;它在许多算法和系统功能中扮演着关键角色。…...

web前端之拖拽API、vue3实现图片上传拖拽排序、拖放、投掷、复制、若依、vuedraggable

MENU vue2html5原生dom原生JavaScript实现跨区域拖放vue2实现跨区域拖放vue2mousedown实现全屏拖动&#xff0c;全屏投掷vue3element-plusvuedraggable实现图片上传拖拽排序vue2transition-group实现拖动排序原生拖拽排序 vue2html5原生dom原生JavaScript实现跨区域拖放 关键代…...

第11章 GUI Page403~405 步骤三 设置滚动范围

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…...

【Spring Security】打造安全无忧的Web应用--使用篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Security中的授权是…...

体验一下 CodeGPT 插件

体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频&#xff0c;感觉挺有意思&#…...

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构&#xff0c;其中基本的矩阵乘法运算被卷积运算取代&#xff0c;专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…...

[字符编码]windwos下使用libiconv转换编码格式(二)

在http://t.csdnimg.cn/PLUuz笔记中实现了常用编码格式转换的功能,但这还是一个demo。因为代码中向libiconv库函数传递的字符串是存放在堆空间中的(我也是从网上找例子测试,是否一定要开辟堆空间存放还有待考证),如果一次性转换的字节数很巨大的话,就会导致内存空间不足,进而引…...

textile 语法

1、文字修饰 修饰行内文字 字体样式textile 语法对应的 XHTML 语法实际显示效果加强*strong*<strong>strong</strong>strong强调_emphasis_<em>emphasis</em>emphasis加粗**bold**<b>bold</b>bold斜体__italics__<i>italics</i…...

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…...

【docker笔记】docker常用命令

1、帮助启动类命令 1.1 启动、重启、查询当前状态、停止 systemctl start docker systemctl stop docker systemctl restart docker systemctl status docker1.2 设置开机启动 systemctl enable docker1.3 查看docker概要信息 docker info1.4 查看docker帮助文档 docker -…...

API 接口怎样设计才安全?

设计安全的API接口是确保应用程序和数据安全的重要方面之一。下面是一些设计安全的API接口的常见实践&#xff1a; 1. 身份验证和授权&#xff1a; 使用适当的身份验证机制&#xff0c;如OAuth、JWT或基本身份验证&#xff0c;以确保只有经过身份验证的用户可以访问API。实施…...

网站被CC攻击了怎么办?CC攻击有什么危害

网络爆炸性地发展&#xff0c;网络环境也日益复杂和开放&#xff0c;同时各种各样的恶意威胁和攻击日益增多&#xff0c;其中网站被CC也是常见的情况。 CC攻击有什么危害呢&#xff1f; 被CC会导致&#xff1a; 1.访问速度变慢&#xff1a;网站遭受CC攻击后&#xff0c;由于…...

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…...