您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 实验3-熟悉常用的HDFS操作-答案
..’.实验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:///或者3)注意区分相对路径与绝对路径4)具体命令的说明可参考教材或ject-dist/hadoop-common/(1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;Shell命令:检查文件是否存在:./hdfsdfs-test-etext.txt(执行完这一句不会输出结果,需要继续输入命令echo$?)追加命令:./hdfsdfs-appendTotext.txt覆盖命令1:./hdfsdfs-copyFromLocal-flocal.txttext.txt覆盖命令2:./hdfsdfs-cp-ftext.txt也可以使用如下命令实现:(如下代码可视为一行代码,在终端中输入第一行代码后,直到输入fi才会真正执行):if$(./hdfsdfs-test-etext.txt);then$(./hdfsdfs-appendTotext.txt);else$(./hdfsdfs-copyFromLocal-flocal.txttext.txt);fiJava代码:importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.*;..’.importjava.io.*;publicclassHDFSApi{/***判断路径是否存在*/publicstaticbooleantest(Configurationconf,Stringpath)throwsIOException{fs=(conf);returnfs.exists(newPath(path));}/***复制文件到指定路径*若路径已存在,则进行覆盖*/publicstaticvoidcopyFromLocalconf,Stringlocal,Stringremote)throwsIOException{fs=(conf);PathlocalPath=newPath(local);PathremotePath=newPath(remote);/*fs.copyFromLocalFile第一个参数表示是否删除源文件,第二个参数表示是否覆盖*/fs.copyFromLocal,true,localPath,remotePath);fs.close();}/***追加文件内容*/publicstaticvoidappendToconf,Stringlocal,Stringremote)throwsIOException{fs=(conf);PathremotePath=newPath(remote);/*创建一个文件读入流*/in=new(local);/*创建一个文件输出流,输出的内容将追加到文件末尾*/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);Stringlocal=/home/hadoop/text.txt;//本地路径Stringremote=/user/hadoop/text.txt;//HDFS路径Stringchoice=append;//若文件存在则追加到文件末尾//Stringchoice=overwrite;//若文件存在则覆盖try{/*判断文件是否存在*/Boolean=false;if(HDFSApi.test(conf,remote)){=true;System.out.println(remote+已存在.);}else{System.out.println(remote+不存在.);}/*进行处理*/if(!){//文件不存在,则上传HDFSApi.copyFromLocal,local,remote);System.out.println(local+已上传至+remote);}elseif(choice.equals(overwrite)){//选择覆盖HDFSApi.copyFromLocal,local,remote);System.out.println(local+已覆盖+remote);}elseif(choice.equals(append)){//选择追加HDFSApi.appendTo,local,remote);System.out.println(local+已追加至+remote);}}catch(Exceptione){e.printStackTrace();}}}..’.(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;Shell命令:if$(./hdfsdfs-test-e);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,Stringremote,Stringlocal)throwsIOException{fs=(conf);PathremotePath=newPath(remote);Filef=new);/*如果文件名存在,自动重命名(在文件名后面加上_0,_1...)*/if(f.exists()){System.out.println(local+已存在.);..’.Integeri=0;while(true){f=new+_+i.toString());if(!f.exists()){local=local+_+i.toString();break;}}System.out.println(将重新命名为:+local);}//下载文件到本地PathlocalPath=newPath(local);fs.copyToLocal,localPath);fs.close();}/***主函数*/publicstaticvoidmain(String[]args){Configurationconf=newConfiguration();conf.set(fs.default.name,hdfs://localhost:9000);Stringlocal=/home/hadoop/text.txt;//本地路径Stringremote=/user/hadoop/text.txt;//HDFS路径try{HDFSApi.copyToLocal(conf,remote,local);System.out.println(下载完成);}catch(Exceptione){e.printStackTrace();}}}..’.(3)将HDFS中指定文件的内容输出到终端中;Shell命令:./hdfsdfs-cattext.txtJava代码:importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.*;importjava.io.*;publicclassHDFSApi{/***读取文件内容*/publicstaticvoidcat(Configurationconf,Stringremote)throwsIOException{fs=(conf);PathremotePath=newPath(remote);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();}..’./***主函数*/publicstaticvoidmain(String[]args){Configurationconf=newConfiguration();conf.set(fs.default.name,hdfs://localhost:9000);Stringremote=/user/hadoop/text.txt;//HDFS路径try{System.out.println(读取文件:+remote);HDFSApi.cat(conf,remote);System.out.println(\n读取完成);}catch(Exceptione){e.printStackTrace();}}}(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;Shell命令:./hdfsdfs-ls-htext.txtJava代码:importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.*;importjava.io.*;..’.importjava.text.SimpleDateFormat;publicclassHDFSApi{/***显示指定文件的信息*/publicstaticvoidls(Configurationconf,Stringremote)throwsIOException{fs=(conf);PathremotePath=newPath(remote);[]=fs.listStatus(remotePath);for(s:){System.out.println(路径:+s.getPath().toString());System.out.println(权限:+s.getPermission().toString());System.out.println(大小:+s.getLen());/*返回的是时间戳,转化为时间日期格式*/LongtimeStamp=s.getModificationTime();SimpleDateFormatformat=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss);Stringdate=format.format(timeStamp);System.
本文标题:实验3-熟悉常用的HDFS操作-答案
链接地址:https://www.777doc.com/doc-7216821 .html