Hadoop学习笔记-2 HDFS基础入门

Hadoop的核心组件 之 HDFS

HDFS

1. HDFS是什么:

  • 分布式文件系统

2. HDFS 设计思想

  • 分而治之, 切分存储, 当一个文件过大的时候, 一个节点存储不了, 采用切分存储
  • 分块存储: 每一个块叫做 block
    • 如果一个8T的数据, 这个怎么分合适???
      • 设置分块的时候要考虑一个事情 : 负载均衡
      • 块的大小不能太大, 太大会造成负载不均衡
      • hadoop2.x 中默认的切分的块的大小是: 128M, 1.x中默认的是64M
      • 如果一个文件不足128M, 也会单独存一个快, 快的大小就是存储数据的实际大小
    • 这个分块存储思想中, 如果一个块的存储节点宕机了, 这个时候, 数据的安全性得不到保证了
  • 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的数据底层存储的时候吗, 还是存在真正的物理节点上.

2. HDFS 的整体结构

主从结构: 一个主节点, 多个从节点

namenode:

  • 用于存储元数据, 包括:
    • 抽象目录树
    • 存储数据和block的对应关系
    • block存储的位置
  • 处理客户端的读写请求
    • 读: 下载
    • 写: 上传

datanode

  • 负责真正的数据存储, 存储数据的block
  • 真正处理读写

secondarynamenode:

  • 冷备份节点: 助理
    • 当namenode宕机的时候, secondarynamenode不能主动切换为 namenode, 但是 secondarynamenode中存储的数据与namenode相同.
  • 主要作用:
    • namenode宕机的时候, 帮助namenode恢复
    • 帮助namenode做一些事情, 分担namenode的压力

3. HDFS优缺点:

  • 优点:

    1. 可构建在廉价机器上, 成本低, 通过多副本提高可靠性, 提供了容错和恢复机制

    2. 高容错性

      • 容错性: 数据访问上, 一个节点数据丢失, 不影响整体的数据访问
      • 数据自动保存多个副本, 副本丢失后, 自动恢复, 最终恢复到用户配置的副本个数
    3. 适合批处理, 适合离线数据处理

      • 移动计算而非数据, 数据位置暴露给计算框架
    4. 适合大数据处理

      • GB, TB 甚至 PB 级数据, 百万规模以上的文件数量, 10k+ 节点规模
    5. 流式文件访问, 不支持数据修改, hdfs用于数据存储

      • 一次性写入, 多次读取, 保证数据一致性
  • 缺点:

    1. 不支持低延迟的数据访问, 不支持 实时/近实时 数据访问, 因为涉及到多轮RPC调用
      1. 向 NameNode 寻址..
      2. 拿到地址后, 向 DataNode 请求数据..
    2. 不擅长存储大量的小文件–kb级别的
      • 寻址时间可能大于读取数据的时间, 不划算
        • 进行数据访问的时候先找元数据
        • 元数据是和block对应的, 1个block块对应一条元数据
        • 1000w个1kb的文件, 存了1000w个块 — 1000w元数据
        • 在进行数据访问的时候可能花了 1s 的时间, 总体上不划算
      • 这样会造成元数据存储量过大, 增加namenode的压力
        • 在hdfs中一般情况下, 一条元数据大小 150byte 左右
        • 1000w条元数据 — 1000w * 150, 1.5G左右
    3. 不支持文件内容修改, 仅仅支持文件末尾追加 append, 一个文件同时只能有一个写者,不支持并发操作

==4. HDFS 的 常用命令:==

HDFS归根结底就是一个文件系统, 类似于 linux, 需要用命令来操作

1. hapdoop fs 命令

hadoop fs / hdfs dfs 效果是一样的

