HDFS应用—基于shell操作和基于Java API操作

大数据技术 潘老师 3年前 (2021-02-24) 1653 ℃ (0) 扫码查看

1.基于 Shell 的操作

以下介绍一些我们在 Shell 中操作 HDFS 时经常用到的命令。

1.1.创建目录命令

HDFS 创建目录的命令是 mkdir,命令格式如下:

hdfs dfs -mkdir 文件夹名

例如,在 user 目录下创建 wen 目录。代码如下:

hdfs dfs -mkdir hdfs://192.168.217.100:9820/wen

可以简写为:

 hdfs dfs -mkdir /user/wen 
1.2.上传文件到

HDFS 上传文件时,文件首先复制到 DataNode 上,只有所有的 DataNode 都成功接收完数据,文件上传才是成功的。命令格式如下:

hdfs dfs -put filename newfilename 

例如,通过「-put 文件 1 文件 2」命令将 test1 文件上传到 HDFS 上并重命名为 test2。代码如下:

hdfs dfs -put test1 test2 
1.3.列出 HDFS 上的文件

采用-ls 命令列出 HDFS 上的文件,需要注意的是,在 HDFS 中没有「当前工作目录」这个概念。命令格式如下:

 hdfs dfs -ls 

例如,列出 HDFS 特定目录下的所有文件。代码如下:

hdfs dfs –ls /wen 
1.4.查看 HDFS 下某个文件的内容

通过「-cat 文件名」命令查看 HDFS 下某个文件的内容。命令格式如下:

hdfs dfs -cat 文件名 

例如,查看 HDFS 上 wen 目录下 test.txt 中的内容。代码如下:

 hdfs dfs -cat /wen/test.txt 
1.5.将 HDFS 中的文件复制到本地系统中

通过「-get 文件 1 文件 2」命令将 HDFS 中某目录下的文件复制到本地系统的某文件中,并对该文件重新命名。命令格式如下:

hdfs dfs -get 文件名 新文件名 

例如,将 HDFS 中的 in 文件复制到本地系统并重命名为 IN1。代码如下:

hdfs dfs -get in IN1 

-get 命令与-put 命令一样,既可以操作目录,也可以操作文件。

1.6.删除 HDFS 下的文档

通过「-rmr 文件」命令删除 HDFS 下的文件。命令格式如下:

 hdfs dfs -rmr 文件 

例如,删除 HDFS 下的 out 文档。代码如下:

hdfs dfs -rmr out -rmr 

删除文档命令相当于 delete 的递归版本。

1.7.格式化 HDFS

通过-format 命令实现 HDFS 格式化。命令格式如下:

hdfs namenode -format 
1.8.启动 HDFS

通过运行 start-dfs.sh,就可以启动 HDFS 了。命令格式如下:

start-dfs.sh 
1.9.关闭 HDFS

当需要退出 HDFS 时,通过 stop-dfs.sh 就可以关闭 HDFS。命令格式如下:

stop-dfs.sh 

2.基于 Java API 的操作

本节将介绍通过 Java API 来访问 HDFS,首先介绍 HDFS 中的文件操作主要涉及的几个类。 ·Configuration 类:该类的对象封装了客户端或者服务器的配置。

·FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs=FileSystem.get(conf);通过 FileSystem 的静态方法 get 获得该对象。

·FSDataInputStream 和 FSDataOutputStream:这两个类是 HDFS 中的输入/输出流,分别通过 FileSystem 的 open 方法和 create 方法获得。

接下来通过实例介绍如何利用 Java API 进行文件夹的创建、文件列表显示、文件上传和文件下载操作,为了使读者对实例具有完整性的理解,我们把主函数也列了出来。实例代码如下:

import java.io.IOException; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
public class HdfsDemo {
 public static void main(String[] args) { 
createFolder(); 
//uploadFile();
 //downloadFile(); 
//listFile(new Path("/")); 
} 
}

在主函数中,分别调用了 createFolder()、uploadFile()、downloadFile()和 listFile(new Path(「/」)函数来实现文件夹的创建、文件上传、文件下载和递归显示文件夹功能。

2.1 创建文件夹

如果想要将文件放入不同的文件夹中,则可以有针对性地动态创建文件夹。关于文件夹的创建比较简单。代码如下:

public static void createFolder() { 
// 定义一个配置对象 
Configuration conf = new Configuration();
 try {
     // 通过配置信息得到文件系统的对象
     FileSystem fs = FileSystem.get(conf); 
//在指定的路径下创建文件夹 
Path path = new Path(「/yunpan」); 
fs.mkdirs(path); 
} catch (IOException e) { 
e.printStackTrace();
 }
 } 
2.2 递归显示文件

如果要显示文件夹中的文件,需要用到递归算法,因为文件夹中可能有文件,也可能有文件夹。代码如下:

public static void listFile(Path path) {
    Configuration conf = new Configuration();
    try { 
        FileSystem fs = FileSystem.get(conf);
        //传入路径,表示显示某个路径下的文件夹列表
        //将给定路径下所有的文件元数据放到一个 FileStatus 的数组中
        //FileStatus 对象封装了文件和目录的元数据,包括文件长度、块大小、权限等信息
        FileStatus[] fileStatusArray = fs.listStatus(path);
        for (int i = 0; i < fileStatusArray.length; i++) {
             FileStatus fileStatus = fileStatusArray[i];
        //首先检测当前是否是文件夹,如果「是」则进行递归
             if (fileStatus.isDirectory()) {
                System.out.println("「当前路径是:」" + fileStatus.getPath());
                listFile(fileStatus.getPath());
            } else {
                System.out.println("「当前路径是:」" + fileStatus.getPath()); 
             }
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}
2.3 文件上传

前面创建了文件夹及文件的递归显示,接着来看一下文件的上传。关于文件上传的代码如下:

public static void uploadFile() {
 Configuration conf = new Configuration(); 
try {
 FileSystem fs = FileSystem.get(conf); 
//定义文件的路径和上传的路径 
Path src = new Path(「e://upload.doc」); 
Path dest = new Path(「/yunpan/upload.doc 」); 
//从本地上传文件到服务器上 
fs.copyFromLocalFile(src, dest);
 } catch (IOException e) { 
// TODO Auto-generated catch block
 e.printStackTrace();
 } 
}

关于文件的上传,首先需要定义上传源 src,这里的 src 是指本地文件路径,即将要上传的目的地路径是 dest,也就是 HDFS 上的路径。一旦设定了文件上传的数据源和目的路径之后,就可以调用 FileSystem 的 copyFromLocalFile()方法来实现文件的上传了。

2.4 文件下载

与文件上传所对应的就是文件下载。文件下载代码和文件上传类似,只是函数略有区别。代码如下:

public static void downloadFile() { 
Configuration conf = new Configuration(); 
try {
 FileSystem fs = FileSystem.get(conf); 
//定义下载文件的路径和本地下载路径 
Path src = new Path( 「/yunpan/download.doc」); 
Path dest = new Path(「e://download.doc」); 
//从服务器下载文件到本地 
fs.copyToLocalFile(src, dest);
 } catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} 

关于文件的下载,首先需要定义下载源 src,这里的 src 是指 HDFS 上的路径,将要下载的目的地为 dest,也就是本地系统的路径。设定了文件下载的数据源和目的路径之后,就可以调用 FileSystem 的 copyToLocalFile()方法实现文件的下载了。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/bigdata/1937.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】