这里写一个将字符串内容写入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: 读取结果是:qwyeytqweiuyqwiuehiwqjeioqwueiqweeriuewyroiqeoiuqwioejwqlkdiefhklsdhflksjdflkjlksdjflksdjlkfsjkdhfjksdhfjsdjfjklsdjflksdjlfk19/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.txtqwyeytqweiuyqwiuehiwqjeioqwueiqweeriuewyroiqeoiuqwioejwqlkdiefhklsdhflksjdflkjlksdjflksdjlkfsjkdhfjksdhfjsdjfjklsdjflksdjlfk
当然,刚开始我这里报了一个安全模式的错误
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
真他喵机智!
