HDFS 自定义实现函数将文件追加到末尾的问题

2023-05-16

HDFS 自定义实现函数将文件追加到末尾的问题:

在这里插入图片描述

一、实验环境:

  • Ubuntu16.04
  • Hadoop2.7.1 伪分布式(只有一个DN
  • Eclipse

二、解决方案

Java代码:


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.*;

public class HDFSApi {
    /**
     * 判断路径是否存在
     */
    public static boolean test(Configuration conf, String path) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        return fs.exists(new Path(path));
    }

    /**
     * 复制文件到指定路径
     * 若路径已存在,则进行覆盖
     */
    public static void copyFromLocalFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path localPath = new Path(localFilePath);
        Path remotePath = new Path(remoteFilePath);
        /* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */
        fs.copyFromLocalFile(false, true, localPath, remotePath);
        fs.close();
    }

    /**
     * 追加文件内容
     */
    public static void appendToFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path remotePath = new Path(remoteFilePath);
        /* 创建一个文件读入流 */
        FileInputStream in = new FileInputStream(localFilePath);
        /* 创建一个文件输出流,输出的内容将追加到文件末尾 */
        FSDataOutputStream out = fs.append(remotePath);
        /* 读写文件内容 */
        byte[] data = new byte[1024];
        int read = -1;
        while ( (read = in.read(data)) > 0 ) {
            out.write(data, 0, read);
        }
        out.close();
        in.close();
        fs.close();
    }

    /**
     * 主函数
     */
    public static void main(String[] args) {
        Configuration conf = new Configuration();
    	conf.set("fs.default.name","hdfs://localhost:9000");
        String localFilePath = "/home/hadoop/text.txt";    // 本地路径
        String remoteFilePath = "/user/hadoop/text.txt";    // HDFS路径
        String choice = "append";    // 若文件存在则追加到文件末尾
//      String choice = "overwrite";    // 若文件存在则覆盖

        try {
            /* 判断文件是否存在 */
            Boolean fileExists = false;
            if (HDFSApi.test(conf, remoteFilePath)) {
                fileExists = true;
                System.out.println(remoteFilePath + " 已存在.");
            } else {
                System.out.println(remoteFilePath + " 不存在.");
            }
            /* 进行处理 */
            if ( !fileExists) { // 文件不存在,则上传
                HDFSApi.copyFromLocalFile(conf, localFilePath, remoteFilePath);
                System.out.println(localFilePath + " 已上传至 " + remoteFilePath);
            } else if ( choice.equals("overwrite") ) {    // 选择覆盖
                HDFSApi.copyFromLocalFile(conf, localFilePath, remoteFilePath);
                System.out.println(localFilePath + " 已覆盖 " + remoteFilePath);
            } else if ( choice.equals("append") ) {   // 选择追加
                HDFSApi.appendToFile(conf, localFilePath, remoteFilePath);
                System.out.println(localFilePath + " 已追加至 " + remoteFilePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

报错信息:Failed to replace a bad datanode the existing pipeline to no more good datanodes begin g available to try.

在这里插入图片描述

直观判定为文件在pineline传输中DN被认为是坏的数据节点,需要新的好的数据节点来确保文件在pineline中传输正常。

官网说明:hdfs-default.xml配置文件

如果写入管道中存在数据节点/网络故障,DFSClient 将尝试从管道中删除失败的数据节点,然后继续使用其余数据节点进行写入。因此,管道中的数据节点数会减少。该功能是向管道添加新的数据节点。这是用于启用/禁用该功能的站点范围的属性(dfs.client.block.write.replace-datanode-on-failure.policy)。当集群大小非常小时(例如 3 个节点或更少),集群管理员可能希望在默认配置文件中将策略设置为 NEVER 或禁用此功能。否则,用户可能会遇到异常高的管道故障率,因为无法找到新的数据节点进行替换。

而且,仅当 dfs.client.block.write.replace-datanode-on-failure.enable 的值为 true 时,才使用此属性。ALWAYS:删除现有数据节点时,始终添加新的数据节点。NEVER:从不添加新的数据节点。默认值:让 r 作为复制编号。设 n 为现有数据节点的数量。仅当 r 大于或等于 3 且 (1) floor(r/2) 大于或等于 n 时,才添加新的数据节点;或 (2) r 大于 n,并且块被hflushed/appended。

在这里插入图片描述

方法一:在Java代码main函数中加入以下两行代码:

conf.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER"); 
conf.set("dfs.client.block.write.replace-datanode-on-failure.enable","true");

方法二:在hdfs-site.xml中加入以下代码:

<property>
	<name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
	<value>NEVER</value>
</property>

三、注意点

一般来说,如果集群中DN个数小于等于3 (本机器采用伪分布式模式,只有一个DN,但是为了测试方便,直接开启即可)都不建议开启

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HDFS 自定义实现函数将文件追加到末尾的问题 的相关文章

  • 使用 avro-tools 连接 Avro 文件

    我正在尝试将 avro 文件合并为一个大文件 问题是concat命令不接受通配符 hadoop jar avro tools jar concat input part output bigfile avro I get 线程 main 中
  • 无法启动 CDH4 辅助名称节点:NameNode 地址的 URI 无效

    我一直在尝试设置 hadoop 的 CDH4 安装 我有 12 台机器 标记为 hadoop01 hadoop12 名称节点 作业跟踪器和所有数据节点都启动良好 我可以查看 dfshealth jsp 并看到它找到了所有数据节点 但是 每当
  • 更新 hadoop HDFS 文件

    我是 Hadoop 的新手 我一直读到 HDFS 主要是 一次写入 多次读取 我有一个用例 我可能需要对 HDFS 中存储的文件进行修改 我一直在研究是否有任何方法可以做到这一点 我的问题是是否可以将 HDFS 文件加载到 HBase 中
  • 一个目录中有多少个子目录?

    如何查找HDFS中指定目录下的子目录数量 当我做hadoop fs ls mydir 我收到 Java 堆空间错误 因为目录太大 但我感兴趣的是该目录中的子目录数量 我试过 gsamaras gwta3000 hadoop fs find
  • auxService:hive 上不存在mapreduce_shuffle

    我正在使用 hive 1 2 0 和 hadoop 2 6 0 每当我在我的机器上运行配置单元时 选择查询工作正常 但在以下情况下count 它显示以下错误 此任务的诊断消息 容器启动失败 容器 1434646588807 0001 01
  • Hadoop 框架中使用的属性的完整列表

    我正在对 Hadoop 框架进行一些研究 我想问一下框架中可以使用的属性 例如 io sort mb io sort record percent etc 我可以参考这个框架的整个属性列表吗 非常希望有人能帮助我 另外 我想问一下 io s
  • 为什么 Dockerized Hadoop 数据节点注册了错误的 IP 地址?

    我有 Hadoop 2 7 1 名称节点和数据节点的单独 Docker 1 9 1 映像 我可以从中创建容器 并让它们通过用户定义的 Docker 网络进行通信 然而 数据节点似乎报告自己拥有网络网关的 IP 地址 而不是它自己的 IP 地
  • 无法使用 scala 将字符串写入 hdfs 文件

    我编写了一些代码在 hdfs 中创建一个文件并向其写入字节 这是代码 def write uri String filePath String data String Unit System setProperty HADOOP USER
  • Hadoop - 重新启动数据节点和任务跟踪器

    我想关闭单个数据节点和任务跟踪器 以便我在mapred site xml中所做的一些新更改生效 例如mapred reduce child java opts等 我该怎么做 但是 我不想关闭整个集群 因为我有正在运行的活动作业 另外 如何确
  • Namenode-HDFS 出现“连接被拒绝”错误(Hadoop 问题)

    当我们看到使用时 我的所有节点都已启动并运行jps命令 但我仍然无法连接到 hdfs 文件系统 每当我点击Browse the filesystem在 Hadoop Namenode localhost 8020 页面上 我得到的错误是Co
  • 无法创建目录 /home/hadoop/hadoopinfra/hdfs/namenode/current

    我收到错误 Cannot create directory home hadoop hadoopinfra hdfs namenode current 尝试在我的本地 Mac 上安装 hadoop 时 这可能是什么原因 仅供参考 我将我的
  • gzip 文件如何存储在 HDFS 中

    HDFS存储支持压缩格式来存储压缩文件 我知道 gzip 压缩不支持夹板 现在假设该文件是一个 gzip 压缩文件 其压缩大小为 1 GB 现在我的问题是 该文件将如何存储在 HDFS 中 块大小为 64MB 由此link http com
  • 将文件从 HDFS 复制到本地计算机

    我在尝试将文件从 HDFS 文件系统 下载 到本地系统时遇到问题 即使相反的操作没有问题 注意 文件存在于 HDFS 文件系统的指定路径上 这是一个代码片段 Configuration conf new Configuration conf
  • 访问 HDFS 中文件的 URI

    我已经使用 Ambari 设置了一个包含 3 个节点的集群 现在我想使用客户端应用程序访问 HDFS 中的文件 我可以在 Ambari 的数据节点下找到所有节点 URI 我需要使用什么 URI 端口来访问文件 我使用的是默认安装过程 默认端
  • 如何访问Hadoop HDFS中的文件?

    我的 Hadoop HDFS 中有一个 jar 文件 包含我想要修改的 Java 项目 我想在 Eclipse 中打开它 当我打字时hdfs dfs ls user 我可以看到 jar 文件在那里 但是 当我打开 Eclipse 并尝试导入
  • 如何将位于 HDFS 上的类型安全配置文件添加到 Spark-Submit(集群模式)?

    我有一个 Spark Spark 1 5 2 应用程序 它将数据从 Kafka 流式传输到 HDFS 我的应用程序包含两个 Typesafe 配置文件来配置某些内容 例如 Kafka 主题等 现在我想在集群中使用spark submit 集
  • hadoop 连接在端口 9000 上被拒绝

    我想设置一个伪分布式模式的hadoop集群进行开发 由于端口 9000 上的连接被拒绝 尝试启动 hadoop 集群失败 这些是我的配置 非常标准 站点核心 xml
  • HDFS 在大量小文件和 128 Mb 块大小上的行为

    我有很多 多达数十万个 小文件 每个文件 10 100 Kb 我的 HDFS 块大小等于 128 MB 我的复制因子等于 1 为每个小文件分配 HDFS 块有什么缺点吗 我见过相当矛盾的答案 答案说最小的文件占用整个块 https stac
  • 无法使用 PDI 步骤连接到 HDFS

    我已经配置成功了Hadoop 2 4 in an Ubuntu 14 04 虚拟机 from a 视窗8系统 Hadoop 安装工作绝对正常 而且我还可以从 Windows 浏览器查看 Namenode 附图如下 所以 我的主机名是 ubu
  • Namenode高可用客户端请求

    谁能告诉我 如果我使用java应用程序请求一些文件上传 下载操作到带有Namenode HA设置的HDFS 这个请求首先去哪里 我的意思是客户端如何知道哪个名称节点处于活动状态 如果您提供一些工作流程类型图或详细解释请求步骤 从开始到结束

随机推荐