当前位置:   article > 正文

大数据技术原理与应用实验指南——HDFS JAVA API编程实践_大数据应用技术实验指导书 hdfs

大数据应用技术实验指导书 hdfs

大数据技术原理与应用实验指南——HDFS JAVA API编程实践

hdfs Java API编写合并文件内容

1. 实验目的

(1) 熟练使用HDFS操作常用的Shell命令。

(2) 熟悉HDFS操作常用的Java API。

2. 实验内容

(1) 编程实现指定功能,并利用Hadoop提供的Shell命令完成相同任务(文件的上传、下载、输出、删除、移动等操作)。

(2) 有余力编写一个Java程序,读取HDFS中的指定文件。

3. 实验平台(软件版本)

VirtualBox-6.1.4

jdk-8u162-linux-x64.tar

eclipse-4.7.0-linux.gtk.x86_64.tar

ubuntukylin-16.04-desktop-amd64

hadoop-3.1.3

FileZilla_3.17.0.0_win64_setup 这是一个用于将windows文件与linux互相传的软件

**4. 实验步骤 **

实验步骤思维导图如下图所示
在这里插入图片描述

(1) 启动全分布集群

$ start-dfs.sh

$ start-yarn.sh

$ mr-jobhistory-daemon.sh start historyserver
  • 1
  • 2
  • 3
  • 4
  • 5

通过命令jps可以查看各个节点所启动的进程(如下图所示:)
在这里插入图片描述
在Slave节点可以看到DataNode和NodeManager进程(如下图所示:)
在这里插入图片描述

集群启动成功:如下图所示

在这里插入图片描述

(2) 目录操作:

① 本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

$ hdfs dfs -mkdir -p /user/hadoop
  • 1

该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。

② “-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,以下两个命令等价!

$ hdfs dfs –ls .

$ hdfs dfs –ls /user/hadoop
  • 1
  • 2
  • 3

目录创建与显示如下图所示
在这里插入图片描述

(3) 文件操作:

① 首先使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建四个文件file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,文件内容分别如下所示:

file1.txt的内容是: this is file1.txt
file2.txt的内容是: this is file2.txt
file3.txt的内容是: this is file3.txt
file4.abc的内容是: this is file4.abc
file5.abc的内容是: this is file5.abc

② 可以使用如下命令把本地文件系统的“/home/hadoop/***.txt”上传到HDFS中的当前用户目录

上传文件的代码显示如下图所示

在这里插入图片描述

(4) 利用Java API与HDFS进行交互——在Ubuntu中安装Eclipse

① 可以到Eclipse官网(https://www.eclipse.org/downloads/)下载安装包。

② 假设安装文件下载后保存在了Linux系统的目录“~/Downloads”下,下面执行如下命令对文件进行解压缩:

$ cd ~/Downloads
$ sudo tar -zxvf ./eclipse-4.7.0-linux.gtk.x86_64.tar.gz -C /usr/local
  • 1
  • 2

③ 然后,执行如下命令启动Eclipse:

$ cd /usr/local/eclipse`
$ ./eclipse
  • 1
  • 2

这样就可以看到启动界面,如下图所示:提示设置工作空间(workspace)

在这里插入图片描述

可以直接采用默认的设置“/home/hadoop/workspace”,点击“OK”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。

④ 为了能让代码顺利运行,需要在Eclipse工作空间(workspace)的bin目录下复制属于集群上的core-site.xml和dfs-site.xml(它们存放在/usr/local/hadoop/etc/hadoop目录下)

⑤ Eclipse启动以后,选择“File->New–>Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。

img

⑥ 点击界面底部的“Next>”按钮,为项目添加需要用到的JAR包,包含common或者common/lib与hdfs或者hdfs/lib,还有client下所有的JAR包这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。

img

(5) 编写Java应用程序

① 请在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。然后在出现的界面中只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“MergeFile1”(其余java文件操作类似)“HDFSCreate”“HDFSUpload”…其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮

出现如下图所示界面。

在这里插入图片描述

read.java创建并编写完毕后结果以及最终演示如下图所示(实现下载功能,并展示下载内容):

在这里插入图片描述


(6) 这里展示MergeFile1.java的源代码文件。

package Demo;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
 
/**
 * 过滤掉文件名满足特定条件的文件 
 */
class Filter implements PathFilter {
     String reg = null; 
     Filter(String reg) {
          this.reg = reg;
     }
     public boolean accept(Path path) {
        if (!(path.toString().matches(reg)))
            return true;
        return false;
    }
}
/***
 * 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件
 */
public class MergeFile1 {
    Path inputPath = null; //待合并的文件所在的目录的路径
    Path outputPath = null; //输出文件的路径
    public MergeFile1(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://192.168.43.49:9000");//特别注意此处192.168.43.49是自己主节点的IP地址
          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 Filter(".*\\.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 {
        MergeFile1 merge = new MergeFile1(
                "hdfs://192.168.43.49:9000/user/hadoop/",//特别注意此处192.168.43.49是自己主节点的IP地址
                "hdfs://192.168.43.49:9000/user/hadoop/merge.txt");//特别注意此处192.168.43.49是自己主节点的IP地址
        merge.doMerge();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

MergeFile.java运行结果如下
在这里插入图片描述

merge.txt文件生成成功

在这里插入图片描述

merge.txt文件内容展示如下

在这里插入图片描述

5. 完成情况与问题讨论

(1) 实际完成情况

完成!

(2) 问题与讨论

问题一:伪分布的java API实现与全分布有什么不同?

解决:

Configuration conf =new Configuration(); 
//对于全分布而言是连接到NameNode(主节点的ip地址)
//对于伪分布而言使用localhost代替主机ip地址的输入。
conf.set("fs.defaultFS", "hdfs://192.168.43.49:9000");
        //得到HDFS的客户端
FileSystem fs = FileSystem.get(conf);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

问题二:出现Wrong FS:hdfs://localhost:9000/user/hadoop/input.txt,excepted:file:///这类问题该怎么办?

解决:

把配置文件放到当前Java工程目录下:需要把集群上的core-site.xml和hdfs-site.xml(这两个文件存在于/usr/local/hadoop/etc/hadoop目录下)放到当前工程项目下,即eclipse工作目录的bin文件夹下面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/650757
推荐阅读
相关标签
  

闽ICP备14008679号