本地多级文件 合并上传到hdfs(递归上传)

本文介绍了一种将本地多级目录结构中的文件递归合并并上传至HDFS的方法。通过自定义Java程序实现文件的读取、合并及上传流程,适用于大数据场景下对文件进行高效管理。
package com.hdfs;


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.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


import com.beicai.utils.MyUtils;
/**
 * 
 * @described 本地多级文件 合并上传到hdfs(递归上传)
 */
public class HdfsWork1 {
public static void main(String[] args) throws Exception {
myMerge();
}

public static void myWrite(Path path,LocalFileSystem lfs,FSDataOutputStream fsdos) throws Exception{
FileStatus[] fst = lfs.listStatus(path);//获得本地文件的数组
FSDataInputStream fsdis = null;
for(int i=0;i<fst.length;i++){
if(fst[i].isDirectory()){//是文件夹继续调用本方法
myWrite(fst[i].getPath(),lfs,fsdos);
} else {
fsdis = lfs.open(fst[i].getPath());//打开文件输入流
int read = 0;
byte[] buffer = new byte[255];
while((read=fsdis.read(buffer))>0){//读取文件并输出到hdfs上
fsdos.write(buffer, 0, read);
}
IOUtils.closeStream(fsdis);//关闭文件输入流
}
}
}

public static void myMerge() throws Exception{
FileSystem fs = MyUtils.getFileSystem();//获取hdfs文件系统
LocalFileSystem lfs = MyUtils.getLocalFileSystem();//获得本地文件系统
Path localPath = new Path("D:/data");//本地路径
Path hdfsPath = new Path("/data/file1.txt");//hdfs路径

FSDataOutputStream fsdos = fs.create(hdfsPath);//dfs文件输出流
myWrite(localPath,lfs,fsdos);//调用递归方法
IOUtils.closeStream(fsdos);//关闭输出流
}

}


下面是工具类

package com.utils;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;


/**
 * 
 * @described 获取文件系统
 * @author 
 * @date 
 * @see 
 */
public class MyUtils {

public static FileSystem getFileSystem() throws Exception{
Configuration conf =new Configuration();
FileSystem fs = FileSystem.newInstance(conf);
return fs;
}
public static LocalFileSystem getLocalFileSystem() throws Exception{
return FileSystem.newInstanceLocal(new Configuration());
}
}

1.在 HDFS 的/user目录下创建一个名为hdfs_prac_01的目录,创建完成后用ls命令查看/user目录,确认该目录是否成功创建。 2.使用vi命令在 Linux 本地家目录下创建data_01.txt文件,输入内容 “HDFS Practical Exercise 01”,再将该文件上传HDFS 的/user/hdfs_prac_01目录,上传后验证 HDFS 目标目录是否存在该文件。 3.执行 HDFS 命令,查看/user/hdfs_prac_01/data_01.txt文件的内容,确保文件上传后的内容与本地一致。 4.在 HDFS 的/user/hdfs_prac_01目录下,创建一个名为subdir_01的子目录,然后将/user/hdfs_prac_01/data_01.txt文件复制到subdir_01目录,复制后分别查看源路径和目标路径的文件情况。 5.使用vi在 Linux 本地创建append_01.txt文件,输入内容 “Add New Line For Append”,将该文件的内容追加到 HDFS /user/hdfs_prac_01/data_01.txt文件末尾,之后查看data_01.txt的最终内容。 6.将 HDFS /user/hdfs_prac_01/subdir_01/data_01.txt文件移动到/user/hdfs_prac_01/subdir_02目录(需先创建subdir_02目录),移动后验证subdir_01目录是否还存在该文件。 7.执行 HDFS 命令,删除/user/hdfs_prac_01/subdir_01目录(确保该目录已无文件),删除后查看/user/hdfs_prac_01目录下是否还有subdir_01。 8.在 Linux 本地家目录下创建data_02.txt(内容 “Multiple Files Merge Test 02”)和data_03.txt(内容 “Multiple Files Merge Test 03”),将这两个文件上传HDFS /user/hdfs_prac_01目录,上传后统计该目录下的文件总数。 9.使用 HDFS 命令,将/user/hdfs_prac_01/data_02.txt和/user/hdfs_prac_01/data_03.txt合并下载到 Linux 本地~/merged目录(需先创建该目录),合并后的文件命名为merged_data.txt,下载后查看merged_data.txt的内容。 10.在 HDFS 的/tmp目录下创建test_dir目录,然后将/user/hdfs_prac_01/data_01.txt文件复制到/tmp/test_dir目录,复制时要求保留文件的修改时间,应使用cp命令的哪个参数?执行完整命令并验证文件修改时间。 11.使用 HDFS 命令,查看/user/hdfs_prac_01目录下所有文件的权限信息(包括所有者、所属组、读写执行权限),写出完整命令并解释权限字段的含义。 12.在 Linux 本地创建data_04.txt,输入内容“HDFS Practical Exercise 04”,然后使用gzip命令压缩data_04.txt,将压缩后的文件将其上传HDFS /user/hdfs_prac_01目录后,使用text命令查看该文件内容,对比text命令与cat命令输出结果的差异(若有)。 13.将 HDFS /user/hdfs_prac_01/data_04.txt文件重命名为renamed_data_04.txt,重命名后查看/user/hdfs_prac_01目录下文件名称是否变更。 14.执行 HDFS 命令,递归查看/user/hdfs_prac_01目录下所有子目录及文件的信息(包括多级子目录),写出完整命令并说明参数作用。 15.将 Linux 本地家目录下所有以 “data_” 开头的.txt文件,批量上传HDFS /user/hdfs_prac_01/batch_upload目录(需先创建该目录),上传后查看batch_upload目录
最新发布
10-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值