• HDFS JAVA API


    实验目的

    1.掌握HDFS JAVA API的

    2.了解JAVA API的执行流程

    相关知识

    1.HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础篇,为了实现本地与HDFS的文件传输,主要借助Eclipse开发环境,通过java编程实现了远程HDFS的文件创建,上传,下载,删除等。

    其实对HDSF的文件操作主要有两种方式:命令行的方式和JavaAPI的方式。命令行的方式简单直接,但是必须要求本地机器也是在Linux系统中已经安装了hadoop,这对习惯用windows系统的用户来说不得不安装虚拟机,然后再在虚拟机上安装Linux系统,这是一种挑战。同时windows系统与虚拟机上安装的Linux系统进行文件传输也是要借助一些工具才可以实现。

    为了实现以上所遇到诸如系统不一致,手动输入命令等的困扰,我们选择Java API的方式,有专门的API函数,可以在非Hadoop机器上实现访问,同时与系统无关(windows、Linux甚至XP系统也可以)。Hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,Hadoop类库中最终面向用户提供的接口类是FileSystem,该类封装了几乎所有的文件操作,例如CopyToLocalFile、CopyFromLocalFile、mkdir及delete等。综上基本上可以得出操作文件的程序库框架:

    operator( ) {

    得到Configuration对象

    得到FileSystem对象

    进行文件操作 }

    2.下面介绍实现上述程序库框架中各个操作的具体步骤

    Java抽象类org.apache.hadoop.fs.FileSystem定义了hadoop的一个文件系统接口。该类是一个抽象类,通过以下两种静态工厂方法可以过去FileSystem实例:

    public static FileSystem.get(Configuration conf) throws IOException

    public static FileSystem.get(URI uri, Configuration conf) throws IOException

    HDFS上的文件创建,上传,下载,删除等操作的具体方法实现:

    (1)public boolean mkdirs(Path f) throws IOException

    一次性新建所有目录(包括父目录), f是完整的目录路径。

    (2)public FSOutputStream create(Path f) throws IOException

    创建指定path对象的一个文件,返回一个用于写入数据的输出流

    create()有多个重载版本,允许我们指定是否强制覆盖已有的文件、文件备份数量、写入文件缓冲区大小、文件块大小以及文件权限。

    (3)public boolean copyFromLocal(Path src, Path dst) throws IOException

    将本地文件拷贝到文件系统

    (4)public boolean exists(Path f) throws IOException

    检查文件或目录是否存在

    (5)public boolean delete(Path f, Boolean recursive)

    永久性删除指定的文件或目录,如果f是一个空目录或者文件,那么recursive的值就会被忽略。只有recursive=true时,一个非空目录及其内容才会被删除。

    (6)FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、备份、修改时间、所有者以及权限信息。

    系统环境

    Linux Ubuntu 16.04

    jdk-7u75-linux-x64

    hadoop-2.6.0-cdh5.4.5

    hadoop-2.6.0-eclipse-cdh5.4.5.jar

    eclipse-java-juno-SR2-linux-gtk-x86_64

    任务内容

    本实验涉及到使用Java API对HDFS的一些基本操作。

    1.创建类MakeDir.class,在HDFS的根目录下,创建名为hdfstest的目录。

    2.创建类TouchFile.class,在HDFS的目录/hdfstest下,创建名为touchfile的文件。

    3.创建类CopyFromLocalFile.class,将linux本地文件/data/mydata/sample_data,上传到HDFS文件系统的/hdfstest目录下。

    4.创建类CopyToLocalFile.class,将HDFS文件系统上的文件/hdfstest/sample_data,下载到本地/data/mydata/copytolocal 。

    5.创建类ListFiles.class,列出HDFS文件系统/hdfstest目录下,所有的文件,以及文件的权限、用户组、所属用户。

    6.创建类IteratorListFiles.class,列出HDFS文件系统/根目录下,以及各级子目录下,所有文件以及文件的权限、用户组,所属用户。

    7.了解FileSystem类下的方法,例如:判断文件是否存在、删除文件、重命名文件等。

    8.创建类LocateFile.class,查看HDFS文件系统上,文件/hdfstest/sample_data的文件块信息。

    9.创建类WriteFile.class,在HDFS上,创建/hdfstest/writefile文件,并在文件中写入内容“hello world hello data!”。

    10.创建类PutMerge.class,将Linux本地文件夹/data/mydata/下的所有文件,上传到HDFS上并合并成一个文件/hdfstest/mergefile。

    任务步骤

    1.切换目录到/apps/hadoop/sbin下,启动hadoop。

    1. cd /apps/hadoop/sbin  
    2. ./start-all.sh  

    在Linux本地创建/data/hadoop4目录。

    1. mkdir -p /data/hadoop4  

    2.切换到/data/hadoop4目录,用wget命令,从http://192.168.1.100:60000/allfiles/hadoop4/网址上下载依赖包hadoop2lib.tar.gz,并解压到当前目录。

    1. cd /data/hadoop4  
    2. wget http://192.168.1.100:60000/allfiles/hadoop4/hadoop2lib.tar.gz  
    3. tar zxvf hadoop2lib.tar.gz  

    3.新建JAVA项目,名为hadoop4。

    4.在hadoop4项目下新建包,名为my.hdfs。

    5.在hadoop4项目下创建目录,名为hadoop4lib,用于存放项目所需依赖包。

    6.从/data/hadoop4/hadoop2lib目录下拷贝所有jar包到项目下的hadoop4lib目录。

    选中hadoop4lib里面的所有jar包,右键点击BuildPath=>Add to Build Path选项。

    这样就将jar包加载到项目里面了,然后是进行Java API对HDFS的各种基本操作。

    7.在my.hdfs包下,新建类MakeDir,程序功能是在HDFS的根目录下,创建名为hdfstest的目录。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FileSystem;  
    7. import org.apache.hadoop.fs.Path;  
    8. public class MakeDir {  
    9.     public static void main(String[] args) throws IOException, URISyntaxException {  
    10.         Configuration conf = new Configuration();  
    11.   
    12.         String hdfsPath = "hdfs://localhost:9000";  
    13.         FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);  
    14.   
    15.         String newDir = "/hdfstest";  
    16.   
    17.         boolean result = hdfs.mkdirs(new Path(newDir));  
    18.         if (result) {  
    19.             System.out.println("Success!");  
    20.         }else {  
    21.             System.out.println("Failed!");  
    22.         }  
    23.     }  
    24. }  

    在Eclipse里执行,然后在HDFS上查看实验结果。

    1. hadoop fs -ls -R  /  

    8.在my.hdfs包下,新建类TouchFile,程序功能是在HDFS的目录/hdfstest下,创建名为touchfile的文件。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FSDataOutputStream;  
    7. import org.apache.hadoop.fs.FileSystem;  
    8. import org.apache.hadoop.fs.Path;  
    9. public class TouchFile {  
    10.     public static void main(String[] args) throws IOException, URISyntaxException {  
    11.         Configuration configuration = new Configuration();  
    12.   
    13.         String hdfsPath = "hdfs://localhost:9000";  
    14.         FileSystem hdfs = FileSystem.get(new URI(hdfsPath), configuration);  
    15.   
    16.         String filePath = "/hdfstest/touchfile";  
    17.   
    18.         FSDataOutputStream create = hdfs.create(new Path(filePath));  
    19.   
    20.         System.out.println("Finish!");  
    21.     }  
    22. }  

    在Eclipse里执行,然后在hdfs上查看实验结果。

    1. hadoop fs -ls -R /  

    9.在/data/hadoop4下使用vim打开sample_data文件,

    1. cd /data/hadoop4  
    2. vim sample_data  

    向sample_data文件中写入hello world。(使用vim编辑时,需输入a,开启输入模式)

    1. hello world  

    在my.hdfs包下,创建类CopyFromLocalFile.class,程序功能是将本地linux操作系统上的文件/data/hadoop4/sample_data,上传到HDFS文件系统的/hdfstest目录下。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FileSystem;  
    7. import org.apache.hadoop.fs.Path;  
    8. public class CopyFromLocalFile {  
    9.     public static void main(String[] args) throws IOException, URISyntaxException {  
    10.         Configuration conf = new Configuration();  
    11.         String hdfsPath = "hdfs://localhost:9000";  
    12.         FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);  
    13.         String from_Linux = "/data/hadoop4/sample_data";  
    14.         String to_HDFS = "/hdfstest/";  
    15.         hdfs.copyFromLocalFile(new Path(from_Linux), new Path(to_HDFS));  
    16.         System.out.println("Finish!");  
    17.     }  
    18. }  

    在Eclipse里执行,然后在HDFS上查看实验结果。

    1. hadoop fs -ls -R  /  

    10.在/data/hadoop4/下创建目录copytolocal。

    1. mkdir /data/hadoop4/copytolocal  

    在my.hdfs包下,创建类CopyToLocalFile.class,程序功能是将HDFS文件系统上的文件/hdfstest/sample_data,下载到本地/data/hadoop4/copytolocal 。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FileSystem;  
    7. import org.apache.hadoop.fs.Path;  
    8. public class CopyToLocalFile {  
    9.     public static void main(String[] args) throws IOException, URISyntaxException {  
    10.         Configuration conf = new Configuration();  
    11.   
    12.         String hdfsPath = "hdfs://localhost:9000";  
    13.         FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);  
    14.   
    15.         String from_HDFS = "/hdfstest/sample_data";  
    16.         String to_Linux = "/data/hadoop4/copytolocal";  
    17.   
    18.         hdfs.copyToLocalFile(false, new Path(from_HDFS), new Path(to_Linux));  
    19.   
    20.         System.out.println("Finish!");  
    21.     }  
    22. }  

    在Eclipse里执行,然后在Linux本地/data/hadoop4上查看实验结果。

    1. cd /data/hadoop4/copytolocal  
    2. ls  

    11.在my.hdfs包下,新建类ListFiles,程序功能是列出HDFS文件系统/hdfstest目录下,所有的文件,以及文件的权限、用户组、所属用户。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import org.apache.hadoop.conf.Configuration;  
    5. import org.apache.hadoop.fs.FileStatus;  
    6. import org.apache.hadoop.fs.FileSystem;  
    7. import org.apache.hadoop.fs.Path;  
    8. public class ListFiles {  
    9.     public static void main(String[] args) throws IOException {  
    10.         Configuration conf = new Configuration();  
    11.         String hdfspath = "hdfs://localhost:9000/";  
    12.         FileSystem hdfs = FileSystem.get(URI.create(hdfspath), conf);  
    13.         String watchHDFS = "/hdfstest";  
    14.         FileStatus[] files = hdfs.listStatus(new Path(watchHDFS));  
    15.         for (FileStatus file : files) {  
    16.             System.out.println(file.getPermission() + " " + file.getOwner()  
    17.                     + " " + file.getGroup() + " " + file.getPath());  
    18.         }  
    19.     }  
    20. }  

    在Eclipse里执行,然后在Eclipse的控制界面Console上查看实验结果。

    12.在my.hdfs包下,新建类IteratorListFiles,程序功能是列出HDFS文件系统/根目录下,以及各级子目录下,所有文件以及文件的权限、用户组,所属用户。

    1. package my.hdfs;  
    2. import java.io.FileNotFoundException;  
    3. import java.io.IOException;  
    4. import java.net.URI;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FileStatus;  
    7. import org.apache.hadoop.fs.FileSystem;  
    8. import org.apache.hadoop.fs.Path;  
    9. public class IteratorListFiles {  
    10.     public static void main(String[] args) throws IOException {  
    11.         Configuration conf = new Configuration();  
    12.         String hdfspath = "hdfs://localhost:9000/";  
    13.         FileSystem hdfs = FileSystem.get(URI.create(hdfspath), conf);  
    14.         String watchHDFS = "/";  
    15.   
    16.         iteratorListFile(hdfs, new Path(watchHDFS));  
    17.     }  
    18.     public static void iteratorListFile(FileSystem hdfs, Path path)  
    19.             throws FileNotFoundException, IOException {  
    20.         FileStatus[] files = hdfs.listStatus(path);  
    21.         for (FileStatus file : files) {  
    22.             if (file.isDirectory()) {  
    23.                 System.out.println(file.getPermission() + " " + file.getOwner()  
    24.                         + " " + file.getGroup() + " " + file.getPath());  
    25.                 iteratorListFile(hdfs, file.getPath());  
    26.             } else if (file.isFile()) {  
    27.                 System.out.println(file.getPermission() + " " + file.getOwner()  
    28.                         + " " + file.getGroup() + " " + file.getPath());  
    29.             }  
    30.         }  
    31.     }  
    32. }  

    在Eclipse里执行,然后在Eclipse的控制界面Console上查看实验结果。

    13.文件是否存在、删除文件、重命名文件

    了解FileSystem类下的方法,例如:判断文件是否存在、删除文件、重命名文件等。

    FileSystem的方法exists、delete、rename。

    exists

    rename

    delete

    用于查看文件块的信息。

    14.在my.hdfs包下,新建类LocateFile,程序功能是查看HDFS文件系统上,文件/hdfstest/sample_data的文件块信息。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.BlockLocation;  
    7. import org.apache.hadoop.fs.FileStatus;  
    8. import org.apache.hadoop.fs.FileSystem;  
    9. import org.apache.hadoop.fs.Path;  
    10. public class LocateFile {  
    11.     public static void main(String[] args) throws IOException, URISyntaxException {  
    12.         Configuration conf = new Configuration();  
    13.         String hdfsPath = "hdfs://localhost:9000";  
    14.         FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);  
    15.   
    16.         Path file = new Path("/hdfstest/sample_data");  
    17.         FileStatus fileStatus = hdfs.getFileStatus(file);  
    18.   
    19.         BlockLocation[] location = hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());  
    20.         for (BlockLocation block : location) {  
    21.             String[] hosts = block.getHosts();  
    22.             for (String host : hosts) {  
    23.                 System.out.println("block:" +block + " host:"+ host);  
    24.             }  
    25.         }  
    26.     }  
    27. }  

    在Eclipse里执行,然后在Eclipse的控制界面Console上查看实验结果。

    15.在my.hdfs包下,新建类WriteFile,程序功能是在HDFS上,创建/hdfstest/writefile文件并在文件中写入内容“hello world hello data!”。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import org.apache.hadoop.conf.Configuration;  
    5. import org.apache.hadoop.fs.FSDataOutputStream;  
    6. import org.apache.hadoop.fs.FileSystem;  
    7. import org.apache.hadoop.fs.Path;  
    8. public class WriteFile {  
    9.     public static void main(String[] args) throws IOException {  
    10.         Configuration conf = new Configuration();  
    11.   
    12.         String hdfsPath = "hdfs://localhost:9000";  
    13.         FileSystem hdfs = FileSystem.get(URI.create(hdfsPath), conf);  
    14.   
    15.         String filePath = "/hdfstest/writefile";  
    16.   
    17.         FSDataOutputStream create = hdfs.create(new Path(filePath));  
    18.   
    19.         System.out.println("Step 1 Finish!");  
    20.   
    21.         String sayHi = "hello world hello data!";  
    22.         byte[] buff = sayHi.getBytes();  
    23.         create.write(buff, 0, buff.length);  
    24.         create.close();  
    25.         System.out.println("Step 2 Finish!");  
    26.     }  
    27. }  

    在Eclipse里执行,然后在HDFS上查看实验结果。

    1. hadoop fs -ls -R /hdfstest  
    2. hadoop fs -cat /hdfstest/writefile  

    16.首先切换到/data/hadoop4目录下,将该目录下的所有文件删除(此时要求/data/hadoop4中必须全是文件,不能有目录)。

    1. cd /data/hadoop4  
    2. rm -r /data/hadoop4/*  

    然后在该目录下新建两文件,分别命名为file1 ,file2。

    1. touch file1  
    2. touch file2  

    向file1和file2中,分别输入内容如下

    1. echo "hello file1" > file1  
    2. echo "hello file2" > file2  

    在my.hdfs包下,新建类PutMerge,程序功能是将Linux本地文件夹/data/hadoop4/下的所有文件,上传到HDFS上并合并成一个文件/hdfstest/mergefile。

    1. package my.hdfs;  
    2. import java.io.IOException;  
    3. import java.net.URI;  
    4. import java.net.URISyntaxException;  
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.FSDataInputStream;  
    7. import org.apache.hadoop.fs.FSDataOutputStream;  
    8. import org.apache.hadoop.fs.FileStatus;  
    9. import org.apache.hadoop.fs.FileSystem;  
    10. import org.apache.hadoop.fs.Path;  
    11. public class PutMerge {  
    12.     public static void main(String[] args) throws IOException, URISyntaxException {  
    13.         Configuration conf = new Configuration();  
    14.         String hdfsPath = "hdfs://localhost:9000";  
    15.         FileSystem hdfs  = FileSystem.get(new URI(hdfsPath), conf);  
    16.         FileSystem local = FileSystem.getLocal(conf);  
    17.         String from_LinuxDir = "/data/hadoop4/";  
    18.         String to_HDFS = "/hdfstest/mergefile";  
    19.         FileStatus[] inputFiles = local.listStatus(new Path(from_LinuxDir));  
    20.         FSDataOutputStream out = hdfs.create(new Path(to_HDFS));  
    21.   
    22.         for (FileStatus file : inputFiles) {  
    23.             FSDataInputStream in = local.open(file.getPath());  
    24.             byte[] buffer = new byte[256];  
    25.             int bytesRead = 0;  
    26.             while ( (bytesRead = in.read(buffer) ) > 0) {  
    27.                 out.write(buffer, 0, bytesRead);  
    28.             }  
    29.             in.close();  
    30.         }  
    31.         System.out.println("Finish!");  
    32.     }  
    33. }  

    在Eclipse里执行,然后在HDFS上查看实验结果。

    1. hadoop fs -ls /hdfstest  

  • 相关阅读:
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Symmetric Tree
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Triangle
    Populating Next Right Pointers in Each Node II
    Pascal's Triangle II
    Pascal's Triangle
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/Aming-/p/14209140.html
Copyright © 2020-2023  润新知