大数据学习 -- 利用Java API 将文件写入HDFS

news2024/11/28 8:42:38

利用API写入文件

  • 写入HDFS文件
    • (1)将数据直接写入HDFS文件
    • (2)将本地文件写入HDFS文件

写入HDFS文件

  • 类似于HDFS Shell里的hdfs dfs -put命令
  • net.zwh.hdfs包里创建WriteFileOnHDFS

(1)将数据直接写入HDFS文件

  • /ied01目录里创建hello.txt文件
  • 创建write1()方法
    请添加图片描述
package net.hw.hdfs;

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.junit.Test;

import java.net.URI;

/**
 * 功能:写入HDFS文件
 */
public class WriteFileOnHDFS {
    @Test
    public void write1() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 定义统一资源标识符(uri: uniform resource identifier)
        String uri = "hdfs://master:9000";
        // 创建文件系统对象(基于HDFS的文件系统)
        FileSystem fs = FileSystem.get(new URI(uri), conf);
        // 创建路径对象(指向文件)
        Path path = new Path(uri + "/ied01/hello.txt");
        // 创建文件系统数据字节输出流(出水管:数据从程序到文件)
        FSDataOutputStream out = fs.create(path);
        // 通过字节输出流向文件写数据
        out.write("Hello Hadoop World".getBytes());
        // 关闭文件系统数据字节输出流
        out.close();
        // 关闭文件系统对象
        fs.close();
        // 提示用户写文件成功
        System.out.println("文件[" + path + "]写入成功!");
    }
}              
  • 运行write1()测试方法,查看结果,抛出RemoteException异常,三个数据节点都在运行,但是无法写入数据
    请添加图片描述

  • 修改代码,设置数据节点主机名属性,如下图所示
    请添加图片描述

  • 运行程序,查看结果

请添加图片描述

  • 利用Hadoop WebUI查看hello.txt文件
    请添加图片描述

(2)将本地文件写入HDFS文件

  • 在项目根目录创建一个文本文件test.txt

请添加图片描述

  • 创建write2()方法
    请添加图片描述
@Test                                                                          
public void write2() throws Exception {                                        
    // 创建配置对象                                                                  
    Configuration conf = new Configuration();                                  
    // 设置数据节点主机名属性                                                             
    conf.set("dfs.client.use.datanode.hostname", "true");                      
    // 定义统一资源标识符(uri: uniform resource identifier)                             
    String uri = "hdfs://master:9000";                                         
    // 创建文件系统对象(基于HDFS的文件系统)                                                   
    FileSystem fs = FileSystem.get(new URI(uri), conf, "root");                
    // 创建路径对象(指向文件)                                                            
    Path path = new Path(uri + "/ied01/exam.txt");                             
    // 创建文件系统数据字节输出流(出水管:数据从程序到文件)                                             
    FSDataOutputStream out = fs.create(path);                                  
    // 创建文件字符输入流对象(进水管:数据从文件到程序)                                               
    FileReader fr = new FileReader("test.txt");                                
    // 创建缓冲字符输入流对象                                                             
    BufferedReader br = new BufferedReader(fr);                                
    // 定义行字符串变量                                                                
    String nextLine = "";                                                      
    // 通过循环遍历缓冲字符输入流                                                           
    while ((nextLine = br.readLine()) != null) {                               
        // 在控制台输出读取的行                                                          
        System.out.println(nextLine);                                          
        // 通过文件系统数据字节输出流对象写入指定文件                                               
        out.write((nextLine + "\n").getBytes());                                        
    }                                                                          
    // 关闭缓冲字符输入流                                                               
    br.close();                                                                
    // 关闭文件字符输入流                                                               
    fr.close();                                                                
    // 关闭文件系统数据字节输出流                                                           
    out.close();                                                               
    // 提示用户写入文件成功                                                              
    System.out.println("本地文件[test.txt]成功写入[" + path + "]!");                   
}                                                                                                                                                                                                                           
  • 运行write2()测试方法,查看结果

请添加图片描述

  • 查看/ied01/exam.txt内容
    请添加图片描述

  • 其实这个方法的功能就是将本地文件复制(上传)到HDFS,有没有更简单的处理方法呢?有的,通过使用一个工具类IOUtils来完成文件的相关操作。

请添加图片描述

  • 编写write2_()方法
    请添加图片描述
