【大数据开发技术】实验04-HDFS文件创建与写入

2023-09-22 14:00:02

一、实验目标

  1. 熟练掌握hadoop操作指令及HDFS命令行接口
  2. 掌握HDFS原理
  3. 熟练掌握HDFS的API使用方法
  4. 掌握单个本地文件写入到HDFS文件的方法
  5. 掌握多个本地文件批量写入到HDFS文件的方法

二、实验要求

  1. 给出主要实验步骤成功的效果截图。
  2. 要求分别在本地和集群测试,给出测试效果截图。
  3. 对本次实验工作进行全面的总结。
  4. 完成实验内容后,实验报告文件名显示学号姓名信息。

三、实验内容

  1. 使用FileSystem将单个本地文件写入到HDFS中当前不存在的文件,实现效果参考下图:
    1

  2. 使用FileSystem将本地文件追加到HDFS中当前存在的文件中,实现效果参考下图:
    2

四、实验步骤

  1. 使用FileSystem将单个本地文件写入到HDFS中当前不存在的文件

程序设计

package hadoop;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class WJW {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        args = new String[2];
        args[0] = "/home/zkpk/experiment/wjw01.txt";
        args[1] = "hdfs://master:9000/wjw02.txt";
        Configuration conf = new Configuration();
        BufferedInputStream in = null;
        FileSystem fs = null;
        FSDataOutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(args[0]));
            fs = FileSystem.get(URI.create(args[1]), conf);
            out = fs.create(new Path(args[1]));
            IOUtils.copyBytes(in, out, 4096, false);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
            if(fs != null){
                try{
                    fs.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }

    }

}

程序分析

该代码实现了将本地文件上传到Hadoop分布式文件系统HDFS中的功能。代码结构简单明了,主要包括以下几个步骤:

  1. 定义参数args,参数args[0]表示本地文件路径,参数args[1]表示HDFS文件路径。

  2. 创建Configuration对象,用于读取Hadoop配置信息。

  3. 创建BufferedInputStream流,读取本地文件。

  4. 使用FileSystem.get()方法获取Hadoop分布式文件系统实例。

  5. 调用fs.create()方法,创建HDFS文件,并返回FSDataOutputStream对象用于向HDFS文件写入数据。

  6. 调用IOUtils.copyBytes()方法,将本地文件数据复制到HDFS文件中。

  7. 关闭流和Hadoop分布式文件系统实例。

该代码主要涉及以下几个重要知识点:

  1. Configuration对象:该对象用于读取Hadoop配置信息,如HDFS的地址、端口等信息。

  2. FileSystem对象:该对象用于操作Hadoop分布式文件系统,如创建文件、删除文件、读取文件等操作。

  3. BufferedInputStream流:该流用于读取本地文件数据。

  4. FSDataOutputStream对象:该对象用于向HDFS文件写入数据。

  5. IOUtils.copyBytes()方法:该方法用于将输入流中的数据复制到输出流中。

总体来说,该代码实现了将本地文件上传到HDFS的功能,但还有一些需要改进的地方。例如,可以添加参数校验功能,防止空指针异常;可以添加日志输出功能,方便查看程序运行情况。

运行结果

3

  1. 使用FileSystem将本地文件追加到HDFS中当前存在的文件中

程序设计

package hadoop;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class WJW01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        args = new String[2];
        args[0] = "/home/zkpk/experiment/wjw01.txt";
        args[1] = "hdfs://master:9000/wjw02.txt";
        Configuration conf = new Configuration();
        conf.set("fs.client.block.write.replace-datanode-on-failure.enable", "true");
        conf.set("fs.client.block.write.replace-datanode-on-failure.policy", "Never");
        BufferedInputStream in = null;
        FileSystem fs = null;
        FSDataOutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(args[0]));
            fs = FileSystem.get(URI.create(args[1]), conf);
            out = fs.append(new Path(args[1]));
            IOUtils.copyBytes(in, out, 4096, false);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
            if(fs != null){
                try{
                    fs.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }

    }

}

程序分析

该代码实现了将本地文件追加上传到Hadoop分布式文件系统HDFS中的功能。代码结构与上传文件功能类似,主要包括以下几个步骤:

  1. 定义参数args,参数args[0]表示本地文件路径,参数args[1]表示HDFS文件路径。

  2. 创建Configuration对象,用于读取Hadoop配置信息。

  3. 设置配置信息:设置“fs.client.block.write.replace-datanode-on-failure.enable”为“true”,表示在数据节点故障时启用块写入数据节点更换机制;设置“fs.client.block.write.replace-datanode-on-failure.policy”为“Never”,表示块写入数据节点故障时不替换数据节点。

  4. 创建BufferedInputStream流,读取本地文件。

  5. 使用FileSystem.get()方法获取Hadoop分布式文件系统实例。

  6. 调用fs.append()方法,获取FSDataOutputStream对象用于向HDFS文件追加数据。

  7. 调用IOUtils.copyBytes()方法,将本地文件数据复制追加到HDFS文件中。

  8. 关闭流和Hadoop分布式文件系统实例。

