HDFS读写文件操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS读写文件操作相关的知识,希望对你有一定的参考价值。

1    运行环境说明

1.1     硬软件环境

1.2     机器网络环境

2    书面作业1:编译并运行《权威指南》中的例3.2

2.1     书面作业1内容

2.2     运行代码

2.3     实现过程

2.3.1   创建代码目录

2.3.2   建立例子文件上传到hdfs

2.3.3   配置本地环境

2.3.4   编写代码

2.3.5   编译代码

2.3.6   使用编译代码读取文件

3    书面作业2:写入HDFS成为一个新文件

3.1    书面作业2内容

3.2    运行代码

3.3    实现过程

3.3.1   编写代码

3.3.2   编译代码

3.3.3   建立测试文件

3.3.4   使用编译代码上传文件内容到hdfs

3.3.5   验证是否成功

4    书面作业3:作业2反向操作

4.1    书面作业2内容

4.2    程序代码

4.3    实现过程

4.3.1   编写代码

4.3.2   编译代码

4.3.3   建立测试文件

4.3.4   使用编译代码把文件内容从hdfs输出到文件系统中

4.3.5   验证是否成功

 

1    运行环境说明

1.1  硬软件环境

l  主机操作系统:Windows 64 bit,双核4线程,主频2.2G6G内存

l  虚拟软件:VMware Workstation 9.0.0 build-812388

l  虚拟机操作系统:CentOS 64位,单核,1G内存

l  JDK1.7.0_55 64 bit

l  Hadoop1.1.2

1.2  机器网络环境

该开发机器处于能连接互联网的局域网中,具体信息为:

序号

IP地址

机器名

类型

用户名

运行进程

1

10.88.147.220

Hadoop0

单机节点

hadoop

NNSNNTaskTracerDNJobTracer

2    书面作业1:编译并运行《权威指南》中的例3.2

2.1  书面作业1内容

Hadoop集群中编译并运行《权威指南》中的例3.2

2.2  运行代码

import java.io.InputStream;

 

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.*;

import org.apache.hadoop.io.IOUtils;

 

