大数据与数据挖掘技术实验二:HDFS分布式文件系统操作
启动Hadoop
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.h
实验内容
一、利用Shell命令和HDFS进行交互
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
1、目录操作
第一次使用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”参数,否则会执行失败。
2、文件操作
在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。 首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词。
$ cd /home/hadoop/
$ cd > myLocalFile.txt
$ 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();
} catch (Exception e) {
e.printStackTrace();
}
}
}
实在不想写了。实验教程在http://dblab.xmu.edu.cn/blog/2630-2/
|