02_在window环境开发hadoop_HDFS

2019-01-21  本文已影响0人  会摄影的程序员

1. 在window环境开发HDFS(文件)

1.1. 导入jar包

i. 解压hadoop安装包
ii. 导入/share/hadoop/common/Hadoop-common-2.8.5.jar 以及依赖包 lib下全部jar
iii. 导入/share/haddop/hdfs/hadoop-hdfs-client-2.8.5-tests.jar 以及依赖包lib下全部jar
链接: https://pan.baidu.com/s/1pgyCp17E8IKJ46fM87jZrA 提取码: 3251

1.2. 开始写java代码

先构造Configuration对象
构造时,会先加载jar包中的默认配置xxx-default.xml
再加载用户写的xml 放在src下面 xxx-site.xml 会覆盖默认配置
在代码中可以在此conf.set(name,value);, 会再次覆盖配置

public class HdfsClient {
    public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
        //设置HDFS的配置
        //会从项目的classpath中加载core-default.xml hdfs-default.xml core-site.xml hdfs-site.xml等配置文件
        Configuration conf = new Configuration();
        //设置副本数量为2
        conf.set("dfs.replication","2");
        //指定切块文件大小为64M
        conf.set("dfs.blocksize","64M");

        //构造一个访问指定HDFS系统的客户端对象,参数1.HDFS系统的URL,参数2,客户端指定的参数,参数3.客户端身份
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://vm01:9000/"),conf,"root");

    }
}

1.2.1. 上传文件,删文件

//上传一个文件到hdfs中

fileSystem.copyFromLocalFile(
         new Path("C:\\Users\\81022\\Desktop\\1.txt"),new Path("/javaTest/1.txt"));
 //fileSystem.delete(new Path("/video.zip"),true);
 fileSystem.close();

1.2.2. 下载文件,(需要在windows中配置hadoop环境)

在Windows下配置环境变量 HADOOP_HOME
Window版本
https://drive.google.com/open?id=1JSVGVmxTtTehgzcUenwZXxjjrSBFL6dZ

fileSystem.copyToLocalFile(new Path("/javaTest/1.txt"),new Path("C:\\Users\\81022\\Desktop\\"));

1.2.3. 移动文件,改名

fileSystem.rename(new Path("/1.txt"),new Path("/javaTest/2.txt"));

1.2.4. 创建文件夹

fileSystem.mkdirs(new Path("/xx/yy/zz"));

1.2.5. 读文件

RemoteIterator<LocatedFileStatus> iter = fileSystem.listFiles(new Path("/"), true);
while (iter.hasNext()){
    LocatedFileStatus next = iter.next();
    System.out.println("==============================");
    System.out.println("文件位置+"+next.getPath());
    System.out.println("块大小:"+next.getBlockSize());
    System.out.println("文件副本数量:"+next.getReplication());
}

原始代码

package com.looc.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author chenPeng
 * @version 1.0.0
 * @ClassName HdfsClient.java
 * @Description TODO
 * @createTime 2019年01月18日 16:17:00
 */
public class HdfsClientTest {


    FileSystem fileSystem = null;

    /**
     * 测试查询
     * @Author chenpeng
     * @Description //TODO
     * @Date 19:28
     * @Param []
     * @return void
     **/
    @Test
    public void fondTest() throws IOException {
        RemoteIterator<LocatedFileStatus> iter = fileSystem.listFiles(new Path("/"), true);
        while (iter.hasNext()){
            LocatedFileStatus next = iter.next();
            System.out.println("==============================");
            System.out.println("文件位置+"+next.getPath());
            System.out.println("块大小:"+next.getBlockSize());
            System.out.println("文件副本数量:"+next.getReplication());
        }
        fileSystem.close();
    }

    /**
     * 测试目录及文件查询
     * @Author chenpeng
     * @Description //TODO
     * @Date 19:28
     * @Param []
     * @return void
     **/
    @Test
    public void fondAllTest() throws IOException {
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
        for (FileStatus status:fileStatuses) {
            System.out.println("==============================");
            System.out.println("文件位置+"+status.getPath());
            System.out.println(status.isDirectory()? "这是文件夹":"这是文件");
        }
        fileSystem.close();
    }

