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

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

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


d5989fc827b04861bab46adea55aae5d.jpg



一、实验环境:


  • Ubuntu16.04
  • Hadoop2.7.1 伪分布式(`只有一个DN`)
  • Eclipse3.8


二、解决方案


Java代码:

importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.*;
importjava.io.*;
publicclassHDFSApi {
/*** 判断路径是否存在*/publicstaticbooleantest(Configurationconf, Stringpath) throwsIOException {
FileSystemfs=FileSystem.get(conf);
returnfs.exists(newPath(path));
    }
/*** 复制文件到指定路径* 若路径已存在,则进行覆盖*/publicstaticvoidcopyFromLocalFile(Configurationconf, StringlocalFilePath, StringremoteFilePath) throwsIOException {
FileSystemfs=FileSystem.get(conf);
PathlocalPath=newPath(localFilePath);
PathremotePath=newPath(remoteFilePath);
/* fs.copyFromLocalFile 第一个参数表示是否删除源文件,第二个参数表示是否覆盖 */fs.copyFromLocalFile(false, true, localPath, remotePath);
fs.close();
    }
/*** 追加文件内容*/publicstaticvoidappendToFile(Configurationconf, StringlocalFilePath, StringremoteFilePath) throwsIOException {
FileSystemfs=FileSystem.get(conf);
PathremotePath=newPath(remoteFilePath);
/* 创建一个文件读入流 */FileInputStreamin=newFileInputStream(localFilePath);
/* 创建一个文件输出流,输出的内容将追加到文件末尾 */FSDataOutputStreamout=fs.append(remotePath);
/* 读写文件内容 */byte[] data=newbyte[1024];
intread=-1;
while ( (read=in.read(data)) >0 ) {
out.write(data, 0, read);
        }
out.close();
in.close();
fs.close();
    }
/*** 主函数*/publicstaticvoidmain(String[] args) {
Configurationconf=newConfiguration();
conf.set("fs.default.name","hdfs://localhost:9000");
StringlocalFilePath="/home/hadoop/text.txt";    // 本地路径StringremoteFilePath="/user/hadoop/text.txt";    // HDFS路径Stringchoice="append";    // 若文件存在则追加到文件末尾//      String choice = "overwrite";    // 若文件存在则覆盖try {
/* 判断文件是否存在 */BooleanfileExists=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);
            } elseif ( choice.equals("overwrite") ) {    // 选择覆盖HDFSApi.copyFromLocalFile(conf, localFilePath, remoteFilePath);
System.out.println(localFilePath+" 已覆盖 "+remoteFilePath);
            } elseif ( choice.equals("append") ) {   // 选择追加HDFSApi.appendToFile(conf, localFilePath, remoteFilePath);
System.out.println(localFilePath+" 已追加至 "+remoteFilePath);
            }
        } catch (Exceptione) {
e.printStackTrace();
        }
    }
}


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


0.png

直观判定为文件在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。


1.png


方法一:在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,但是为了测试方便,直接开启即可)都不建议开启


结束!

目录
相关文章
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
240 0
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验04-HDFS文件创建与写入
【大数据开发技术】实验04-HDFS文件创建与写入
403 0
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
103 34
|
3月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
78 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
3月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
67 4
|
3月前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
56 3
|
3月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
57 2
|
3月前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
57 2
|
3月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
55 1
|
3月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
71 1