Bootstrap

2、HDFS编程实践

目的:
熟练使用HDFS操作常用的Shell命令
熟悉HDFS操作常用的Java API
在这里插入图片描述

1、Hadoop三种Shell方式

在这里插入图片描述

(1)目录操作

1、查看目录

在这里插入图片描述

2、创建目录

在这里插入图片描述

3、删除目录

在这里插入图片描述

(2)文件操作

1、创建文件

在这里插入图片描述

2、上传文件

在这里插入图片描述

3、下载文件

在这里插入图片描述

4、拷贝文件

在这里插入图片描述

2、利用Web界面管理HDFS

启动HDF、在浏览器输入http://localhost:9870

./sbin/start-dfs.sh

在这里插入图片描述
在这里插入图片描述

3、利用Java API 与 HDFS 进行交互

在这里插入图片描述

(1)安装eclipse包

链接: link

链接:https://pan.baidu.com/s/1V_XVDTl4zGcT5gXx7Z2qDA
提取码:1vy7

在这里插入图片描述

(2)使用 Eclipse 开发试 调试 HDFS Java 程序

import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

/**
 * 过滤掉文件名满足特定条件的文件
 */
class MyPathFilter implements PathFilter {
    String reg = null;

    MyPathFilter(String reg) {
        this.reg = reg;
    }

    public boolean accept(Path path) {
        if (!(path.toString().matches(reg))) {
            return true;
        }
        return false;
    }
}

/**
 * 利用 FSDataOutputStream 和 FSDataInputStream 合并 HDFS 中的文件
 */
public class MergeFile {
    Path inputPath = null; // 待合并的文件所在的目录的路径
    Path outputPath = null; // 输出文件的路径

    public MergeFile(String input, String output) {
        this.inputPath = new Path(input);
        this.outputPath = new Path(output);
    }

    public void doMerge() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
        FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);

        // 下面过滤掉输入目录中后缀为.abc 的文件
        FileStatus[] sourceStatus = fsSource.listStatus(inputPath, new MyPathFilter(".*\\.abc"));
        FSDataOutputStream fsdos = fsDst.create(outputPath);
        PrintStream ps = new PrintStream(System.out);

        // 下面分别读取过滤之后的每个文件的内容,并输出到同一个文件中
        for (FileStatus sta : sourceStatus) {
            // 下面打印后缀不为.abc 的文件的路径、文件大小
            System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen()
                    + " 权限:" + sta.getPermission() + " 内容:");
            FSDataInputStream fsdis = fsSource.open(sta.getPath());
            byte[] data = new byte[1024];
            int read = -1;
            while ((read = fsdis.read(data)) > 0) {
                ps.write(data, 0, read);
                fsdos.write(data, 0, read);
            }
            fsdis.close();
        }
        ps.close();
        fsdos.close();
    }

    public static void main(String[] args) throws IOException {
        MergeFile merge = new MergeFile(
                "hdfs://localhost:9000/user/damon/",
                "hdfs://localhost:9000/user/damon/merge.txt");
        merge.doMerge();
    }
}

在这里插入图片描述

(3)编译运行程序

1、启动HDFS

cd /usr/local/hadoop #进入 hadoop 安装目录
./sbin/start-dfs.sh #启动 hdfs
jps #查看进程
./bin/hdfs dfs -ls / #查看根目录下内容
./bin/hdfs dfs -ls/user #查看/user 目录下内容

2、创建文件

在这里插入图片描述

3、上传文件

在这里插入图片描述

4、回到eclipse

运行文件:
在这里插入图片描述

5、在HDFS查看merge.txt的内容

在这里插入图片描述

(4)部署用户程序

1、创建目录

在这里插入图片描述

2、将程序打包成JAR包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、删除merge.txt

在这里插入图片描述

4、运行jar包

./bin/hadoop jar ./myapp/HDFSexample.jar

在这里插入图片描述
在这里插入图片描述

(5)、关闭HDFS

在这里插入图片描述

;