本地Eclipse连接HDFS进行简单的文件操作
昨天总结了一点自己在搭建Hadoop完全分布式环境过程中遇到的几个小问题以及解决方案,今天在搭建成功的环境中进行了简单的文件操作,包括:文件目录的创建、文件的创建、本地文件的上传、文件的重命名、文件的删除以及其他几个关于文件的操作,希望对初学的练习者有所帮助。
1 package org.apache.hadoop.examples; 2 3 4 import java.io.BufferedOutputStream; 5 import java.io.IOException; 6 import java.net.URI; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 10 import org.apache.hadoop.conf.Configuration; 11 import org.apache.hadoop.fs.BlockLocation; 12 import org.apache.hadoop.fs.FSDataOutputStream; 13 import org.apache.hadoop.fs.FileStatus; 14 import org.apache.hadoop.fs.FileSystem; 15 import org.apache.hadoop.fs.Path; 16 import org.apache.hadoop.hdfs.DistributedFileSystem; 17 import org.apache.hadoop.hdfs.protocol.DatanodeInfo; 18 import org.junit.Before; 19 import org.junit.Test; 20 21 public class FileDemo { 22 private Configuration conf = new Configuration();//这里创建conf对象有一个默认参数,boolean loadDefaults,默认为true
23 private String rootPath=new String("hdfs://192.168.56.10:9000/"); 24 private FileSystem coreSys=null; 25 /** 26 * 每次执行之前初始化操作,初始化FileSystem核心对象 27 */ 28 @Before 29 public void iniFileSystemObject(){ 30 try { 31 coreSys=FileSystem.get(URI.create(rootPath), conf); 32 } catch (IOException e) { 33 System.out.println("初始化HDFS核心文件对象失败:"+e.getLocalizedMessage()); 34 } 35 } 36 /** 37 * 在HDFS上创建文件目录 38 */ 39 @Test 40 public void createDirOnHDFS(){ 41 Path demoDir=new Path(rootPath+"demoDir"); 42 boolean isSuccess=true; 43 try { 44 isSuccess=coreSys.mkdirs(demoDir); 45 } catch (IOException e) { 46 isSuccess=false; 47 } 48 System.out.println(isSuccess?"目录创建成功!":"目录创建失败!"); 49 50 } 51 /** 52 * 在HDFS上创建文件 53 * @throws Exception 54 */ 55 @Test 56 public void createFile() throws Exception{ 57 Path hdfsPath = new Path(rootPath + "user/hdfsupload/createDemoFile"); 58 System.out.println(coreSys.getHomeDirectory()); 59 String content = "Hello hadoop,this is first time that I create file on hdfs"; 60 FSDataOutputStream fsout = coreSys.create(hdfsPath); 61 BufferedOutputStream bout = new BufferedOutputStream(fsout); 62 bout.write(content.getBytes(), 0, content.getBytes().length); 63 bout.close(); 64 fsout.close(); 65 System.out.println("文件创建完毕!"); 66 } 67 /** 68 * 从本地上传任意文件到服务器HDFS环境 69 * @throws Exception 70 */ 71 @Test 72 public void uploadFile() throws Exception{ 73 Configuration conf = new Configuration(); 74 Path remotePath=new Path(rootPath+"user/"); 75 coreSys.copyFromLocalFile(new Path("D:\\VirtualBox\\Users"), remotePath); 76 System.out.println("Upload to:"+conf.get("fs.default.name")); 77 FileStatus [] files=coreSys.listStatus(remotePath); 78 for(FileStatus file:files){ 79 System.out.println(file.getPath().toString()); 80 } 81 } 82 /** 83 * 重命名文件名 84 */ 85 @Test 86 public void renameFile(){ 87 Path oldFileName=new Path(rootPath+"user/hdfsupload/createDemoFile"); 88 Path newFileName=new Path(rootPath+"user/hdfsupload/renameDemoFile"); 89 boolean isSuccess=true; 90 try { 91 isSuccess=coreSys.rename(oldFileName, newFileName); 92 } catch (IOException e) { 93 isSuccess=false; 94 } 95 System.out.println(isSuccess?"重命名成功!":"重命名失败!"); 96 } 97 /** 98 * 删除文件 99 */ 100 @Test 101 public void deleteFile(){ 102 Path deleteFile=new Path(rootPath+"user/hdfsupload/job.jar"); 103 boolean isSuccess=true; 104 try { 105 isSuccess=coreSys.delete(deleteFile, false); 106 } catch (IOException e) { 107 isSuccess=false; 108 } 109 System.out.println(isSuccess?"删除成功!":"删除失败!"); 110 } 111 /** 112 * 查找某个文件是否存在 113 */ 114 @Test 115 public void findFileIsExit(){ 116 Path checkFile=new Path(rootPath+"user/hdfsupload/job.jar"); 117 boolean isExit=true; 118 try { 119 isExit=coreSys.exists(checkFile); 120 } catch (IOException e) { 121 isExit=false; 122 } 123 System.out.println(isExit?"文件存在!":"文件不存在!"); 124 } 125 /** 126 * 查看某个文件的最后修改时间 127 * @throws IOException 128 */ 129 @Test 130 public void watchFileLastModifyTime() throws IOException{ 131 Path targetFile=new Path(rootPath+"user/hdfsupload/renameDemoFile"); 132 FileStatus fileStatus=coreSys.getFileStatus(targetFile); 133 Long lastTime=fileStatus.getModificationTime(); 134 Date date=new Date(lastTime); 135 SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 136 System.err.println("文件的最后修改时间为:"+format.format(date)); 137 } 138 /** 139 * 获取某个路径下面的所有文件 140 * @throws IOException 141 */ 142 @Test 143 public void getUnderDirAllFile() throws IOException{ 144 Path targetDir=new Path(rootPath+"user/hdfsupload/"); 145 FileStatus []fileStatus=coreSys.listStatus(targetDir); 146 for(FileStatus file:fileStatus){ 147 System.out.println(file.getPath()+"--"+file.getGroup()+"--"+file.getBlockSize()+"--"+file.getLen()+"--"+file.getModificationTime()+"--"+file.getOwner()); 148 } 149 } 150 /** 151 * 查看某个文件在HDFS集群的位置 152 * @throws IOException 153 */ 154 @Test 155 public void findLocationOnHadoop() throws IOException{ 156 Path targetFile=new Path(rootPath+"user/hdfsupload/AA.txt"); 157 FileStatus fileStaus=coreSys.getFileStatus(targetFile); 158 BlockLocation []bloLocations=coreSys.getFileBlockLocations(fileStaus, 0, fileStaus.getLen()); 159 for(int i=0;i<bloLocations.length;i++){ 160 System.out.println("block_"+i+"_location:"+bloLocations[i].getHosts()[0]); 161 } 162 163 } 164 /** 165 * 获取集群上结点的信息 166 * @throws IOException 167 */ 168 @Test 169 public void getNodeMsgHdfs() throws IOException{ 170 DistributedFileSystem distributedFileSystem=(DistributedFileSystem) coreSys; 171 DatanodeInfo []dataInfos=distributedFileSystem.getDataNodeStats(); 172 for(int j=0;j<dataInfos.length;j++){ 173 System.out.println("DataNode_"+j+"_Name:"+dataInfos[j].getHostName()+"--->"+dataInfos[j].getDatanodeReport()+"-->"+ 174 dataInfos[j].getDfsUsedPercent()+"-->"+dataInfos[j].getLevel()); 175 } 176 } 177 178 }