@Test                                                                  
public void write2_() throws Exception {                               
    // 创建配置对象                                                          
    Configuration conf = new Configuration();                          
    // 设置数据节点主机名属性                                                     
    conf.set("dfs.client.use.datanode.hostname", "true");              
    // 定义统一资源标识符(uri: uniform resource identifier)                     
    String uri = "hdfs://master:9000";                                 
    // 创建文件系统对象(基于HDFS的文件系统)                                           
    FileSystem fs = FileSystem.get(new URI(uri), conf, "root");        
    // 创建路径对象(指向文件)                                                    
    Path path = new Path(uri + "/ied01/test.txt");                     
    // 创建文件系统数据字节输出流(出水管:数据从程序到文件)                                     
    FSDataOutputStream out = fs.create(path);                          
    // 创建文件字节输入流(进水管:数据从文件到程序)                                         
    FileInputStream in = new FileInputStream("test.txt");              
    // 利用IOUtils类提供的字节拷贝方法在控制台显示文件内容                                   
    IOUtils.copyBytes(in, System.out, 1024, false);                    
    // 利用IOUtils类提供的字节拷贝方法来复制文件                                        
    IOUtils.copyBytes(in, out, conf);                                  
    // 关闭文件字节输入流                                                       
    in.close();                                                        
    // 关闭文件系统数据字节输出流                                                   
    out.close();                                                       
    // 提示用户写入文件成功                                                      
    System.out.println("本地文件[test.txt]成功写入[" + path + "]!");           
}                                                                                                                     

注意导包问题
请添加图片描述

  • 运行write2_()测试方法,查看结果

请添加图片描述

  • 查看/ied01/test.txt内容,文件是存在的,但是没有内容
    请添加图片描述

因为字节输入流的数据已经输出到到控制台,此时字节输入流里已经没有数据,此时执行IOUtils.copyBytes(in, out, conf);,因此输出流肯定也没有数据可以写入文件,那该怎么办呢?再次读取文件,让字节输入流有数据。
请添加图片描述

  • 运行write2_()方法,查看结果
    请添加图片描述

  • 查看/ied01/test.txt文件
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)

昨天,2022年12月13日,在下午和晚上,ChatGPT 就开始因为请求过多而写到一半就崩溃,出现network error,可见它的关注度确实是越来越可观了。 正好最近世界杯,有博客活动,干脆也总结一下 ChatGPT 目…

大白话讲懂word2vec原理和如何使用

前言 做自然语言处理(Natural Language Processing,NLP)这个领域的小伙伴们肯定对word2vec这个模型很熟悉了,它就是一种最为常见的文本表示的算法,是将文本数据转换成计算机能够运算的数字或者向量。在自然语言处理领…

【Docker】Dockerfile从概念介绍到快速上手编写案例实战

本期目录1. Dockerfile介绍1.1 Dockerfile的重要性1.2 构建三步骤2. Dockerfile构建过程2.1 Dockerfile内容基础2.2 Dockerfile执行流程2.3 总结3. Dockerfile常用保留字指令3.1 Dockerfile常用保留字一览3.2 保留字讲解4. 案例演示-自定义CentOS镜像4.1 前期准备4.2 编写Docke…

黑白图片怎样上色?教你如何给黑白照片上色

平时我们在网上浏览照片时,就会经常看到一些黑白色的照片。自从前段时间的复古风出现之后,很多小伙伴都会给自己拍摄的一些照片加上黑白滤镜,让原本彩色的照片变成了黑白色的,那大家知道黑白照片怎么变成彩色照片吗?今…

xxljob 自动清理日志的业务逻辑,以及涉及到的文件

目录 1 需求2 实现3 JobLogFileCleanThread1 需求 xxljob定时任务,会产生很多的日志文件,那么他是如何自动清除的呢? 2 实现 我们自己的项目集成了xxljob之后,会在yml里面有一个配置 ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, # 限制值大于等于3时生效; …

物联网通信技术第7章 自组织网络(非常全,持续更新)

目录 知识点要求 7.1自组织网络概述 7.1.1 自组织网络的定义(掌握) 7.1.2 自组织网络的特点 (理解) 7.1.3 自组织网络的应用 7.2 自组织网络的体系结构(了解) 7.2.1 节点结构 7.2.2 自组织网络的网…

微信小程序开发—入门到跑路(二)

1、学习目标 知识点名称知识点内容难度系数要求程度模板语法数据绑定、事件绑定、条件渲染、列表渲染2星掌握WXSS样式WXSS3星掌握配置操作全局配置、TabBar配置、页面配置、3星掌握网络请求和案例网络数据请求、本地生活案例3星掌握文章目录1、学习目标2、模板语法2.1、数据绑…

