zoukankan      html  css  js  c++  java
  • Hadoop Java API操作HDFS文件系统(Mac)

    2、关联jar包

      在eclipse中新建项目中,建lib文件夹,把要用的jar包拷贝进来,jar包在解压好的 hadoop-2.9.1/share/hadoop中

      我们这里不拷贝,选择关联你所存放在电脑上的路径

      在项目上右键选择 Bulid Path > Add Libraries > User Library > ok > new > 命名 > ok > Add External JARs > 选择jar包

        

      

          

      然后会看到项目下多了个包

      

    3、开始写代码

    package bigdata.hdfs;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.net.URI;
    import java.util.Iterator;
    import java.util.Map.Entry;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.BlockLocation;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.LocatedFileStatus;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.RemoteIterator;
    import org.junit.Before;
    import org.junit.Test;
    
    /* 客户端操作hdfs时,需要一个用户身份,
     * 默认情况下,hdfs客户端会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=hadoop,
     * 解决方法方法有两种:
     * 1、设置外部参数;
     * 2、在代码中写明,用get方法时,选择三个参数的,将用户名传进去;
     */
    public class HdfsClientDemo {
    	FileSystem fs = null;
    	
    	@Before
    	public void init() throws Exception {
    		Configuration conf = new Configuration();
    		//这里要识别master的话,需要修改本机hosts文件
    		conf.set("fs.defaultFS", "hdfs://master:9000");
    		//拿到一个文件操作系统的客户端实例对象
    		fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "wang");
    	}
    	
    	// 上传
    	@Test
    	public void testUpload() throws Exception {
    		fs.copyFromLocalFile(new Path("/Users/wang/Desktop/upload.jpg"),new Path("/upload_copy.jpg"));
    		fs.close();
    	}
    	
    	//下载
    	@Test
    	public void testDownload() throws Exception {
    		fs.copyToLocalFile(new Path("/upload_copy.jpg"), new Path("/Users/wang/Desktop/download.jpg"));
    		fs.close();
    	}
    	
    	@Test
    	public void testUpload2() throws Exception {
    		//以流的方式上传
    		FSDataOutputStream outputStream = fs.create(new Path("/liu.txt"));
    		FileInputStream inputStream = new FileInputStream("/Users/wang/Desktop/");
    		org.apache.commons.io.IOUtils.copy(inputStream, outputStream);
    	}
    	
    	@Test
    	public void testDownload2() throws Exception {
    		//以流的方式下载
    		FSDataInputStream InputStream= fs.open(new Path("/a.txt"));
    		//指定读取文件的指针的起始位置
    		InputStream.seek(12);
    		FileOutputStream OutputStream = new FileOutputStream("/Users/wang/Desktop/a.txt");
    		org.apache.commons.io.IOUtils.copy(InputStream, OutputStream);
    	}
    	
    	//打印参数
    	@Test
    	public void testConf() {
    		Configuration conf = new Configuration();
    		Iterator<Entry<String, String>> it = conf.iterator();
    		while(it.hasNext()) {
    			Entry<String, String> en = it.next();
    			System.out.println(en.getKey()+':'+en.getValue());
    		}
    	}
    	
    	@Test
    	public void testLs() throws Exception{
    		//递归列出所有文件,返回一个迭代器对象
    		RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
    		while (listFiles.hasNext()) {
    			LocatedFileStatus fileStatus = listFiles.next();
    			System.out.println("blocksize:"+fileStatus.getBlockSize());
    			System.out.println("owner:"+fileStatus.getOwner());
    			System.out.println("Replication:"+fileStatus.getReplication());
    			System.out.println("Permission:"+fileStatus.getPermission());
    			System.out.println("Name:"+fileStatus.getPath().getName());
    			BlockLocation[] blockLocations = fileStatus.getBlockLocations();
    			for(BlockLocation b:blockLocations) {
    				System.out.println("块起始偏移量"+b.getOffset());
    				System.out.println("块长度"+b.getLength());
    				String[] hosts = b.getHosts();
    				//块所在的datanode节点
    				for(String host:hosts) {
    					System.out.println("datanode:"+host);
    				}
    			}
    			System.out.println("--------------------");
    		}
    	}
    	
    	@Test
    	public void testLs2() throws Exception {
    		//只列出一个层级
    		FileStatus[] listStatus = fs.listStatus(new Path("/"));
    		for(FileStatus file:listStatus) {
    			System.out.print("name:"+file.getPath().getName()+",");
    			System.out.println((file.isFile()?"file":"directory"));
    		}
    	}
    }
    

      

      

  • 相关阅读:
    struts 多文件上传 xml 版本
    struts 多文件上传 annotation注解(零配置)+ ajaxfileupload + 异步 版本
    struts 文件下载 annotation 注解版
    servlet 通过 FileItem 实现多文件上传
    servlet 文件下载
    MySQL抑制binlog日志中的BINLOG部分的方法
    基于PHP的一种Cache回调与自动触发技术
    php面向对象的简单总结 $this $parent self
    nodeJs基础方法
    JavaScript 中的多线程通信的方法
  • 原文地址:https://www.cnblogs.com/chaofan-/p/9742727.html
Copyright © 2011-2022 走看看