publicclass FileSystemCat {

    publicstaticvoid main(String[] args) throws Exception {

        String uri = args[0];

        Configuration conf = new Configuration();

    FileSystem fs = FileSystem. get(URI.create (uri), conf);

    InputStream in = null;

    try {

         in = fs.open( new Path(uri));

         IOUtils.copyBytes(in, System.out, 4096, false);

        finally {

         IOUtils.closeStream(in);

        }

    }

}

2.3  实现过程

Hadoop集群中编译并运行《权威指南》中的例3.2

2.3.1创建代码目录

启动Hadoop,在/usr/local/hadoop-1.1.2目录下使用如下命令建立myclassinput目录:

mkdir myclass

mkdir input

技术分享

2.3.2建立例子文件上传到hdfs

进入/usr/local/hadoop-1.1.2/input目录,在该目录中建立quangle.txt文件,内容为:

技术分享

使用如下命令在hdfs中建立/usr/hadoop/文件夹

hadoop fs -mkdir /usr/hadoop/

hadoop fs -ls /usr/

技术分享

把例子文件上传到hdfs/usr/hadoop/文件夹中

hadoop fs -copyFromLocal ../input/quangle.txt /usr/hadoop/quangle.txt

hadoop fs -ls /usr/hadoop

技术分享

2.3.3配置本地环境

/usr/local/hadoop-1.1.2/conf目录中的hadoop-env.sh进行配置,如下如所示:

ls

vi hadoop-env.sh

技术分享

加入对HADOOP_CLASPATH变量值,值为/usr/local/hadoop-1.1.2/myclass

技术分享

2.3.4编写代码

进入/usr/local/hadoop-1.1.2/myclass目录,在该目录中建立FileSystemCat.java代码文件,命令如下:

cd /usr/local/hadoop-1.1.2/myclass/

vi FileSystemCat.java

技术分享

输入代码内容:

技术分享

2.3.5编译代码

/usr/local/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:

javac -classpath ../hadoop-core-1.1.2.jar FileSystemCat.java

ls

技术分享

2.3.6使用编译代码读取文件

使用如下命令读取quangle.txt内容:

hadoop FileSystemCat /usr/hadoop/quangle.txt

技术分享

3    书面作业2:写入HDFS成为一个新文件

3.1  书面作业2内容

自行在本地文件系统生成一个大约100字节的文本文件,写一段程序(可以利用Java APIC API),读入这个文件,并将其第101-120字节的内容写入HDFS成为一个新文件,提供代码和执行结果演示抓图

3.2  运行代码

注意:在编译前请先删除中文注释!

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.net.URI;

 

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import org.apache.hadoop.util.Progressable;

 

publicclass LocalFile2Hdfs {

    publicstaticvoid main(String[] args) throws Exception {

 

        // 获取读取源文件和目标文件位置参数

        String local = args[0];

        String uri = args[1];

       

        FileInputStream in = null;

        OutputStream out = null;

        Configuration conf = new Configuration();

        try {

            // 获取读入文件数据

            in = new FileInputStream(new File(local));

 

            // 获取目标文件信息

            FileSystem fs = FileSystem.get(URI.create(uri), conf);

            out = fs.create(new Path(uri), new Progressable() {

                @Override

                publicvoid progress() {

                    System.out.println("*");

                }

            });

 

            // 跳过前100个字符

            in.skip(100);

            byte[] buffer = newbyte[20];

               

            // 101的位置读取20个字符到buffer

            int bytesRead = in.read(buffer);

            if (bytesRead >= 0) {

                out.write(buffer, 0, bytesRead);

            }

        finally {

            IOUtils.closeStream(in);

            IOUtils.closeStream(out);

        }      

    }

}

3.3  实现过程

3.3.1编写代码

进入/usr/local/hadoop-1.1.2/myclass目录,在该目录中建立LocalFile2Hdfs.java代码文件,命令如下:

cd /usr/local/hadoop-1.1.2/myclass/

vi LocalFile2Hdfs.java

技术分享

输入代码内容:

技术分享

3.3.2编译代码

/usr/local/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:

javac -classpath ../hadoop-core-1.1.2.jar LocalFile2Hdfs.java

ls

技术分享

3.3.3建立测试文件

进入/usr/local/hadoop-1.1.2/input目录,在该目录中建立local2hdfs.txt文件,内容为:

cd /usr/local/hadoop-1.1.2/input/

vi local2hdfs.txt

技术分享

技术分享

3.3.4使用编译代码上传文件内容到hdfs

使用如下命令读取local2hdfs101-120字节的内容写入HDFS成为一个新文件:

cd /usr/local/hadoop-1.1.2/bin/

hadoop LocalFile2Hdfs ../input/local2hdfs.txt /usr/hadoop/local2hdfs_part.txt

技术分享

3.3.5验证是否成功

使用如下命令读取local2hdfs_part.txt内容:

hadoop fs -cat /usr/hadoop/local2hdfs_part.txt

技术分享

4    书面作业3:作业2反向操作

4.1  书面作业2内容

2的反向操作,在HDFS中生成一个大约100字节的文本文件,写一段程序(可以利用Java APIC API),读入这个文件,并将其第101-120字节的内容写入本地文件系统成为一个新文件,提供代码和执行结果演示抓图

4.2  程序代码

 

4.3  实现过程

4.3.1编写代码

进入/usr/local/hadoop-1.1.2/myclass目录,在该目录中建立Hdfs2LocalFile.java代码文件,命令如下:

cd /usr/local/hadoop-1.1.2/myclass/

vi Hdfs2LocalFile.java

技术分享

输入代码内容:

技术分享

4.3.2编译代码

/usr/local/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:

javac -classpath ../hadoop-core-1.1.2.jar Hdfs2LocalFile.java

ls

技术分享

4.3.3建立测试文件

进入/usr/local/hadoop-1.1.2/input目录,在该目录中建立hdfs2local.txt文件,内容为:

cd /usr/local/hadoop-1.1.2/input/

vi hdfs2local.txt

技术分享

技术分享

把该文件上传到hdfs/usr/hadoop/文件夹中

cd /usr/local/hadoop-1.1.2/bin/

hadoop fs -copyFromLocal ../input/hdfs2local.txt /usr/hadoop/hdfs2local.txt

hadoop fs -ls /usr/hadoop

技术分享

4.3.4使用编译代码把文件内容从hdfs输出到文件系统中

使用如下命令读取hdfs2local.txt101-120字节的内容写入本地文件系统成为一个新文件:

hadoop Hdfs2LocalFile /usr/hadoop/hdfs2local.txt ../input/hdfs2local_part.txt

ls ../input

技术分享

4.3.5验证是否成功

使用如下命令读取hdfs2local_part.txt内容:

cat ../input/hdfs2local_part.txt

技术分享


以上是关于HDFS读写文件操作的主要内容,如果未能解决你的问题,请参考以下文章

06Hadoop框架HDFS读写流程

HDFS原理解析(总体架构,读写操作流程)

关于hadoop HDFS进行读写文件操作的问题

大数据系列2:Hdfs的读写操作

HDFS进阶——文件存储和读写流程

HDFS 客户端读写操作详情