AVS-代码路径说明

训练 1 config.py里面有backbone的路径,这里最好写在外面,写成绝对路径 不然每个算法都要放如下三个与训练模型,会很占地方vggishxxx.pth resnetxxx.pth pvt_v2_xxx.py AVS/AVSBenchmark1/avs_ms3/config.py 本来pretrained_backbones/xxx.pth文件在AVSB…

【C++】STL——list的常用接口

list的常用接口 文章目录list的常用接口一、list的介绍二、list的使用1.list的构造2.迭代器的使用2.1.begin和end2.2.rbegin和rend2.3.范围for2.4.迭代器的分类3.list的元素访问函数3.1.front和back4.list的容量操作函数4.1.empty4.2.size和max_size5.list修改的相关函数5.1.pu…

内卷起来,2023年外贸B2B企业怎么通过独立站吸引客户的注意

从国外疫情解封后,中国在2022年的最后一个月也解封了,我们努力了三年,现在不再查核酸、健康码,多家航空公司重新开通了国际航班。对许多外贸公司来说,是“外贸春天”的到来。那么即将到来的2023年,外贸B2B企…

十三、JavaScript——类型转化

一、类型转化 1 定义 类型转化:指将一种数据类型转化为其他的数据类型 - 指将其他类型转化为(字符串、数值、布尔值) 转化为字符串、调用toString()方法将其他类型转化为字符串 调用String()函数将其他类型转化为字…

彻底理解并解决服务器出现大量TIME_WAIT

首先我们说下状态 TIME_WAIT 出现的原因 TCP的新建连接,断开连接的流程和各个状态,如下图所示 由上图可知:TIME_WAIT 是主动断开连接的一方会出现的,客户端,服务器都有可能出现 当客户端主动断开连接时,发…

C语言回调函数,提升C技巧必备

一、函数指针 在讲回调函数之前,我们需要了解函数指针。 我们都知道,C语言的灵魂是指针,我们经常使用整型指针,字符串指针,结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体 但是好像我们…

今天又get到一个小技能,collect_set函数

collect_set函数今天又get到一个小技能,掌握了hive一个关于列转行专用函数 collect_set函数。在这里做个学习笔记。collect_set是Hive内置的一个聚合函数, 结果返回一个消除了重复元素的对象集合, 其返回值类型是 array 。和collect_set相似的还有另一个函数collect…

Android12指纹调用流程介绍(一)

Android12指纹框架流程介绍(一) 前言:根据网上的相关资料,Android 12开始支持屏下指纹方案,根据自己手中的测试机, ​ 下载了android 12的源码,准备学习下新的指纹框架 注:目前笔者使用的版本是android_…

Qt扫盲-QSlider理论总结

QSlider理论总结1. 简述2. 常用功能3. 外观4. 最常用信号5. 键盘功能1. 简述 QSlider是用于控制边界值的经典小部件。它允许用户沿水平或垂直凹槽移动QSlider 的滑块,并将 滑块 的位置转换为合法范围内的整数值。但是 QSlider 仅提供整数范围。如果QSlider处理非常…

RSTP快速生成树简介、RSTP与STP的区别、RSTP BPDU字段信息、RSTP角色与端口状态介绍、RSTP工作过程之P/A机制详细分解)

2.11.0 以太网 RSTP快速生成树(简介、RSTP与STP、RSTP BPDU、RSTP端口状态、RSTP工作过程之P/A机制) RSTP快速生成树简介RSTP、STP的区别RSTP BPDU格式RSTP与STP的兼容性RSTP如何兼容STP?RSTP端口状态RSTP的5种端口角色RSTP的3种端口状态RSTP…

Windows OS中关闭445 Port

445端口是什么? 445端口是一个毁誉参半的端口,它和139端口一起是IPC$入侵的主要通道。有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共…

Aba | 全自动biomarker分析神包!~(原作者用这个包发了三篇Nature啦~)

1写在前面 今天介绍一个Github上的神包吧, 主要是用于Biomarker的临床分析, 原作者用这个包已经发了3篇Nature了, 一起看看吧:👇 在一些针对Biomarker的临床研究中, 我们常常需对Biomarker进行模型拟合, 预测效果评估等等.🥰 这个包可以完美解决这些问题…

[附源码]Python计算机毕业设计SSM基于web的火车订票管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…