Hadoop之HDFS

2019-03-29  本文已影响0人  高默思

本篇文章主要介绍分布式文件系统HDFS,常用的操作HDFS的命令 以及对应的JAVA API

Hadoop分布式文件系统(HDFS)

当数据集的大小超过一台独立的物理计算机的存储能力是,有必要对它进行分区并储存多若干单独的计算器上,管理网络中跨多台计算机储存的文件系统称为分布式文件系统,在Hadoop集群中的分布式文件系统称为Hadoop分布式文件系统,简称HDFS。

HDFS特性

HDFS以流式数据访问模式来存储超大文件,运行与商业硬件集群上

HDFS概念

HDFS读写流程图

HDFS的命令行接口

首先要在本地部署Hadoop,并启动。本地部署Hadoop可以查看下面这篇文章
Windos上本地部署Hadoop
相关配置文件解释
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml

在浏览器中 输入http://localhost:50070 打开Hadoop的UI界面

Hadoop的UI界面

HDFS命令行的通用格式
hadoop fs -[命令] [路径]
打开cmd 在HDFS中新建一个文件夹
hadoop fs -mkdir /data


将本地文件导入到HDFS文件系统中去 第一个路径是本地文件路径,第二个是HDFS路径
hadoop fs -put C:\Users\Yong\Desktop\cite75_99.txt /data

HDFS 更多命令可以查看
HDFS Shell 命令大全

HDFS的JAVA接口

在java中把HDFS文件系统抽象成一个Filesystem的抽象类,DistributedFileSystem是这个抽象类的具体实现。在使用HDFS java API的时候需要指定HDFS的接入地址,也就是namenode节点开放的提供给客户端使用的地址和端口号

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
import java.net.URI;
/**
 * @Description: HDFS API操作
 * @Author: Caoyong
 * @Date: 2019/3/28 15:56
 */
public class HDFSApi {

    /**
     * namenode节点的地址和HDFS开放的端口
     */
    public static final String HDFS_PATH = "hdfs://localhost:9000";
    /**
     * HDFS操作对象
     */
    private FileSystem fileSystem;
    /**
     * 封装了客户端或服务端的配置
     */
    private Configuration configuration;
    /**
     * 初始化
     * @throws Exception
     */
    @Before
    public void setFileSystem() throws Exception {
       configuration = new Configuration();
       fileSystem = FileSystem.get(new URI(HDFS_PATH),configuration);
    }
    @Test
    public void createDirectory() throws IOException {
        fileSystem.mkdirs(new Path("/yong/data"));
    }
public void writeHDFS() throws Exception {
        String localPath = "C:\\Users\\Yong\\Desktop\\data.txt";
        String writePath = "/yong/data/data.txt";

        InputStream in = new BufferedInputStream(new FileInputStream(localPath));
        FSDataOutputStream out = fileSystem.create(new Path(writePath), new Progressable() {
            public void progress() {
                /**
                 * Progressable 给写入数据提供写入进度提示 每次写入1024个字节就会打印一个.
                 */
                System.out.print(".");
            }
        });
        /**
         * 第一个参数:表示输入流
         * 第二个参数:表示输出流
         * 第三个参数:表示缓冲区大小
         * 第四个参数:结束是否自动关闭输入输出流
         */
        IOUtils.copyBytes(in,out,1024,true);
    }

通过FileSystem对象的create()方法,传递路径参数以及进度提示参数,打开HDFS文件系统的输入流FSDataOutputStream对象。通过IOUtils工具类将数据出入到HDFS文件系统的指定位置。

public void readHDFS() throws IOException {
        String readPath = "/yong/data/data.txt";
        FSDataInputStream in = fileSystem.open(new Path(readPath));
        IOUtils.copyBytes(in,System.out,1024,false);
        /**
         * seek(int index)重新设置读取流位置
         */
        in.seek(0);
        System.out.println("===============================");
        IOUtils.copyBytes(in,System.out,1024,true);
    }

通过FileSystem对象的open()方法,传递路径参数,打开HDFS文件系统的输出流FSDataInputStream对象。通过IOUtils工具类将HDFS文件系统的指定位置的数据输出。调用seek()方法重新设置读取文件的位置

public void deleteFile() throws IOException {
        /**
         * 最后一个参数:表示如果删除是目录设置true 删除文件设置false
         */
        fileSystem.delete(new Path("/yong/data/data.txt"),false);
    }

Hadoop API的更多方法可以查看FileSystem

上一篇 下一篇

猜你喜欢

热点阅读