    /**
     * 初始化
     * @Author chenpeng
     * @Description //TODO
     * @Date 18:57
     * @Param []
     * @return void
     **/
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        Configuration conf = new Configuration();
        conf.set("dfs.replication","2");
        conf.set("dfs.blocksize","64M");
        fileSystem = FileSystem.get(new URI("hdfs://vm01:9000/"),conf,"root");
    }

    /**
     * 下载文件
     * @Author chenpeng
     * @Description //TODO
     * @Date 18:57
     * @Param []
     * @return void
     **/
    @Test
    public void testGet() throws IOException {
        fileSystem.copyToLocalFile(
                new Path("/javaTest/1.txt"),new Path("C:\\Users\\81022\\Desktop\\"));
        fileSystem.close();
    }
    
    /**
     * 移动文件
     * @Author chenpeng
     * @Description //TODO
     * @Date 19:03 
     * @Param []
     * @return void
     **/
    @Test
    public void renameTest() throws IOException {
        fileSystem.rename(new Path("/1.txt"),new Path("/javaTest/1.txt"));
        fileSystem.close();
    }

    /**
     * 创建目录
     * @Author chenpeng
     * @Description //TODO
     * @Date 19:24
     * @Param []
     * @return void
     **/
    @Test
    public void mkdirTest() throws IOException {
        fileSystem.mkdirs(new Path("/xx/yy/zz"));
        fileSystem.close();
    }

    /**
     * 测试删除文件
     * @Author chenpeng
     * @Description //TODO
     * @Date 18:08
     * @Param [fileSystem]
     * @return void
     **/
    @Test
    public void testDelete() throws IOException {
        fileSystem.delete(new Path("/video.zip"),true);
        fileSystem.close();
    }


    /**
     * 上传文件测试
     * @Author chenpeng
     * @Description //TODO
     * @Date 18:07
     * @Param [fileSystem]
     * @return void
     **/
    @Test
    public void testPut() throws IOException {
        fileSystem.copyFromLocalFile(
                new Path("C:\\Users\\81022\\Desktop\\1.txt"),new Path("/xx/yy/zz/1.txt"));
        fileSystem.close();
    }
}

读取文件中的内容,以及向文件中写内容

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author chenPeng
 * @version 1.0.0
 * @ClassName HdfsReanAndWriteDemo.java
 * @Description TODO
 * @createTime 2019年01月28日 22:37:00
 */
public class HdfsReanAndWriteDemo {
    FileSystem fileSystem;
    private String url = "hdfs://vm01:9000/";
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        fileSystem = FileSystem.get(new URI(url),new Configuration(),"root");
    }

    /**
     * 读取文件
     * @Author chenpeng
     * @Description //TODO
     * @Date 22:54
     * @Param []
     * @return void
     **/
    @Test
    public void readerHdfsDemo() throws IOException {
        FilterInputStream in = fileSystem.open(new Path("/javaTest/2.txt"));

        BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));

        String line = null;
        while ((line = br.readLine())!=null){
            System.out.println(line);
        }

        br.close();
        in.close();
    }

    /**
     * 读取文件 指定位置开始
     * @Author chenpeng
     * @Description //TODO
     * @Date 22:54
     * @Param []
     * @return void
     **/
    @Test
    public void readerRandomHdfsDemo() throws IOException {
        FSDataInputStream in = fileSystem.open(new Path("/javaTest/1.txt"));

        //指定从第三个开始读
        in.seek(4);

        byte[] bs = new byte[4];
        int len = 0;
        while ((len = in.read(bs))!=-1){
            System.out.print(new String(bs,0,len,"gbk"));
        }


        in.close();
    }


    @Test
    public void writeHDFSDemo() throws IOException {
        fileSystem.delete(new Path("/javaTest/2.txt"),true);
        FSDataOutputStream out = fileSystem.create(new Path("/javaTest/2.txt"),true);

        out.write("测试第二行".getBytes());
        out.close();
    }

    @After
    public void last() throws IOException {
        fileSystem.close();
    }
}

上一篇下一篇

猜你喜欢

热点阅读