发现了一个问题就是我们在执行官方案例的
wordcount
时,后面需要输入和输出路径两个参数,那么为什么后面的输入和输出路径默认是从HDFS进行读取,而不是我们的Linux本地路径呢?
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
先说一下,Hadoop有三种部署模式,分别是本地模式、伪分布模式(单机)、完全分布式
- 本地模式:单机运行,文件系统一般为本地
- 伪分布模式:只有一台服务器,但是该机器上具备了Hadoop所有的运行条件,只不过是将所有功能集一身,文件系统为HDFS
- 完全分布式:多台服务器构成真正的分布式环境,文件系统为HDFS
对于本地模式,我们只不过将hadoop安装了一下,但是内部的配置此时我们并没有修改,使用的是hadoop默认配置文件(例core-default.xml),如果此时运行上述指令,那么我们的输入和输出路径为本地,具体原因如下:
<property><name>fs.defaultFS</name><value>file:///</value><description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description></property>
上述配置来源于
core-default.xml
为hadoop的默认配置文件,该配置中我们的文件系统配置为
file:///
,代表着hadoop使用的文件系统为本地文件系统。
当执行Hadoop命令时,如果路径没有指定协议(例如
hdfs://
或
file://
),则
Hadoop
会根据默认配置来决定路径的协议。默认情况下,
Hadoop
使用
fs.defaultFS
配置项指定的文件系统作为默认文件系统,如果该配置项的值以
hdfs://
开头,则路径会被解释为
HDFS
路径;如果该配置项的值以
file://
开头,则路径会被解释为本地文件系统路径。
当我们搭建集群时,我们会配置一个文件
core-site.xml
:
<!-- 指定NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://hadoop:8020</value></property>
此时我们重新配置了
fs.defaultFS
这个参数为
hdfs://***
,所以此时Hadoop使用的文件系统为HDFS。
因此,如果您的
fs.defaultFS
配置项的值是以
file://
开头的,则Hadoop会将路径解释为本地文件系统路径;如果
fs.defaultFS
的值是以
hdfs://
开头的,则Hadoop会将路径解释为HDFS路径。
所以在执行
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
这条指令时,文件的输入和输出路径到底是Linux本地还是HDFS路径主要取决于配置文件中的
fs.defaultFS
到底配置的是什么。
版权归原作者 海洋.之心 所有, 如有侵权,请联系我们删除。