Hadoop——使用笔记


查看 hdfs 相对路径

  • 查看文件的命令为:

    1
    hadoop fs -ls
  • 可以用 Hadoop 的 fs 命令操作 HDFS(分布式文件系统),每个用户有一个默认的工作目录,通常为 /user/<用户名>

    • 特别说明:Hadoop 并不像 Linux Shell 那样有 pwd 命令直接显示当前工作目录(hadoop fs -pwd)是会报错的
  • 查看当前用户的默认工作目录的方式

    • 第一步:查看当前用户名

      1
      2
      3
      whoami
      # 或(部分 Hadoop 版本支持)
      hadoop fs -whoami
    • 第二步:推断当前工作目录

      • 默认情况下,工作目录为 /user/<用户名>
      • 例如,如果用户名是 hadoop-aipnlp,默认工作目录就是 /user/hadoop-aipnlp
  • 注:推荐始终使用绝对路径,避免因工作目录变化导致混淆

  • 示例:

    1
    2
    hadoop fs -ls /user/hadoop-xxx/xxx
    hadoop fs -ls user/hadoop-xxx/xxx # 相对路径,绝对路径是 /user/<用户名>/user/hadoop-xxx/xxx
    • 以上两行命令访问的不是同一个路径

HDFS 副本维护

  • HDFS 或类似分布式文件系统中,一般来说,副本是正常同步的
  • 当通过 HDFS API(如 hdfs dfs -puthdfs dfs -appendToFile)修改文件内容时,NameNode 会协调 DataNode 同步更新所有副本
  • HDFS 文件是不可变的(append-only),不能像本地文件一样随机修改已经存在的内容
    • 如果在文件夹下直接修改某个副本所在的节点上的物理文件(绕过 HDFS),这些更改不会自动同步到其他副本,而且会破坏数据一致性
  • 正确的修改方式 :如果需要更新内容,必须通过 HDFS 提供的写入接口重新上传或追加文件,这样系统会自动更新所有副本

特殊的管理方式

  • 如果将 HDFS 文件夹挂载到 Docker,可通过指定在 Docker 内所有的操作都为 HDFS 接口的操作来实现副本维护(但仅限于单集群,其他集群的做不到同步)
  • 此时,在 Docker 内部,对 HDFS 文件夹的访问就像普通访问一样简单
    • 例如 cp, mkdir, rm 等命令都可以正常使用,且保证多个副本之间的一致性

比较三种命令的区别

  • 在管理 HDFS 文件时,我们常用的命令有三个 hadoop fshadoop dfshdfs dfs【注意没有hdfs fs】*
  • 在 Hadoop 生态中,hadoop fshadoop dfshdfs dfs 都是用于操作文件系统的命令,但它们的适用范围和历史背景有所不同
  • hadoop fs
    • 通用的文件系统操作命令,不仅可以操作 HDFS,还可以操作 Hadoop 支持的其他文件系统(如本地文件系统 file:///、分布式文件系统如 S3 等)
    • 通过指定不同的文件系统前缀(如 hdfs://file:///),可以对对应的文件系统执行创建目录、上传文件、查看文件等操作
    • 由于其通用性,hadoop fs 是官方更推荐的命令,适用于需要跨不同文件系统操作的场景
  • hadoop dfs
    • 早期 Hadoop 版本中用于操作 HDFS 的命令,仅支持 HDFS 文件系统
    • 在 Hadoop 2.x 及之后的版本中,hadoop dfs 逐渐被 hdfs dfs 取代,成为一个“历史遗留”的命令(实际执行时会映射到 hdfs dfs
    • 不推荐在新版本中使用,可能会在未来版本中移除
  • hdfs dfs
    • 专门用于操作 HDFS(Hadoop 分布式文件系统)的命令,功能与 hadoop dfs 完全一致,但更明确地指向 HDFS
    • Hadoop 2.x 引入 hdfs 命令组(如 hdfs dfshdfs namenode 等),将 HDFS 相关操作与其他 Hadoop 功能(如 MapReduce)分离,使命令结构更清晰
    • 如果明确需要操作 HDFS,hdfs dfs 是更规范的选择
  • 总结
    • 通用场景:优先使用 hadoop fs,可操作多种文件系统
    • 仅操作 HDFS:推荐使用 hdfs dfs,功能明确且符合新版本规范
    • 避免使用:hadoop dfs 已过时,不建议在新环境中使用
    • 三者在操作 HDFS 时的核心功能(如 putgetls 等)完全一致,区别主要在于适用范围和版本兼容性