FSDataOutputStream,这个类重载了很多write方法,用于写入很多类型的数据:比如字节数组,long,int,char等等。

像FSDataInputStream一样,要获得FSDataOutputStream的实例,必须通过FileSystem该类来和HDFS建立连接,然后通过路径返回FSDataOutputStream实例。

FileSystem返回FSDataOutputStream实例的方法有两组

  1.create(Path p)函数,创建一个空文件,然后可以向该文件顺序写入

  2.append(Path p)函数,打开一个已有文件,并最做文件末尾追加数据

FileSystemUtil

public class FileSystemUtil {

    private static FileSystem fileSystem;
       //代码中Kerberos认证根据自己环境替换即可
    public synchronized static FileSystem getFileSystem() throws IOException{
        if(fileSystem==null){
            Configuration conf=new Configuration();
            conf.set("fs.defaultFS", "hdfs://host12.master.cluster.enn.cn:8020");
            conf.set("dfs.client.block.write.replace-datanode-on-failure.policy" ,"NEVER" );
            conf.set("dfs.client.block.write.replace-datanode-on-failure.enable" ,"true" );
            KerberosClient.login(Constants.Kerberos_USER_NAME, Constants.Kerberos_KEYTAB_FILE);
            fileSystem=FileSystem.get(conf);
        }
        return fileSystem;
    }

    public synchronized static void shutdown(){
        if(fileSystem!=null){
            try {
                fileSystem.close();
                fileSystem=null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(FileSystemUtil.getFileSystem());
    }
}

FSDataOutputStreamTest

public class FSDataOutputStreamTest{
    private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);
    private static void hfdsAppendData() {
        String filePath = "/user/hive/warehouse/test.db/t_test/day=2017-11-29/hour=16/backup_ycgqh";
        FileSystem fileSystem = null;
        FSDataOutputStream fileOutputStream = null;
        Path hdfsPath = new Path(filePath);
        try {
            fileSystem=FileSystemUtil.getFileSystem();
            if (!fileSystem.exists(hdfsPath)) {
                fileOutputStream = fileSystem.create(hdfsPath,false);
            }else{
                fileOutputStream = fileSystem.append(hdfsPath);
            }
            fileOutputStream.writeUTF("");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fileOutputStream!=null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                FileSystemUtil.shutdown();
            }
        }
    }
}

通过FSDataOutputStream向HDFS上写数据的更多相关文章

  1. HDFS的写数据过程分析

    HDFS的写数据过程分析 我们通过FileSystem类可以操控HDFS, 那我们就从这里开始分析写数据到HDFS的过程. 在我们向 HDFS 写文件的时候,调用的是 FileSystem.creat ...

  2. USB系列之四:向U盘上写数据

    在<USB系列之三>中,我们实现了一系列的SCSI命令,在这个系列中,我们要实现向U盘上写扇区的命令,所以,本文相对比较容易,更多地是给出一个实现的源程序. 在<USB系列之三> ...

  3. Linux启动kettle及linux和windows中kettle往hdfs中写数据(3)

    在xmanager中的xshell运行进入图形化界面 sh spoon.sh 新建一个job

  4. HDFS 读/写数据流程

    1. HDFS 写数据流程 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件, NameNode 检查目标文件是否已存在,父目录是否存在: NameNo ...

  5. HDFS源码解析:教你用HDFS客户端写数据

    摘要:终于开始了这个很感兴趣但是一直觉得困难重重的源码解析工作,也算是一个好的开端. 本文分享自华为云社区<hdfs源码解析之客户端写数据>,作者: dayu_dls. 在我们客户端写数据 ...

  6. hbase 从hdfs上读取数据到hbase中

    <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifact ...

  7. HDFS数据流——写数据流程

    剖析HDFS文件写入 假设文件ss.avi共200m,其写入HDFS指定路径/user/atguigu/ss.avi流程如下: 1)客户端向namenode请求上传文件到指定路径,namenode通过 ...

  8. 把HDFS上的数据导入到Hive中

    1. 首先下载测试数据,数据也可以创建 http://files.grouplens.org/datasets/movielens/ml-latest-small.zip 2. 数据类型与字段名称 m ...

  9. 在standalone模式下运行yarn 0.9.0对HDFS上的数据进行计算

    1.通读http://spark.incubator.apache.org/docs/latest/spark-standalone.html 2.在每台机器上将spark安装到/opt/spark ...

随机推荐

  1. java并发学习--第八章 JDK 8 中线程优化的新特性

    一.新增原子类LongAdder LongAdder是JDK8中AtomicLong的增强工具类,它与AtomicLong最大的不同就是:在多线程场景下,LongAdder中对单一的变量进行拆分成多个 ...

  2. seleniummaster

    http://seleniummaster.com/sitecontent/index.php/component/banners/click/6 Step 1: create a Java proj ...

  3. 应用程序不了找到mysql中的表,客户端可以正常打开表

    原因是mysql中区分大小写的参数:lower-case-table-names=1  默认是区分大小写的,程序中代码可能是大小写混合的,其中访问数据库的sql是大小写混合的.所以找不到数据库中的表 ...

  4. 如何用git将本地代码上传github

    其实去年就用github了,但是毕竟也只是在上面搜索一些工作的难点和自我学习,自己都没有贡献过代码,觉得确实很low,知道今天自己用了2周左右的时间开发了 微信小程序,有了自己的贡献代码,所以想上传到 ...

  5. Redis---系统学习

    1.安装Redis Docker 2.查看Redis配置 进入Docker中的Redis容器: 进入启动命令目录:cd /usr/local/bin/ 启动redis客户端:./redis-cli c ...

  6. LeetCode--105--从前序与中序遍历序列构造二叉树(python)

    根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,2 ...

  7. linux运维、架构之路-git版本管理

    一.常见版本管理系统 1.SVN     集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不能访问,所有的使用者无法使用svn,无法进行提交或者备份文件 2.Git      分布 ...

  8. 【rust】Rust变量绑定(3)

    Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...

  9. [CF Round603 Div2 F]Economic Difficulties

    题目:Economic Difficulties 传送门:https://codeforces.com/contest/1263/problem/F 题意:给了两棵tree:Ta(拥有a个节点,节点编 ...

  10. nodejs工作大全

    1.修改文件夹中图片的名称 var fs = require('fs');var fileDirectory = "F:\\zdw\\修改文件夹名称\\newFile";var n ...