Hadoop的核心组件 之 HDFS
HDFS
1. HDFS是什么:
- 分布式文件系统
2. HDFS 设计思想
- 分而治之, 切分存储, 当一个文件过大的时候, 一个节点存储不了, 采用切分存储
- 分块存储: 每一个块叫做 block
- 如果一个8T的数据, 这个怎么分合适???
- 设置分块的时候要考虑一个事情 : 负载均衡
- 块的大小不能太大, 太大会造成负载不均衡
- hadoop2.x 中默认的切分的块的大小是: 128M, 1.x中默认的是64M
- 如果一个文件不足128M, 也会单独存一个快, 快的大小就是存储数据的实际大小
- 这个分块存储思想中, 如果一个块的存储节点宕机了, 这个时候, 数据的安全性得不到保证了
- 如果一个8T的数据, 这个怎么分合适???
- HDFS中默认块的存储采用备份机制
- 默认的备份个数是3个(总共存的, 存到datanode上的, namenode不存), 之前自己配的是2个, 所有备份相同地位是相同的.
- 相同的数据块的备份一定存储在不同的节点上
- 如果节点总共2个,
dfs.replication=3
副本个数是3个, 实际存储2个, 另一个进行记账, 当集群节点个数大于3个时, 会复制这个副本, 最终达到3个 - 假设集群中的节点4个, 副本3个, 有一个副本的机器宕机了, 这个时候发现副本的个数 小于 设定的个数, 就会进行复制, 达到3个副本,
- 如果 这个时候, 刚才宕机的节点又恢复了, 这个时候集群副本个数为4了, 集群会等待一段时间, 如果发现还是4个, 就会删除一个副本, 达到3个(设定值)
- 备份越多越好吗?
- 理论上副本数越多, 数据安全性越高
- 但是副本数越多, 会占用过多的存储资源, 会造成集群的维护变得越困难
- 100 个节点, 50个副本, 在这50个副本中, 随时都有可能宕机, hdfs就需要维护副本
- 一般情况下, 3个就可以了
- hadoop是基于廉价的pc机设计的, 会造成机器随时可能宕机
- HDFS的目录结构
- hdfs的目录结构与linux 操作系统类似, 以
/
为跟节点, 我们将这个目录🌲称为抽象目录树
- 因为hdfs的目录结构代表的是所有数据节点的抽象出来的目录, 不代表任何一个节点
- hdfs: /hadoop.zip 500M 被分成4个块存储
- hdfs中存储的数据块 是有编号的, blk_1, blk_2, blk_3, blk_4
- /spark.zip 300M 3个块, blk_5 blk_6 blk_7
- 底层存储的时候, 每一个block都有一个唯一的id
- hdfs的数据底层存储的时候吗, 还是存在真正的物理节点上.
- hdfs的目录结构与linux 操作系统类似, 以
2. HDFS 的整体结构
主从结构: 一个主节点, 多个从节点
namenode:
- 用于存储元数据, 包括:
- 抽象目录树
- 存储数据和block的对应关系
- block存储的位置
- 处理客户端的读写请求
- 读: 下载
- 写: 上传
datanode
- 负责真正的数据存储, 存储数据的block
- 真正处理读写
secondarynamenode:
- 冷备份节点: 助理
- 当namenode宕机的时候, secondarynamenode不能主动切换为 namenode, 但是 secondarynamenode中存储的数据与namenode相同.
- 主要作用:
- namenode宕机的时候, 帮助namenode恢复
- 帮助namenode做一些事情, 分担namenode的压力
3. HDFS优缺点:
优点:
可构建在廉价机器上, 成本低, 通过多副本提高可靠性, 提供了容错和恢复机制
高容错性
- 容错性: 数据访问上, 一个节点数据丢失, 不影响整体的数据访问
- 数据自动保存多个副本, 副本丢失后, 自动恢复, 最终恢复到用户配置的副本个数
适合批处理, 适合离线数据处理
- 移动计算而非数据, 数据位置暴露给计算框架
适合大数据处理
- GB, TB 甚至 PB 级数据, 百万规模以上的文件数量, 10k+ 节点规模
流式文件访问, 不支持数据修改, hdfs用于数据存储
- 一次性写入, 多次读取, 保证数据一致性
缺点:
- 不支持低延迟的数据访问, 不支持 实时/近实时 数据访问, 因为涉及到多轮
RPC
调用- 向 NameNode 寻址..
- 拿到地址后, 向 DataNode 请求数据..
- 不擅长存储大量的小文件–kb级别的
- 寻址时间可能大于读取数据的时间, 不划算
- 进行数据访问的时候先找元数据
- 元数据是和block对应的, 1个block块对应一条元数据
- 1000w个1kb的文件, 存了1000w个块 — 1000w元数据
- 在进行数据访问的时候可能花了 1s 的时间, 总体上不划算
- 这样会造成元数据存储量过大, 增加namenode的压力
- 在hdfs中一般情况下, 一条元数据大小 150byte 左右
- 1000w条元数据 — 1000w * 150, 1.5G左右
- 寻址时间可能大于读取数据的时间, 不划算
- 不支持文件内容修改, 仅仅支持文件末尾追加
append
, 一个文件同时只能有一个写者,不支持并发操作
- 不支持低延迟的数据访问, 不支持 实时/近实时 数据访问, 因为涉及到多轮
==4. HDFS 的 常用命令:==
HDFS归根结底就是一个文件系统, 类似于 linux, 需要用命令来操作
1. hapdoop fs
命令
hadoop fs
/hdfs dfs
效果是一样的在hadoop中查看, 只有绝对路径的访问方式
查看帮助
hadoop fs -help
查看所有hadoop fs
的帮助hadoop fs -help ls
查看fs
下的ls
的帮助
列出根目录:
hadoop fs -ls /
hadoop fs -ls -R /
递归展示hadoop fs -ls -R -h /
友好展示, 展示文件大小单位- 如果不指定目录, 会默认找当前用户xx对应的
/user/xx
的目录
递归创建 -mkdir -p:
hadoop fs -mkdir -p /aa/bb/cc/dd
- 不加 -p 为普通创建
创建空文件
-touchz
- 类似于 Linux 下的 touch
上传 put:
[-put [-f][-p] [-l] <localsrc> ... <dst>]
- 上传一个:
hadoop fs -put hadoop-2.7.6.tar.gz /ss
- 上传多个:
hadoop fs -put aa.txt bb.txt /ss
- 上传一个:
下载 get
hadoop fs -get hdfs路径 本地路径
合并下载 getmerge
hadoop fs -getmerge /ss/aa.txt /ss/bb.txt /home/ap/cc.txt
- 会将最后一个路径之前8的当做需要合并的文件, 最后一个路径中指定的文件就是合并生成的文件
查看文件内容 cat
-cat
查看文件内容-text
也是类似
删除文件 rm
- rm -rf (错误的)
- rm -r(递归) -f(强制)
- 文件
hadoop fs -rm -f /ss/aa.txt
- 文件夹
hadoop fs -rm -f -r /aa
mv 修改名字, 移动
移动的文件从 hdfs 到 hdfs
hadoop fs -mv .. ..
cp 复制
hadoop fs -cp /hdfsfile /hdfsfile
: 从 hdfs 复制到 hdfs- 参数 -p : 复制后保持文件的原本属性, 时间戳, 权限等
Passing -p preserves status [topax] (timestamps, ownership, permission, ACLs, XAttr).
- 参数 -f : 已有同名文件的话, 直接覆盖
- 参数 -p : 复制后保持文件的原本属性, 时间戳, 权限等
在末尾追加:
-appendToFile 本地文件 hdfs文件`
- 将本地文件bb.txt 追加到 htfd的 /aa/aa.txt 上
hadoop fs -appendToFile aa.txt /ss/bb.txt
- 从命令行追加 , 但是不知道怎么结束, 先存疑??
hadoop fs -appendToFile - /a.txt`
- 这个追加是在原始块的末尾追加的. 会改变集群上的文件
- 如果超过128M才会进行切分, 但这个命令一般不会使用
- 将本地文件bb.txt 追加到 htfd的 /aa/aa.txt 上
查看文件,文件夹数量 count
DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME
8 3 176.5 K /tmp
hadoop fs -count -h /tmp
: -h 是友好展示hdfs dfs -count -h /tmp
: 与上面效果一样hdfs dfs -count -q -h /tmp
: 查看文件配额, 具体看 help
du
: 展示文件大小, 如果参数是文件夹, 则展示文件夹下文件的大小hadoop fs -du -h /tmp
hadoop fs -du -s -h /tmp
: s 应该是 sum 的意思, 展示所有文件大小的总和
展示文件最后1kb内容
-tail
Show the last 1KB of the file.
hadoop fs -tail /dd.txt`
-f Shows appended data as the file grows.
- 应用场景: 监控日志
修改文件权限 chmod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 1. 直接使用十进制数字修改
[ap@cs2]~/test% hadoop fs -ls /
drwxr-xr-x - ap supergroup 0 2018-06-01 08:55 /aa
# -R: /aa 目录下所有的文件递归修改权限
[ap@cs2]~/test% hadoop fs -chmod -R 777 /aa
[ap@cs2]~/test% hadoop fs -ls /
drwxrwxrwx - ap supergroup 0 2018-06-01 08:55 /aa
# 2. 针对用户组修改,注意,修改2个不同组权限, 用,隔开
hadoop fs -chmod u+x,g+x /a.txt
# 3. 最常用的文件权限, 是 644(-rw-r--r--) 和 755(-rwxr-xr-x)
文件创建默认就是644
# 4. u+x 与 +x 的区别
前者指定加在哪组用户上, 后者是所有组都加修改用户权限 chown
1
hadoop fs -chown -R 用户名:组名 hdfs目录/文件
2. hdfs dfsadmin
命令
管理员对当前节点的一些操作
hdfs dfsadmin -report
报告当前的一些状态- -live 活跃的
- -dead 死的
- -decommissioning 退役的
- **
hdfs dfsadmin -safemode
安全模式- 系统刚启动的时候, 会有30秒的安全模式开启状态, 过了30秒就关了
- enter 进入
- leave 离开
- get 查看
hdfs dfsadmin
设置配额-setQuota
: 配额是限定的文件&文件夹的数量- A quota of 1 would force the directory to remain empty.
- 空文件本身算一个文件
bin/hdfs dfsadmin -setQuota 10 lisi
-clrQuota
-setSpaceQuota
: 空间配额限定的是大小bin/hdfs dfsadmin -setSpaceQuota 4k /lisi/
-clrSpaceQuota
hdfs dfs -count -q -h /user
: 加上 -q 是查看配额
3. httpFS访问
使用 REST 的形式, 可以在浏览器上直接访问集群, 可以在非 Linux 平台访问
1 | # 编辑文件httpfs-env.sh |
相关知识点
这些命令在集群中的任何节点都可以做, hdfs文件系统中, 看到的目录结构只是一个抽象目录, 实际存储在集群中的节点上
- aa.txt , 大小150M,
hadoop fs -put aa.txt /
- 会在根目录下看到 /aa.txt, 但是 aa.txt 真实存储的时候, 会先进行分块, 分2块, 进行存储, 假设集群中5个存储节点, 这2个块存储在哪个节点, 由namenode进行分配
- 图形界面点进去, 可以看到存储的块
- aa.txt , 大小150M,
Linux的权限管理命令:
- 修改 文件/文件夹 权限的
chmod
:- 可读: r , =4
- 可写: w, =2
- 可执行: x, =1
- 最大权限是7
- -rw-rw-r–
- 文件属性 d:目录 -:文件 l:链接
- 第一组: 本用户, 第二组: 本组用户, 第三组: 其它用户
- chmod 711
- 改一个文件夹下所有文件权限为711
chmod -R 711 目录
- 修改文件所属用户和组
chown
chown -R root:root ss/
把ss的文件夹全部改成root用户和root组
- 修改 文件/文件夹 权限的
5、Eclipse查看Hadoop文件信息
其中, Eclipse端无法直接删除文件的问题,似乎可以通过在hdfs-site.xml
中修改访问权限来实现, 还未尝试
1 | <property> |