我是一名来自非 cs 背景(不是核心系统程序员)的数据分析师,在 linux 操作系统上工作。在使用 hadoop 进行分析时,我想到了一个问题,... / 是一个根,系统的所有文件都以分层方式存在。在 hadoop 环境中,有一个称为 HDFS 的特殊文件系统,它实际上是为了存储由 hadoop 编程框架处理的大文件。
hadoop -fs put localfile.txt
Run Code Online (Sandbox Code Playgroud)
虽然,这些文件应该可以在 / 下访问。那么我在哪里可以通过使用 cat、less 或 more linux 命令而无需前缀 hadoop -fs 来查看此类文件
不幸的是,如果我在 hadoop/HDFS 环境中遇到一些错误,那么我如何访问仍然驻留在我的 linux 机器上的数据。
您可以使用hdfs fsck实用程序来定位块的名称,然后您可以在本地文件系统中手动找到它:
$ echo "Hello world" >> test.txt
$ hdfs dfs -put test.txt /tmp/
$ hdfs fsck /tmp/test.txt -files -blocks
/tmp/test.txt 12 bytes, 1 block(s): OK
0. BP-1186293916-10.25.5.169-1427746975858:blk_1075191146_1451047 len=12 repl=1
Run Code Online (Sandbox Code Playgroud)
注意blk_....字符串。用它来定位文件:
$ find /hadoop/hdfs/data/current/BP-1186293916-10.25.5.169-1427746975858/current/finalized -name 'blk_1075191146*'
/hadoop/hdfs/data/current/BP-1186293916-10.25.5.169-1427746975858/current/finalized/subdir22/subdir29/blk_1075191146_1451047.meta
/hadoop/hdfs/data/current/BP-1186293916-10.25.5.169-1427746975858/current/finalized/subdir22/subdir29/blk_1075191146
$ cat /hadoop/hdfs/data/current/BP-1186293916-10.25.5.169-1427746975858/current/finalized/subdir22/subdir29/blk_1075191146
Hello world
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看完整示例和说明
小智 4
您无法使用 cat 或类似命令从终端直接浏览 HDFS。HDFS是一个逻辑文件系统,并不直接映射到Unix文件系统。您应该有一个 HDFS 客户端,并且您的 Hadoop 集群应该正在运行。当您浏览 HDFS 时,您将从名称节点获取目录结构,并从数据节点获取实际数据。
尽管您无法浏览,但数据是由 datanode 守护进程存储的。其路径由 hdfs-site.xml 中的dfs.data.dir属性指定。
目录结构由namenode守护进程存储,其路径由hdfs-site.xml中的dfs.name.dir属性指定
Hadoop 在每个数据节点上以块的形式本地存储数据,并且该属性可在dfs.data.dir属性下的hdfs-site.xml文件中进行配置
大多数情况下是
$HADOOP_HOME/data/dfs/data/hadoop-${user.name}/current
Run Code Online (Sandbox Code Playgroud)