在hadoop中查看, 只有绝对路径的访问方式

  1. 查看帮助

    • hadoop fs -help 查看所有 hadoop fs的帮助
    • hadoop fs -help ls 查看 fs下的 ls的帮助
  2. 列出根目录: hadoop fs -ls /

    • hadoop fs -ls -R / 递归展示
    • hadoop fs -ls -R -h /友好展示, 展示文件大小单位
    • 如果不指定目录, 会默认找当前用户xx对应的/user/xx的目录
  3. 递归创建 -mkdir -p:

    • hadoop fs -mkdir -p /aa/bb/cc/dd
    • 不加 -p 为普通创建
  4. 创建空文件-touchz

    • 类似于 Linux 下的 touch
  5. 上传 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
  6. 下载 get

    • hadoop fs -get hdfs路径 本地路径
  7. 合并下载 getmerge

    • hadoop fs -getmerge /ss/aa.txt /ss/bb.txt /home/ap/cc.txt
    • 会将最后一个路径之前8的当做需要合并的文件, 最后一个路径中指定的文件就是合并生成的文件
  8. 查看文件内容 cat

    • -cat 查看文件内容
    • -text也是类似
  9. 删除文件 rm

    • rm -rf (错误的)
    • rm -r(递归) -f(强制)
    • 文件hadoop fs -rm -f /ss/aa.txt
    • 文件夹 hadoop fs -rm -f -r /aa
  10. mv 修改名字, 移动

    • 移动的文件从 hdfs 到 hdfs

    • hadoop fs -mv .. ..

  11. cp 复制

    • hadoop fs -cp /hdfsfile /hdfsfile: 从 hdfs 复制到 hdfs
      • 参数 -p : 复制后保持文件的原本属性, 时间戳, 权限等
        • Passing -p preserves status [topax] (timestamps, ownership, permission, ACLs, XAttr).
      • 参数 -f : 已有同名文件的话, 直接覆盖
  12. 在末尾追加: -appendToFile 本地文件 hdfs文件`

    • 将本地文件bb.txt 追加到 htfd的 /aa/aa.txt 上
      • hadoop fs -appendToFile aa.txt /ss/bb.txt
    • 从命令行追加 , 但是不知道怎么结束, 先存疑??
      • hadoop fs -appendToFile - /a.txt`
    • 这个追加是在原始块的末尾追加的. 会改变集群上的文件
    • 如果超过128M才会进行切分, 但这个命令一般不会使用
  13. 查看文件,文件夹数量 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
  14. du 展示文件大小, 如果参数是文件夹, 则展示文件夹下文件的大小

    • hadoop fs -du -h /tmp
    • hadoop fs -du -s -h /tmp: s 应该是 sum 的意思, 展示所有文件大小的总和
  15. 展示文件最后1kb内容-tail

    • Show the last 1KB of the file.

    • hadoop fs -tail /dd.txt`

    • -f Shows appended data as the file grows.
    • 应用场景: 监控日志
  16. 修改文件权限 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 的区别
    前者指定加在哪组用户上, 后者是所有组都加
  17. 修改用户权限 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 编辑文件httpfs-env.sh
# 打开此句注释, 使用内嵌的 tomcat
export HTTPFS_HTTP_PORT=14000

# 编辑文件core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
编辑文件hdfs-site.xml
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
重新启动namenode,执行 sbin/httpfs.sh start
# 执行命令
curl -i "http://cs1:14000/webhdfs/v1?user.name=root&op=LISTSTATUS"

更多命令参考


相关知识点

  • 这些命令在集群中的任何节点都可以做, hdfs文件系统中, 看到的目录结构只是一个抽象目录, 实际存储在集群中的节点上

    • aa.txt , 大小150M, hadoop fs -put aa.txt /
    • 会在根目录下看到 /aa.txt, 但是 aa.txt 真实存储的时候, 会先进行分块, 分2块, 进行存储, 假设集群中5个存储节点, 这2个块存储在哪个节点, 由namenode进行分配
    • 图形界面点进去, 可以看到存储的块
  • Linux的权限管理命令:

    1. 修改 文件/文件夹 权限的 chmod:
      1. 可读: r , =4
      2. 可写: w, =2
      3. 可执行: x, =1
        1. 最大权限是7
        2. -rw-rw-r–
        3. 文件属性 d:目录 -:文件 l:链接
        4. 第一组: 本用户, 第二组: 本组用户, 第三组: 其它用户
    • chmod 711
    • 改一个文件夹下所有文件权限为711 chmod -R 711 目录
    1. 修改文件所属用户和组 chown
      • chown -R root:root ss/把ss的文件夹全部改成root用户和root组

5、Eclipse查看Hadoop文件信息

详情可以查看

其中可能遇到的bug,参见

其中, Eclipse端无法直接删除文件的问题,似乎可以通过在hdfs-site.xml 中修改访问权限来实现, 还未尝试

1
2
3
4
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

6. 通过 Java API的方式操作 HDFS

如果帮到你, 可以给我赞助杯咖啡☕️
0%