实验3-熟悉常用的HDFS操作-答案.doc
《实验3-熟悉常用的HDFS操作-答案.doc》由会员分享,可在线阅读,更多相关《实验3-熟悉常用的HDFS操作-答案.doc(27页珍藏版)》请在冰豆网上搜索。
实验2熟悉常用的HDFS操作实验手册
实验2熟悉常用的HDFS操作
1实验目的
1. 理解HDFS在Hadoop体系结构中的角色;
2. 熟练使用HDFS操作常用的Shell命令;
3. 熟悉HDFS操作常用的JavaAPI。
2实验平台
操作系统:
Linux
Hadoop版本:
2.6.0或以上版本
JDK版本:
1.6或以上版本
JavaIDE:
Eclipse
3实验内容和要求
1.编程实现以下指定功能,并利用Hadoop提供的Shell命令完成相同任务:
提示:
1)部分Shell命令的参数路径只能是本地路径或者HDFS路径。
2)若Shell命令的参数既可以是本地路径,也可以是HDFS路径时,务必注意区分。
为保证操作正确,可指定路径前缀hdfs:
///或者file:
///
3)注意区分相对路径与绝对路径
4)具体命令的说明可参考教材或http:
//hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/FileSystemShell.html
(1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
Shell命令:
检查文件是否存在:
./hdfsdfs-test-etext.txt(执行完这一句不会输出结果,需要继续输入命令
"echo$?
")
追加命令:
./hdfsdfs-appendToFilelocal.txttext.txt
覆盖命令1:
./hdfsdfs-copyFromLocal-flocal.txttext.txt
覆盖命令2:
./hdfsdfs-cp-ffile:
///home/hadoop/local.txttext.txt
也可以使用如下命令实现:
(如下代码可视为一行代码,在终端中输入第一行代码后,直到输入fi才会真正执行):
if$(./hdfsdfs-test-etext.txt);
then$(./hdfsdfs-appendToFilelocal.txttext.txt);
else$(./hdfsdfs-copyFromLocal-flocal.txttext.txt);
fi
Java代码:
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.*;
importjava.io.*;
publicclassHDFSApi{
/**
*判断路径是否存在
*/
publicstaticbooleantest(Configurationconf,Stringpath)throwsIOException{
FileSystemfs=FileSystem.get(conf);
returnfs.exists(newPath(path));
}
/**
*复制文件到指定路径
*若路径已存在,则进行覆盖
*/
publicstaticvoidcopyFromLocalFile(Configurationconf,StringlocalFilePath,StringremoteFilePath)throwsIOException{
FileSystemfs=FileSystem.get(conf);
PathlocalPath=newPath(localFilePath);
PathremotePath=newPath(remoteFilePath);
/*fs.copyFromLocalFile第一个参数表示是否删除源文件,第二个参数表示是否覆盖*/
fs.copyFromLocalFile(false,true,localPath,remotePath);
fs.close();
}
/**
*追加文件内容
*/
publicstaticvoidappendToFile(Configurationconf,StringlocalFilePath,StringremoteFilePath)throwsIOException{
FileSystemfs=FileSystem.get(conf);
PathremotePath=newPath(remoteFilePath);
/*创建一个文件读入流*/
FileInputStreamin=newFileInputStream(localFilePath);
/*创建一个文件输出流,输出的内容将追加到文件末尾*/
FSDataOutputStreamout=fs.append(remotePath);
/*读写文件内容*/
byte[]data=newbyte[1024];
intread=-1;
while((read=in.read(data))>0){
out.write(data,0,read);
}
out.close();
in.close();
fs.close();
}
/**
*主函数
*/
publicstaticvoidmain(String[]args){
Configurationconf=newConfiguration();
conf.set("fs.default.name","hdfs:
//localhost:
9000");
StringlocalFilePath="/home/hadoop/text.txt";//本地路径
StringremoteFilePath="/user/hadoop/text.txt";//HDFS路径
Stringchoice="append";//若文件存在则追加到文件末尾
// Stringchoice="overwrite";//若文件存在则覆盖
try{
/*判断文件是否存在*/
BooleanfileExists=false;
if(HDFSApi.test(conf,remoteFilePath)){
fileExists=true;
System.out.println(remoteFilePath+"已存在.");
}else{
System.out.println(remoteFilePath+"不存在.");
}
/*进行处理*/
if(!
fileExists){//文件不存在,则上传
HDFSApi.copyFromLocalFile(conf,localFilePath,remoteFilePath);
System.out.println(localFilePath+"已上传至"+remoteFilePath);
}elseif(choice.equals("overwrite")){//选择覆盖
HDFSApi.copyFromLocalFile(conf,localFilePath,remoteFilePath);
System.out.println(localFilePath+"已覆盖"+remoteFilePath);
}elseif(choice.equals("append")){//选择追加
HDFSApi.appendToFile(conf,localFilePath,remoteFilePath);
System.out.println(localFilePath+"已追加至"+remoteFilePath);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
Shell命令:
if$(./hdfsdfs-test-efile:
///home/hadoop/text.txt);
then$(./hdfsdfs-copyToLocaltext.txt./text2.txt);
else$(./hdfsdfs-copyToLocaltext.txt./text.txt);
fi
Java代码:
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.*;
importjava.io.*;
publicclassHDFSApi{
/**
*下载文件到本地
*判断本地路径是否已存在,若已存在,则自动进行重命名
*/
publicstaticvoidcopyToLocal(Configurationconf,StringremoteFilePath,StringlocalFilePath)throwsIOException{
FileSystemfs=FileSystem.get(conf);
PathremotePath=newPath(remoteFilePath);
Filef=newFile(localFilePath);
/*如果文件名存在,自动重命名(在文件名后面加上_0,_1...)*/
if(f.exists()){
System.out.println(localFilePath+"已存在.");
Integeri=0;
while(true){
f=newFile(localFilePath+"_"+i.toString());
if(!
f.exists()){
localFilePath=localFilePath+"_"+i.toString();
break;
}
}
System.out.println("将重新命