这里写一个将字符串内容写入hdfs文件的例子,项目跟上一篇通过FileSystem API 从hdfs文件系统读取文件内容类似,这里只增加一个静态方法,内容如下:
/**
* 将字符串内容写入hdfs
* @param content 要写入的内容
* @param path 路径
* @return
*/
public static String writeStringToHDFS(String content,String path) {
if(StringUtils.isBlank(path)) {
log.error("请指定hdfs文件系统中的文件路径");
return "";
}
try {
//FileSystem 对HDFS系统的引用,操作HDFS的根类,所有HDFS文件操作均以此类为源头发起
//URI.create(path):通过给定的uri方案和权限来确定要使用的文件系统
//Path HDFS文件的抽象,与Java IO流中的File对象对等
FileSystem fs = FileSystem.get(URI.create(path),conf);
//FSDataInputStream HDFS系统的文件字节输入流,类似于Java IO中的InputStream类,实现对HDFS文件的读取
//FSDataOutputStream HDFS系统的文件字节输出流,类似于Java IO中的OutputStream类,实现对HDFS文件的写入
FSDataOutputStream out = null;
try {
out = fs.create(new Path(path));
out.writeBytes(content);
}finally {
//关闭IO流
IOUtils.closeStream(out);
}
} catch (IOException e) {
log.error(e.getMessage());
}
return "";
}
这样既可以啦,测试的话这里是配合上一篇读取来测试的,执行jar的时候传入两个参数,第一个是要读取的hdfs文件,第二个是把第一步读取的文件内容写入的文件路径。
public static void main(String[] args) throws IOException {
if(args.length>1) {
//读取的hdfs文件系统的路径
String file1 = args[0];
//将读取的内容保存的文件路径
String file2 = args[1];
log.info("开始读取"+file1+"中的内容");
String content= getStringByHSFSPath(file1);
log.info("读取结果是:"+content);
log.info("将结果存入:"+file2+"中");
writeStringToHDFS(content, file2);
log.info("保存成功");
}
}
然后传输到集群中运行
yarn jar hadoop-core.jar /test.txt /abcd.txt
结果如下:
19/11/19 00:04:23 INFO util.HdfsFileOperationUtil: 开始读取/test.txt中的内容
19/11/19 00:04:28 INFO util.HdfsFileOperationUtil: 读取结果是:qwyeytqweiuyqwiuehiwqjeioqwueiqwe
eriuewyroiqeoiuqwioejwqlkd
iefhklsdhflksjdflkjlksdjflksdjlkf
sjkdhfjksdhfjsdjfjklsdjflksdjlfk
19/11/19 00:04:28 INFO util.HdfsFileOperationUtil: 将结果存入:/abcd.txt中
19/11/19 00:04:29 INFO util.HdfsFileOperationUtil: 保存成功
[hadoop@worker1 test]$ hdfs dfs -cat /abcd.txt
qwyeytqweiuyqwiuehiwqjeioqwueiqwe
eriuewyroiqeoiuqwioejwqlkd
iefhklsdhflksjdflkjlksdjflksdjlkf
sjkdhfjksdhfjsdjfjklsdjflksdjlfk
当然,刚开始我这里报了一个安全模式的错误
The reported blocks 10 needs additional 1 blocks to reach the threshold 0.9990 of total blocks 12. The number of live datanodes 1 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have b
应该是我直接关闭虚拟机没有关闭hdfs的原因导致文件损坏,然后我强行退出安全模式:
hadoop dfsadmin -safemode leave
真他喵机智!