赞
踩
大数据与数据挖掘技术实验二:HDFS分布式文件系统操作
启动Hadoop
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.h #启动hadoop
Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。
教材《大数据技术原理与应用》的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
hadoop fs hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs hadoop dfs只能适用于HDFS文件系统
hdfs dfs hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
$ ./bin/hadoop fs
查看put命令如何使用
$ ./bin/hadoop fs -help put
第一次使用HDFS时,需要首先在HDFS中创建用户目录。
$ cd /usr/local/hadoop
$ ./bin/hadf dfs -mkdir -p /user/hadoop
该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。“/user/hadoop”目录就成为hadoop用户对应的用户目录
$ ./bin/hdfs dfs -ls .
该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:
$ ./bin/hdfs dfs -ls /user/hadoop
如果要列出HDFS上的所有目录,可以使用如下命令:
$ ./bin/hdfs dfs -ls
创建一个input目录:
$ ./bin/hdfs dfs -mkdir input
在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:
$ ./bin/hdfs dfs -mkdir /input
可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):
$ ./bin/hdfs dfs -rm -r /input
上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。
在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词。
$ cd /home/hadoop/
$ cd > myLocalFile.txt #很多方法创建新文件,这里使用的cd
$ gedit myLocalFile.txt
然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:
$ cd /usr/local/hadoop/
$ ./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt input
下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:
$ ./bin/hdfs dfs -cat input/myLocalFile.txt
任意创建另一个目录,将HDFS中的文件(不是“/home/hadoop/”下的文件)拷贝到该目录下,查看文件内容与HDFS中文件是否一致。
$ cd~
$ mkdir newdirectory
$ cd /usr/local/hadoop/
$ ./bin/hdfs dfs -get input/myLocalFile.txt /home/hadoop/newdirectory
$ cd ~
$ ls
$ cat myLocalFile.txt
最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:
$ ./bin/hdfs dfs -cp input/myLocalFile.txt /input
在Eclipse中创建一个项目,用编写的Java应用程序检测HDFS中是否存在某文件
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { String filename = "test"; Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); if(fs.exists(new Path(filename))){ System.out.println("文件存在"); }else{ System.out.println("文件不存在"); } fs.close(); } catch (Exception e) { e.printStackTrace(); } } }
写入文件
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); byte[] buff = "Hello world".getBytes(); // 要写入的内容 String filename = "test"; //要写入的文件名 FSDataOutputStream os = fs.create(new Path(filename)); os.write(buff,0,buff.length); System.out.println("Create:"+ filename); os.close(); fs.close(); } catch (Exception e) { e.printStackTrace(); } } }
读取文件
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); Path file = new Path("test"); FSDataInputStream getIt = fs.open(file); BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); String content = d.readLine(); //读取文件一行 System.out.println(content); d.close(); //关闭文件 fs.close(); //关闭hdfs } catch (Exception e) { e.printStackTrace(); } } }
实在不想写了。实验教程在http://dblab.xmu.edu.cn/blog/2630-2/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。