编程语言
首页 > 编程语言> > 第3章Hadoop基本命令和Java API

第3章Hadoop基本命令和Java API

作者:互联网

目录

3.1Hadoop中HDFS的常用命令

3.1.1基于Shell的操作

        1.创建目录命令

        2.上传文件到HDFS

        3.列出HDFS上的文件

        4.查看HDFS下某个文件的内容

        5.将HDFS中的文件复制到本地系统中

        6.删除HDFS下的文档

3.2基于Java API的操作

3.2.1前期准备

        (1)windows安装hadoop

         (2)IDEA创建项目

        (3)添加jar包到我们的项目中

3.2.2基于Java API的操作


3.1Hadoop中HDFS的常用命令

        我们已经知道的HDFS是分布式存储,可以存放大批量的文件,如果要对文件进行操作可以通过下面的命令来完成,如读取文件,上传文件,删除文件和建立目录等。HDFS提供了两种访问方式,分别是基于Shell和Java API。

3.1.1基于Shell的操作

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

        1.创建目录命令

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

hdfs dfs -mkdir 文件名

        命令示例:

hdfs dfs -mkdir /demo   #在hdfs的根目录下创建demo文件夹

hdfs dfs -mkdir -p /demo/test  #在hdfs根目录下递归创建文件夹  /demo/test

        2.上传文件到HDFS

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

hdfs dfs -put filename 路径

        命令示例:

hdfs dfs -put test.txt /demo   #把test.txt文件放到demo文件夹下

        3.列出HDFS上的文件

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

hdfs dfs -ls 路径

        命令示例:

hdfs dfs -ls /demo

        4.查看HDFS下某个文件的内容

        通过“-cat 文件名”查看,命令格式如下

hdfs dfs -cat 文件名

        命令示例:

hdfs dfs -cat /demo/test.txt

        5.将HDFS中的文件复制到本地系统中

        通过“-get 文件1 文件2”命令将HDFS中某个目录下的文件复制到本地系统的某文件中。命令格式如下:

hdfs dfs -get 文件名 本地路径

        命令示例:

hdfs dfs -get /demo/test.txt /  #将demo文件夹下的test.txt文件复制到本地根目录下

        6.删除HDFS下的文档

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

hdfs dfs -rm -r 文件

        命令示例:

hdfs dfs -rm -r /demo/test.txt  #删除demo文件夹下的test.txt文件

3.2基于Java API的操作

3.2.1前期准备

        (1)windows安装hadoop

        首先要把Hadoop放在我们的windows上,也不用配置什么东西,就是把hadoop包解压在我们的电脑上即可。

         (2)IDEA创建项目

        在IDEA编辑其中创建一个项目HdfsDemo,目录结构如下,out目录在岗创建的时候是没有的。

        然后再src目录下创建一个包,包下则是我们的java代码,同时我们需要把我们的再虚拟机上的hadoop的两个文件放到src目录下如下图。

         两个文件的配置如图;其中两个文件里面的映射名都改成了IP地址,因为windows没办法识别你的映射名-hadoop5,所以改成IP地址

         这个IP地址是我的Secondary NameNode地址

         这个IP地址是我NameNode的主机IP地址。

        (3)添加jar包到我们的项目中

        点击IDEA的左上角File---》》Project Structure

         我们第一次打开时什么都没有的,然后点击右边框框里面的 + 号 然后点击 JARS OR directories

        这个时候就开始寻找目录添加jar包了。我们这个时候需要找到hadoop文件夹,然后它下面的share/hadoop文件夹里面的JAR包全部添加进去把,别管用到用不到。

 

        举个例子:添加包的时候,我们进入 share/hadoop/mapreduce 这个文件夹中后,这个目录下有包我们导入,然后我们再进入mapreduce下的lib目录下 也有包,再导入。一般就是这两处有包。具体要用到的我们可以在网上搜寻,这里做API 访问我们的hdfs已经足够了

3.2.2基于Java API的操作

        本节将介绍通过Java API来访问HDFS,首先说下HDFS中文件操作主要涉及的几个类

        Configuration类:该类的对象封装了客户端或者服务器的配置

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

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

        代码如下:

package HdfsDemo;
import java.io.File;
import java.io.IOException;

import javafx.scene.chart.ScatterChart;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.util.ByteArrayManager;

public class HdfsDemo {
    public static void main(String[] args) {
        //调用下面的函数
        createFolder();     //创建文件夹函数
        //uploadFile();      //上传文件夹函数
        //downloadFile();        //下载文件夹函数
        //listFile(new Path("/"));   //展示目录函数
    }

    private static void createFolder() {
        Configuration conf = new Configuration();
        try {
            //通过配置信息得到文件系统的对象
            FileSystem fs = FileSystem.get(conf);
            //在指定路径下创建文件夹
            Path path = new Path("/HdfsDemo");
            fs.mkdirs(path);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    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();
        }


    }
    public static void uploadFile() throws IOException {
        Configuration conf = new Configuration() ;
        try {
            FileSystem fs = FileSystem.get(conf);
            //定义文件的路径和上传的路径
            Path src = new Path("本地文件路径");
            Path dest = new Path("服务器路径");
            //从本都上传文件到服务器
            fs.copyFromLocalFile(src,dest);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
    public static void downloadFile(){
        Configuration conf = new Configuration() ;
        try{
            FileSystem fs = FileSystem.get(conf);
            //定义下载文件的路径和本地文件的路径
            Path dest = new Path("/HdfsDemo/a.txt");
            Path src = new Path("D://a.txt");
            //从服务器下载到本地
            fs.copyToLocalFile(dest,src);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

        我们可以看到,我们有个主函数,分别调用了createFolder()、uploadFile()、downloadFile()、listFile()四个函数,调用那个函数,就会有什么结果。其中代码中的路径大家自己进行更改。

        至此,我们对于hadoop集群的一个shell的基本命令和与Java API 的基础操作便完成。

标签:hdfs,Java,HDFS,Hadoop,dfs,API,文件,FileSystem,Path
来源: https://blog.csdn.net/qq_45112156/article/details/120216615