hadoop离线day03--Hadoop HDFS
Posted Vics异地我就
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop离线day03--Hadoop HDFS相关的知识,希望对你有一定的参考价值。
hadoop离线day03--Hadoop HDFS
目录
跨集群复制数据 distcp(distributed copy)
今日内容大纲
#HDFS入门 HDFS介绍 如何模拟实现分布式文件存储系统? 具备哪些特性。 分布式、分块存储、副本机制、元数据管理 HDFS设计目标和重要特性 #HDFS操作 shell command java api #HDFS原理 重中之重 工作机制--读写流程 角色之间如何配合的 每个角色承担了什么职责 NN DN角色职责概述总结 #HDFS辅助功能 distcp 跨集群复制数据 Archive 归档文件 处理小文件 Snapshot 快照
Apache HDFS入门
-
概念
-
首先是一个文件系统,就是用来存储文件、存储数据。是大数据最底层一个服务。
-
其次是一个分布式的文件系统。分布式意味着多台机器存储。
-
-
场景:如何模拟实现分布式文件系统。具备哪些属性呢?
-
HDFS重要特性
-
master|slaves 主从架构
主角色:namenode 管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息 从角色:datanode 存储着最终的数据块
-
分块存储
物理上把文件分开了。 block size =128M 134217728 hadoop2.x (hadoop1.x 64M) e.g: 1.txt 300M blk-1 0--128 blk-2 128-256 blk-3 256-300 2.txt 100M blk-4 0--100
-
副本机制
默认是3副本。 1+2=3 本身一份 额外两份 最终3副本。
-
namespace 名字空间 命名空间
层次感结构 兼顾传统对应文件系统的认知 目录树结构 用户可以针对目录树进行文件夹、文件的增删改查。 统一的抽象目录树。
-
metadata 元数据
对于HDFS来说,目录结构及文件分块位置信息叫做元数据。 元数据是有namenode维护的。
-
write one read many
hdfs的模式是一次写入多次读取 hdfs没有随机修改编辑的操作 只能对已有的数据进行追加。 设计目标是这么决定的。 侧重于数据吞吐量 不注重实时交互性 意味着hdfs操作延迟很高。
-
HDFS shell操作
-
命令
hadoop fs <args> 文件系统的路径 #hadoop fs可以操作的文件系统不仅仅有HDFS,还包括本地文件系统、GFS、TFS。 #如何区分操作访问的是什么文件系统呢? 根据文件系统协议 hadoop fs -ls hdfs://node1:8020/ hadoop fs -ls file:/// hadoop fs -ls gfs:// #如果不写协议 直接/目录 操作访问的是谁? [root@node1 ~]# hadoop fs -ls / Found 4 items drwxr-xr-x - root supergroup 0 2021-05-23 16:49 /itcast drwx------ - root supergroup 0 2021-05-23 16:12 /tmp drwxr-xr-x - root supergroup 0 2021-05-23 16:12 /user drwxr-xr-x - root supergroup 0 2021-05-23 16:16 /wc #默认是谁,取决于参数fs.defaultFS <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> #如果fs.defaultFS没有配置 默认的是file:/// #新旧命令 推荐使用hadoop fs hadoop fs <args> = hdfs dfs <args>
-
shell常见命令操作
# 查看指定目录下信息 hadoop fs -ls [-h] [-R] <args> -h 人性化显示 -R 递归显示 #创建文件夹 hadoop fs -mkdir [-p] <paths> -p 创建父目录 #上传文件 hadoop fs -put src dst 将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统 #src代表的是本地目录 所谓的本地指的是客户端所在的机器 #dst代表的是HDFS -p:保留访问和修改时间,所有权和权限。 -f:覆盖目的地(如果已经存在) hadoop fs -put file:///root/a.txt hdfs://node1:8020/ hadoop fs -put a.txt /root #下载文件 hadoop fs -get src localdst #将文件复制到本地文件系统。 hadoop fs -get hdfs://node1:8020/root/a.txt file:///root/ hadoop fs -get /root/a.txt ./ #追加内容到文件尾部 appendToFile [root@node3 ~]# echo 1 >> 1.txt [root@node3 ~]# echo 2 >> 2.txt [root@node3 ~]# echo 3 >> 3.txt [root@node3 ~]# hadoop fs -put 1.txt / [root@node3 ~]# hadoop fs -cat /1.txt 1 [root@node3 ~]# hadoop fs -appendToFile 2.txt 3.txt /1.txt [root@node3 ~]# hadoop fs -cat /1.txt 1 2 3 [root@node3 ~]# #追加的用途:把本地的小文件上传中合并成为大文件 解决小文件场景的。 #文件内容的查看 cat 适合小文件 tail 将文件的最后一千字节内容显示到stdout -f参数支持实时追踪查看 #权限 拥有者 所属组修改 hdfs在设计的时候 借鉴模仿着linux权限管理模式 也有所谓的读写执行 user group others 777 chgrp chmod cgown hadoop fs -chmod 755 /1.txt #文件移动 复制 删除 mv cp rm -r递归删除 #合并下载 getmerge 合并下载多个文件 其功能和appendToFile相反的动作 [root@node3 ~]# hadoop fs -mkdir /small [root@node3 ~]# hadoop fs -put *.txt /small [root@node3 ~]# hadoop fs -getmerge /small/* ./merge.txt [root@node3 ~]# cat merge.txt #统计HDFS可用空间 指定目录大小 [root@node3 ~]# hadoop fs -df -h / Filesystem Size Used Available Use% hdfs://node1:8020 111.1 G 5.0 M 98.3 G 0% #修改文件的副本数 hadoop fs -setrep -w N -R N就是修改之后的副本数 -w wait等待 修改副本客户端是否等待修改完毕再推出 [root@node3 ~]# hadoop fs -setrep 2 /small/1.txt Replication 2 set: /small/1.txt [root@node3 ~]# hadoop fs -setrep -w 2 /small/2.txt Replication 2 set: /small/2.txt Waiting for /small/2.txt ... WARNING: the waiting time may be long for DECREASING the number of replications. . done #企业中避免使用setrep修改文件的副本数。 副本的修改操作可能会影响hdfs正常的读写服务请求。 因此在实际工作中 事先根据数据的重要性在上传之前就决定该文件的备份数是多少 避免线上修改。
-
文件限额操作
-
默认情况下,没有限额的 上传大小 上传文件个数没有限制。
-
限额----->本限制为硬性限制!
-
限制上传文件的大小
-
限制上传文件的个数
-
-
相关的命令
#hdfs dfsadmin [-setQuota <dirname>] #个数限制 [-clrQuota <dirname>] [-setSpaceQuota <dirname>] #大小空间限制 [-clrSpaceQuota <dirname>]
-
栗子
[root@node3 ~]# hadoop fs -count -q -h /allenwoon none inf none inf 1 0 0 /allenwoon [root@node3 ~]# hdfs dfsadmin -setQuota 3 /allenwoon [root@node3 ~]# hadoop fs -count -q -h /allenwoon 3 2 none inf 1 0 0 /allenwoon [root@node3 ~]# hadoop fs -put 1.txt /allenwoon [root@node3 ~]# hadoop fs -count -q -h /allenwoon 3 1 none inf 1 1 2 /allenwoon [root@node3 ~]# hadoop fs -put 2.txt /allenwoon [root@node3 ~]# hadoop fs -count -q -h /allenwoon 3 0 none inf 1 2 4 /allenwoon [root@node3 ~]# hadoop fs -put 3.txt /allenwoon put: The NameSpace quota (directories and files) of directory /allenwoon is exceeded: quota=3 file count=4 #hdfs限额操作是硬性限制 只要超出限额 就禁止操作 跟zk不一样 #hdfs在对个数进行限额的时候 统计是包括自己在内 如果设置3个限额 实际上还允许两个上传 自己占了一个
-
HDFS工作机制
-
读写流程图见画图。
-
写详细步骤:
- 客户端向NameNode发出写文件请求。
- 检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。
- (注:WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了,由于在真实写操作之前,操作就被写入EditLog中了,故EditLog中仍会有记录,我们不用担心后续client读不到相应的数据块,因为在第5步中DataNode收到块后会有一返回确认信息,若没写成功,发送端没收到确认信息,会一直重试,直到成功)
- client端按128MB的块切分文件。
- client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。
- (注:并不是写好一个块或一整个文件后才向后分发)
- 每个DataNode写完一个块后,会返回确认信息。
- (注:并不是每写完一个packet后就返回确认信息,因为packet中的每个chunk都携带校验信息,没必要每写一个就汇报一下,这样效率太慢。正确的做法是写完一个block块后,对校验信息进行汇总分析,就能得出是否有块写错的情况发生)
- 写完数据,关闭输输出流。
- 发送完成信号给NameNode。
(注:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)
-
读相对于写,简单一些
读详细步骤:
- client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
- 就近挑选一台datanode服务器,请求建立输入流 。
- DataNode向输入流中中写数据,以packet为单位来校验。
- 关闭输入流
NameNode与DataNode通信机制
-
dn启动时
#datanode向nameNode进行注册 并行汇报自己持有数据块信息 注册表示自己启动成功 汇报是高速namenode自己保存了哪些数据块
-
dn后续工作时
#心跳机制 datanode每隔3S(默认为3秒)向namenode进行心跳,如果超过10分钟没有报告则认为DataNode死亡 目的:报活 dfs.heartbeat.interval #数据块汇报机制 blockreport datanode每隔6小时向nameNode进行数据块汇报自己数据块信息 dfs.blockreport.intervalMsec
HDFS Java API
-
核心类
Configuration:该类的对象封转了客户端或者服务器的配置; FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来 对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
-
开发环境搭建 maven依赖
-
添加log4j.propertied 日志配置文件
hadoop工程源码中已经引入了log4j的jar包 添加配置之后就可以在执行的过程中查看日志信息,便于排错。 把log4j.properties添加到工程的resources目录下即可
-
问题1 :客户端访问权限问题
-
现象
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=AllenWoon, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
-
原因
在windows平台访问hdfs的时候 默认是以windows登录的用户身份去访问的 该身份可能不具备在hdfs相应的操作权限 所以报了权限拒绝的问题。
-
解决方式
#方式1: hdfs授权 chmod -R 777 / #方式2:客户端设置访问身份 //构造fs对象 并且设置客户端的身份是root FileSystem fs = FileSystem.get(new URI("hdfs://node1:8020"), conf, "root");
-
-
问题2:windows 本地库问题
-
现象
ERROR - Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\\bin\\winutils.exe in the Hadoop binaries. #winutils.exe WARN - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable #无法加载hadoop本地库
-
原因
-
本地库环境没有支持 无法进行IO的操作 无法写数据。
-
本地库来自于hadoop源码在不同的平台进行编译 不同操作系统平台本地库环境是不一样的。
-
对于windows来说,负责和windows进行IO的就是winutils.exe,来自于hadoop源码中C++工程在windows编译而成。
-
-
解决
-
下载hadoop源码在windows平台编译
hadoop-2.6.0-cdh5.14.0-with-windows.rar hadoop-day02中
-
配置环境变量
解压到一个没有中文 没有空格的目录下。 HADOOP_HOME=C:\\soft\\hadoop-2.6.0-cdh5.14.0 path=;%HADOOP_HOME%\\bin
-
如何验证windows本地hadoop环境正常呢?
-
cmd验证 hadoop
-
双击bin/winutils.exe 如果一闪而过就正常 如果弹窗报错就需要安装动态库。
-
-
-
重启IDEA 加载环境变量
-
如果重启无效 右键使用管理员身份执行IDEA。
-
-
HDFS辅助工具
-
跨集群复制数据 distcp(distributed copy)
-
功能:实现在不同的hadoop集群之间进行数据复制同步。
-
用法:
#同一个集群内 复制操作 hadoop fs -cp /zookeeper.out /it #跨集群复制操作 hadoop distcp hdfs://node1:8020/1.txt hdfs:node5:8020/it
-
-
文件归档工具 archive
-
背景
hdfs的架构设计不适合小文件存储的。 因为小文件不管多小 都需要一定的元数据记录它 元数据保存在内存中的, 如果集群小文件过多 就会造成内存被撑爆。 俗称 小文件吃内存。
-
archive功能
-
将一批小文件归档一个档案文件。
-
底层是通过MapReduce程序将小文件进行合并的。启动yarn集群执行mr程序。
-
企业中可以根据时间 定时进行归档,比如一周创建一个档案。
-
-
使用
#创建档案 hadoop archive -archiveName test.har -p /small /outputdir 基于自己的需求 删除小文件 减少对内存的消耗 hadoop fs -rm /small/* #查看档案文件 --归档之后的样子 [root@node1 ~]# hadoop fs -ls hdfs://node1:8020/outputdir/test.har Found 4 items hdfs://node1:8020/outputdir/test.har/_SUCCESS hdfs://node1:8020/outputdir/test.har/_index hdfs://node1:8020/outputdir/test.har/_masterindex hdfs://node1:8020/outputdir/test.har/part-0 #查看档案文件 --归档之前的样子 [root@node1 ~]# hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har Found 3 items har://hdfs-node1:8020/outputdir/test.har/1.txt har://hdfs-node1:8020/outputdir/test.har/2.txt har://hdfs-node1:8020/outputdir/test.har/3.txt #从档案文件中提取文件 [root@node1 ~]# hadoop fs -cp har://hdfs-node1:8020/outputdir/test.har/* /small/ [root@node1 ~]# hadoop fs -ls /small Found 3 items -rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/1.txt -rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/2.txt -rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/3.txt
-
注意
-
archive没有压缩的功能 就是简单的合二为一的操作 减少小文件个数。
-
-
-
HDFS snapshot快照
-
功能:对文件系统的某一时刻状态进行拍照 相当于备份。
-
注意:使用快照之前 需要先开启快照的功能。通常针对指定的重要的目录创建快照。
-
栗子
[root@node1 ~]# hdfs snapshotDiff /small mykz1 mykz2 Difference between snapshot mykz1 and snapshot mykz2 under directory /small: M . + ./a.txt - ./1.txt
-
意外收获
-
拥有快照能力的目录 客观层面也被保护 无法执行删除操作。
[root@node1 ~]# hadoop fs -rm -r /small 21/05/24 18:13:21 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes. rm: Failed to move to trash: hdfs://node1:8020/small: The directory /small cannot be deleted since /small is snapshottable and already has snapshots
-
-
思考题
#1、分布式文件系统应该具备哪些属性 作用是什么 分布式特性 分块存储 副本机制 元数据记录 抽象目录树 #2、HDFS原理 读写流程图 自己梳理。 #总结、概况nn dn角色职责 分布式软件主从配合工作场景。 大数据存储类软件都是这一个套路。 HBase Kafka ES #3、java API练习 环境 windows 影响后面MapReduce编程 spark编程。 #4、Archive 归档小文件 面试:大数据如何处理小文件场景。HDFS
以上是关于hadoop离线day03--Hadoop HDFS的主要内容,如果未能解决你的问题,请参考以下文章
hadoop离线day05--Hadoop MapReduce
hadoop离线day05--Hadoop MapReduce
hadoop离线day04--Hadoop MapReduce