实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第1页实验2熟悉常用的HDFS操作1实验目的1.理解HDFS在Hadoop体系结构中的角色;2.熟练使用HDFS操作常用的Shell命令;3.熟悉HDFS操作常用的JavaAPI。2实验平台操作系统:LinuxHadoop版本:2.6.0或以上版本JDK版本:1.6或以上版本JavaIDE:Eclipse3实验内容和要求1.编程实现以下指定功能,并利用Hadoop提供的Shell命令完成相同任务:提示:1)部分Shell命令的参数路径只能是本地路径或者HDFS路径。2)若Shell命令的参数既可以是本地路径,也可以是HDFS路径时,务必注意区分。为保证操作正确,可指定路径前缀hdfs:///或者file:///3)注意区分相对路径与绝对路径4)具体命令的说明可参考教材或(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);fiJava代码:importorg.apache.hadoop.conf.Configuration;实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第2页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);}实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第3页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操作实验手册主讲教师:刘斌第4页(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;Shell命令:if$(./hdfsdfs-test-efile:///home/hadoop/text.txt);then$(./hdfsdfs-copyToLocaltext.txt./text2.txt);else$(./hdfsdfs-copyToLocaltext.txt./text.txt);fiJava代码: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+已存在.);实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第5页Integeri=0;while(true){f=newFile(localFilePath+_+i.toString());if(!f.exists()){localFilePath=localFilePath+_+i.toString();break;}}System.out.println(将重新命名为:+localFilePath);}//下载文件到本地PathlocalPath=newPath(localFilePath);fs.copyToLocalFile(remotePath,localPath);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路径try{HDFSApi.copyToLocal(conf,remoteFilePath,localFilePath);System.out.println(下载完成);}catch(Exceptione){e.printStackTrace();}}}实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第6页(3)将HDFS中指定文件的内容输出到终端中;Shell命令:./hdfsdfs-cattext.txtJava代码:importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.*;importjava.io.*;publicclassHDFSApi{/***读取文件内容*/publicstaticvoidcat(Configurationconf,StringremoteFilePath)throwsIOException{FileSystemfs=FileSystem.get(conf);PathremotePath=newPath(remoteFilePath);FSDataInputStreamin=fs.open(remotePath);BufferedReaderd=newBufferedReader(newInputStreamReader(in));Stringline=null;while((line=d.readLine())!=null){System.out.println(line);}d.close();in.close();fs.close();}实验2熟悉常用的HDFS操作实验手册主讲教师:刘斌第7页/***主函数*/publicstaticvoidmain(String[]