需要注意的是,该代码使用了追加上传文件的方式,因此可以将本地文件的数据追加到HDFS文件的末尾,而不会影响原有的HDFS文件数据。同时,设置数据节点更换机制可以提高系统的可靠性和稳定性,避免数据节点故障导致数据丢失的情况。

总体来说,该代码实现了将本地文件追加上传到HDFS的功能,并且考虑了系统的可靠性和稳定性问题。但是,同样需要注意代码中的参数校验和日志输出等问题,以提高代码的健壮性和可维护性。

运行结果

4

更多推荐

最小二乘法

最小二乘法(LeastSquaresMethod)是一种用于拟合数学模型或估计模型参数的数学和统计方法。它的主要目标是找到模型参数的估计值,以使模型预测的值与观测数据之间的平方差尽量小。最小二乘法通常用于处理回归分析和曲线拟合问题。最小二乘法的基本思想是将观测数据视为模型的样本,并尝试找到模型参数,使得模型的预测值与实

Crazy Excel:Excel中的泥石流

CrazyExcel又名:疯狂Excel。是一款PC端的Excel软件工具,该软件支持windows,macos等主流操作系统。正如其名,作者在设计之初就加入了一些疯狂的设计,目的是创作出更加好用有效的excel工具。不管是专业还是小白,都能够轻松使用,解决用户在使用excel中的一些痛点,接下来我们将详细介绍Craz

三维模型3DTile格式轻量化压缩必要性分析

三维模型3DTile格式轻量化压缩必要性分析理解3DTile格式轻量化压缩的必要性,首先需要理解三维模型的复杂性和数据量。三维模型通常包含大量的顶点、面片和纹理信息,这使得其数据量非常大,尤其对于大规模的三维地理空间数据,例如城市或地形模型,数据量可能高达数百GB甚至TB。而在很多实际应用场景中,如在线地图服务、移动设

IllusionDiffusion:OpenAI 推出的图像生成新工具

OpenAI近日发布了一款名为IllusionDiffusion的图像生成器,它利用了一种名为“幻觉扩散”的技术来生成逼真的图像。幻觉扩散是一种基于生成对抗网络(GAN)的技术,它通过不断地对原始图像进行修改来生成新的图像。在IllusionDiffusion中,原始图像被称为“幻觉”,而新的图像被称为“扩散”。Ill

【腾讯云】打造未来智能应用的基石:腾讯混元大模型

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技

Python数据分析的增强式AI库

迷途小书童读完需要4分钟速读仅需2分钟1引言近年来,随着数据集的不断增大和复杂性的提高,数据分析变得越来越具有挑战性。在Python中,Pandas一直是处理和分析结构化数据的首选库。然而,随着人工智能的发展,我们需要一种能够轻松应对这些挑战的工具。幸运的是,PandasAI应运而生,它将Pandas的强大功能与人工智

合肥对新通过(CMMI)五级、四级、三级认证的软件企业,对新通过信息技术服务标准(ITSS)认证的软件企业,给予最高50万奖励

合肥市加快软件产业发展推进软件名城创建若干政策实施细则为贯彻落实《合肥市人民政府办公室关于印发合肥市加快软件产业发展推进软件名城创建若干政策的通知》(合政办〔2023〕9号)文件精神,规范政策资金管理,制定本实施细则。一、申报主体在合肥市行政区域范围内注册成立、具有独立法人资格的软件企业或软件园区运营单位。本实施细则中

SpringMVC自定义注解

目录一,Java注解简介1.java注解的定义2.Java注解分类2.1JDK基本注解2.2JDK元注解2.3自定义注解二,自定义注解如何自定义注解?三,Aop自定义注解的应用四,总结一,Java注解简介1.java注解的定义Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配

网页游戏如何开发网页游戏类型有哪些?

随着互联网的普及和技术的发展,网页游戏已经成为娱乐和休闲活动的重要组成部分。无需安装任何应用程序,只需打开浏览器,您就可以畅玩各种类型的网页游戏。然而,开发网页游戏并不是一项容易的任务,因为不同类型的游戏需要不同的开发方式和技术。在本文中,我们将探讨一些常见的网页游戏类型以及它们的开发方式。1.休闲游戏开发休闲游戏通常

【B+树索引】索引的使用和注意事项

索引的使用和注意事项一、索引的注意事项根节点是不会变的!内节点中目录项记录的唯一性一个页面至少容纳两条记录二、回表的代价三、更好的使用索引四、索引的代价一、索引的注意事项上一篇【B+树索引】索引页的结构含有可以快速查询的秘密从索引页的角度认识了MySQL为了提升查询速率,使用了B+树的数据结构对索引页进行了内存存储。以

【2023华为杯B题】DFT类矩阵的整数分解逼近(思路及代码下载)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2详细数学模型及题目、数据🎉3参考文献🌈4Matlab代码及思路实现💥1概述离散傅里叶变换(Discre

热文推荐