Hadoop HDFS (2) HDFS命令行接口

有多种接口可以访问HDFS,其中命令行接口是最简单,也是程序员最熟悉的方式。

在本例中,将采用pseusodistributed mode的HDFS,用一台机器来模拟分布式的文件系统。pseudodistributed mode的配置参见: http://blog.csdn.net/norriszhang/article/details/38659321
这里再重新说一下两处配置的含义:
core-site.xml里:
<property>
    <name>fs.default.name</name>
    <value>hdfs://localhost/</value>
</property>
这个是说hadoop默认的文件系统是HDFS,本节最后我们会看到,Hadoop还可以配置很多其它的文件系统。
<property>
    <name>hadoop.tmp.dir</name>
    <value>/home/norris/hadoop_tmp</value>
    <description>A base for other temporary directories.</description>
</property>
因为HDFS的namenode的格式化信息默认存在系统tmp目录下,机器重启会被清空,因此这个配置所namenode的临时存储目录更改到指定目录下。
hdfs-site.xml里:
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
这个是说blocks的备份复制多少份,因是是pseudodistributed mode,所以只有一份。默认是3份。如果不设置的话,会不停地报警告说不能复制。

配置好以后,启动HDFS Deamon进程:
%start-dfs.sh
然后用jps查看
%jps
应该有NameNode,Secondary Namenode, DataNode等进程正在运行。

基本文件系统操作
在HDFS上,可以做所有的文件系统的操作,比如读文件,写文件,创建目录,删除文件,列出目录里的所有文件,什么的。
大体语法是:
% hadoop fs -ls /
这样的,都是以hadoop fs开头,然后用-引出要进行的操作,后面跟特定的参数。比如这里-ls就相当于Linux里的ls -l命令,后面的/就是根目录,就是列出根目录下的所有文件的意思。
更多的操作命令可以用
% hadoop fs -help
进行查询。
如果要查询特定操作的具体做用方法,比如mkdir的使用方法:
%hadoop fs -help mkdir

下面使用
%hadoop fs -mkdir /user/
%hadoop fs -mkdir /user/norris/
创建了一个目录/user/norris/
因为我当前Linux的用户是norris,所以,在HDFS里,默认的当前目录将是/user/norris/,有关于文件权限的问题呆会儿讨论,反正如果我现在Linux是norris用户,我在HDFS里的默认当前目录就是/user/norris/,但这个目录是没有的,所以,如果不创建这个目录,执行:
%hadoop fs -ls
列出当前目录下的文件,是报错的,因为没有找到当前目录,如果创建了这个目录,就可以列出里面的文件了。

下面试验一个命令把一个文件从本地文件系统放到HDFS里:
% hadoop fs -copyFromLocal /home/norris/data/hadoop/weatherdata.txt /user/norris/weatherdata.txt
把本地的/home/norris/data/hadoop/weatherdata.txt文件放到HDFS的/user/norris/weaterdata.txt上。
说明:
1. 这里的第二个参数/user/norris/weatherdata.txt是绝对路径,因为/user/norris/是当前路径,所以,也可以使用相对路径直接写
% hadoop fs -copyFromLocal /xxx weatherdata.txt
2. /user/norris/weatherdata.txt这个路径实际是一个简写,因为默认配置的文件系统是hdfs://localhost/,其全路径写法是:hdfs://localhost/user/norris/weatherdata.txt

再使用copyToLocal命令把文件拷贝出来:
% hadoop fs -copyToLocal /user/norris/weatherdata.txt /home/norris/data/weatherdata1.txt
比较原来的文件和新拷贝出来的文件,两个是完全一样的。

下面列出当前目录下的所有目录和文件
% hadoop fs -ls
Found 3 items
drwxr-xr-x - norris supergroup 0 2014-09-11 16:19 afolder
-rw-r--r-- 1 norris supergroup 545 2014-09-11 16:02 weatherdata.txt
-rw-r--r-- 1 norris supergroup 545 2014-09-11 16:11 weatherdata1.txt
第一列是类型和权限,跟Linux里的一样,第一位d表示目录,-表示文件,后面9位三个一组分别表示对所有者、同组人、其他人的权限,rwx分别表示读写和执行。读和写权限跟Linux里的概念一致,只有x执行,HDFS里的文件是不能被执行的,只有目录可以有执行权限,表示可以列出该目录下的文件。
第二列的数字表示这个文件的blocks被复制备份了几份,我们是用pseudodistributed mode来运行的,前面配置hdfs-site.xml里配了复制1份,所以这里是1,目录是元信息,不存在datanode里,所以没有复制几份的概念。
第三列是文件所属用户
第四列是用户组,以后再具体讨论用户组,这里是一个超级组。
第五列是文件大小,单位是bytes,目录没有大小
第六列和第七列是最后修改时间
第八列是文件或目录名

HDFS的权限这里只简单理解成跟Linux的差不多,更多的关于权限的内容会在设置集群一章有专门的“安全”一节来讨论。

最后说一下,Hadoop有一个文件系统的抽象,HDFS只是其中的一个实现。也就是说,Hadoop上不是只能用HDFS,简单举几个例子说明一下其它文件系统
我们前面用hdfs://localhost/user/norris/weatherdata.txt,这个hdfs://就是HDFS的URI scheme,每一种文件系统都有它的URI scheme。比如:
Hadoop使用本地文件系统,URI scheme是file,路径写成file:///home/norris/data/hadoop/weatherdata.txt
列出本地文件系统的根目录下的文件用:
% hadoop fs -ls file:///
其它文件系统实现有:



虽然当运行一个MapReduce程序时,可以访问任何一个文件系统,但是强烈建议使用分布式文件系统,尤其是当数据很大时,因为这样可以利用“本地文件优化”(data locality optimization)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值