zoukankan      html  css  js  c++  java
  • java api 远程连接 hdfs

    IDEA中新建Maven工程,添加POM依赖, 在IDE的提示中, 点击 Import Changes 等待自动下载完成相关的依赖包。

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.itcast</groupId>
        <artifactId>example-hdfs</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.7.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>2.7.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.7.5</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>RELEASE</version>
            </dependency>
        </dependencies>
    
    </project>
    复制代码

    启动hadoop后, 在IDEA中测试mkdir, put, get  创建文件夹,上传,下载

    复制代码
    package cn.lshm.hdfs;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.io.FileInputStream;
    
    public class TestHDFSClient {
        public static void main(String[] args) throws Exception {
    
            Configuration conf = new Configuration();
    
            //这里指定使用的是 hdfs文件系统
            conf.set("fs.defaultFS", "hdfs://master:9000");
    
            //通过这种方式设置java客户端身份
            System.setProperty("HADOOP_USER_NAME", "root");
            FileSystem fs = FileSystem.get(conf);
            //或者使用下面的方式设置客户端身份
            //FileSystem fs = FileSystem.get(new URI("hdfs://master:9000"),conf,"root");
    
            // fs.create(new Path("/helloByJava")); //创建一个目录
    
            //文件下载到本地 如果出现0644错误或找不到winutils.exe,则需要设置windows环境和相关文件.
            //fs.copyToLocalFile(new Path("/zookeeper.out"), new Path("D:\test\examplehdfs"));
    
    
            //使用Stream的形式操作HDFS,这是更底层的方式
            FSDataOutputStream outputStream = fs.create(new Path("/2.txt"), true); //输出流到HDFS
            FileInputStream inputStream = new FileInputStream("D:/test/examplehdfs/1.txt"); //从本地输入流。
            IOUtils.copy(inputStream, outputStream); //完成从本地上传文件到hdfs
    
            fs.close();
        }
    }
    复制代码

    Run之后,没有报错,到hdfs上查看,是否有对应的结果。

    最后,老师创建了一个类,方便调用。

    复制代码
    package cn.lshm.hdfs;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.BlockLocation;
    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;
    
    public class HdfsClient {
    
        FileSystem fs = null;
    
        @Before
        public void init() throws Exception {
    
    
            Configuration conf = new Configuration();
            // conf.set("fs.defaultFS", "hdfs://node-1:9000");
            /**
             * 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是jar中默认配置
             */
            // 获取一个hdfs的访问客户端
            fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "root");
    
        }
    
        /**
         * 往hdfs上传文件
         * 
         * @throws Exception
         */
        @Test
        public void testAddFileToHdfs() throws Exception {
    
            // 要上传的文件所在的本地路径
    
            // 要上传到hdfs的目标路径*/
            Path src = new Path("d:/GameLog.txt");
            Path dst = new Path("/");
            fs.copyFromLocalFile(src, dst);
    
            fs.close();
        }
    
        /**
         * 从hdfs中复制文件到本地文件系统
         * 
         * @throws IOException
         * @throws IllegalArgumentException
         */
        @Test
        public void testDownloadFileToLocal() throws IllegalArgumentException, IOException {
    
            // fs.copyToLocalFile(new Path("/mysql-connector-java-5.1.28.jar"), new
            // Path("d:/"));
            fs.copyToLocalFile(false, new Path("/install.log.syslog"), new Path("e:/"), true);
            fs.close();
    
        }
    
        /**
         * 目录操作
         * 
         * @throws IllegalArgumentException
         * @throws IOException
         */
        @Test
        public void testMkdirAndDeleteAndRename() throws IllegalArgumentException, IOException {
    
            // 创建目录
            fs.mkdirs(new Path("/a1/b1/c1"));
    
            // 删除文件夹 ,如果是非空文件夹,参数2必须给值true ,删除所有子文件夹
            fs.delete(new Path("/aaa"), true);
    
            // 重命名文件或文件夹
            fs.rename(new Path("/a1"), new Path("/a2"));
    
        }
    
        /**
         * 查看目录信息,只显示文件
         * 
         * @throws IOException
         * @throws IllegalArgumentException
         * @throws FileNotFoundException
         */
        @Test
        public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
    
            
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
    
            while (listFiles.hasNext()) {
    
                LocatedFileStatus fileStatus = listFiles.next();
    
                System.out.println(fileStatus.getPath().getName());
                System.out.println(fileStatus.getBlockSize());
                System.out.println(fileStatus.getPermission());
                System.out.println(fileStatus.getLen());
                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                for (BlockLocation bl : blockLocations) {
                    System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset());
                    String[] hosts = bl.getHosts();
                    for (String host : hosts) {
                        System.out.println(host);
                    }
    
                }
    
                System.out.println("--------------打印的分割线--------------");
    
            }
    
        }
    
        /**
         * 查看文件及文件夹信息
         * 
         * @throws IOException
         * @throws IllegalArgumentException
         * @throws FileNotFoundException
         */
        @Test
        public void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException {
            //可以右击方法名,Run 测试一下。
            FileStatus[] listStatus = fs.listStatus(new Path("/"));
    
            String flag = "";
            for (FileStatus fstatus : listStatus) {
    
                if (fstatus.isFile()) {
                    flag = "f-- ";
                } else {
                    flag = "d-- ";
                }
                System.out.println(flag + fstatus.getPath().getName());
                System.out.println(fstatus.getPermission());
    
            }
    
        }
    
    }
  • 相关阅读:
    ModelBinder——ASP.NET MVC Model绑定的核心
    asp.net
    深入C#内存管理来分析 值类型、引用类型、装箱、拆箱、堆栈几个概念
    C#网络编程
    [Architecture Pattern] Service Locator
    RestSharp使用详解
    系统性能优化一例
    C#开发的高性能EXCEL导入、导出工具DataPie
    ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider
    ASP.NET MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider
  • 原文地址:https://www.cnblogs.com/zhouwenfan-home/p/12310172.html
Copyright © 2011-2022 走看看