Hadoop 1.x 实现文件上传合并功能

本文介绍了一种使用Hadoop HDFS实现多个小文件合并上传的方法。通过打开本地文件的输入流并读取内容,再将这些内容写入HDFS上指定文件的输出流来完成合并。此过程通过循环遍历本地目录中的所有文件并逐个处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     具体的见下面代码中注释

package org.dragon.hadoop.hdfs.util;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

/**
 * HDFS 实现若干小文件上传后合并功能
 * 思路:
 * 1、本地每个文件打开输入流,进行内容读取
 * 2、HDFS文件打开输出流,进行内容写入
 * 3、循环上述操作
 * 4、关闭流
 * @author Administrator
 *
 */
public class HDFSPutMergeImpl {
	
	/**
	 * 复制上传文件,并进行合并
	 * @param localDir
	 * 		本地要上传的文件目录
	 * @param hdfsFile
	 * 		HDFS上的文件全路径名称
	 */
	public static void putMerge(String localDir,String hdfsFile){
		//获取配置信息
		Configuration conf = new Configuration();
		
		//本地路径
		Path localPath = new Path(localDir);
		//HDFS路径
		Path hdfsPath = new Path(hdfsFile);
		try{
			//获取本地文件系统
			FileSystem localFs = FileSystem.getLocal(conf);
			//获取HDFS文件系统
			FileSystem hdfsFs = FileSystem.get(conf);
			
			//获取本地文件系统目录中的所有文件
			FileStatus[] status = localFs.listStatus(localPath);
			
			//打开HDFS文件的输出流
			FSDataOutputStream fsDataOutputStream = hdfsFs.create(hdfsPath);
			
			//循环遍历本地文件
			for(FileStatus fileStatus:status){
				//获取文件路径
				Path path = fileStatus.getPath();
				//打开输入流
				FSDataInputStream fsDataInputStream = localFs.open(path);
				//进行流的读写操作
				byte[] buffer = new byte[1024];
				int len = 0;
				//读到缓冲区
				while((len = fsDataInputStream.read(buffer))>0){
					//从缓冲区写入
					fsDataOutputStream.write(buffer,0,len);
				}
				//关闭本次循环流
				fsDataInputStream.close();
			}
			//关闭输出流
			fsDataOutputStream.close();
			System.out.println("success!!");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	//测试
	public static void main(String[] args) {
		String localDir = "D:/temp/demo";
		String hdfsFile = "hdfs://hadoop-master.dragon.org:9000/opt/data/test01/all.debug.log";
		putMerge(localDir, hdfsFile);
	}
}


<think>嗯,用户询问的是Hadoop创建文件的方法。考虑结合引用内容给出技术方案。引用[1]正好提到Java代码赋予创建权限,这很关键——Hadoop操作需要权限控制。引用[2][4]的代码片段有HDFS路径操作,可以整合。引用[3]展示命令但属于下载操作,说明用户可能混淆了上传/创建概念。准备分三部分回复:命令行操作(最基础)、JavaAPI(完整示例)、其他语言方案。特别注意在Java示例中加入:1.显式的权限设置代码(参考引用[1]的权限思想)2.路径替换说明(如引用[4]的提示方式)3.流关闭等健壮性处理(类似引用[2]的finally块)用户提供的引用都聚焦Java方案,所以将Python方案列为可选。考虑到HDFS的分布式特性,可以补充说明小文件合并场景(引用[4]提及)和普通创建的区别。相关问题将围绕权限问题、写入优化、不同工具对比展开,帮助用户建立完整知识链。需要特别强调命令行和API的本质区别:后者才是生产环境常用方式。</think> 在 Hadoop 中创建文件主要有以下三种方式,包含详细说明和代码示例: --- ### 一、命令行方式(HDFS Shell) **最常用方式**,通过 Hadoop 文件系统命令操作: ```bash # 创建空文件 hadoop fs -touchz /user/hadoop/test.txt # 创建文件并写入内容 (本地文件上传) echo "Hello Hadoop" > localfile.txt hadoop fs -put localfile.txt /user/hadoop/hdfs_file.txt # 直接写入内容到 HDFS hadoop fs -cat > /user/hadoop/direct.txt <<EOF This is direct content Created at $(date) EOF ``` **权限说明**:需确保用户对目标目录有`-w`权限(参考引用[1]的权限管理逻辑) --- ### 二、Java API 方式(核心方法) **生产环境推荐**,使用 Hadoop FileSystem API: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.BufferedWriter; import java.io.OutputStreamWriter; public class HDFSCreateFile { public static void main(String[] args) throws Exception { // 1. 获取 HDFS 配置 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://master:9000"); // 2. 获取文件系统实例(需关闭) try (FileSystem fs = FileSystem.get(conf)) { // 3. 设置文件路径 Path filePath = new Path("/user/hadoop/sample.txt"); // 4. 创建文件并写入数据 try (BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(fs.create(filePath))) { writer.write("Data written by Java API\n"); writer.write("Timestamp: " + System.currentTimeMillis()); } System.out.println("文件创建成功: " + filePath); } } } ``` **关键操作**: - `fs.create()` 创建新文件流(覆盖已存在文件) - `fs.append()` 追加到现有文件 - 使用 `try-with-resources` 确保流关闭(类似引用[2]的资源处理) --- ### 三、其他语言方式 1. **Python (HDFS3 库)**: ```python from hdfs import InsecureClient client = InsecureClient('http://master:50070') with client.write('/user/hadoop/pyfile.txt') as writer: writer.write("Created via Python\n") ``` 2. **REST API (WebHDFS)**: ```bash curl -i -X PUT "http://master:50070/webhdfs/v1/user/hadoop/restfile.txt?op=CREATE" ``` --- ### 注意事项 1. **路径规范**: - 完整路径格式:`hdfs://namenode:port/absolute/path`(如引用[2][4]所示) - 默认路径:可省略前缀(依赖`core-site.xml`配置) 2. **权限控制**: ```java // 创建文件时设置权限 (参考引用[1]) fs.create(filePath, FsPermission.valueOf("-rw-r--r--")); ``` 3. **小文件处理**: - 避免频繁创建小文件(可合并处理,参考引用[4]的合并策略) - 使用`SequenceFile`存储批量小文件 --- **相关问题**: 1. Hadoop 中如何追加数据到现有文件? 2. 如何正确设置 HDFS 文件的访问权限(如 755 模式)? 3. Hadoop 创建文件时发生 `PermissionDeniedException` 如何解决? 4. 对比 `hadoop fs -put` 与 Java API 的性能差异?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值