上篇链接:
Hadoop学习篇(二)——HDFS编程操作2
说明:如涉及到侵权,请及时联系我,并在第一时间删除文章。
2.3.2 编程操作
HDFS的编程操作,实际上就是用高级语言模拟HDFS的命令行操作,从而做到机器代替人工的大量处理。
我们的编程操作主要进行模拟的有:
- 判断文件是否存在
- 实现ls命令
- 实现cat命令
- 写入HDFS
- HDFS文件的下载与上传
2.3.2.4 写入HDFS
写入文件到HDFS通过创建FSDataOutputStream数据输出流,将写入内容转换为二进制形式放入流中,写入文件。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class HadoopOp {
private static Configuration conf;
private static FileSystem fs;
public static void main(String[] args) {
conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
fs = FileSystem.get(conf);
writeFile();
fs.close();
}
public static void writeFile(Configuration conf, FileSystem fs, String filePath, String content) {
try {
byte[] buff = content.getBytes(); // 写入文件内容转换为字节数组
FSDataOutputStream fsDataOutputStream = fs.create(new Path(filePath));
fsDataOutputStream.write(buff, 0, buff.length); // 写入文件内容
fsDataOutputStream.close();
} catch (IOExpection e) {
e.printStackTrace();
} finally {
System.out.println(content + "\n已写入\n" + filePath);
}
}
}
运行结果:
查看HDFS上创建的文件内容:
在进行HDFS写入文件内容的编程操作时,应注意两点:1、如果文件不存在,程序会自动创建;2、对于已存在文件的写入,这种写操作是覆盖写,和Java读写本地文件不同的是,HDFS没有提供追加写的相关API,这里我们可以自己通过修改变成逻辑,来实现追加写入。
2.3.2.5 HDFS文件的下载与上传
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.*;
public class HadoopOp {
private static Configuration conf;
private static FileSystem fs;
public static void main(String[] args) {
conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
fs = FileSystem.get(conf);
System.out.println("----------------------------------------------------------------");
putFile(conf, fs, "/usr/local/Cellar/hadoop/Exp/wanghe/wanghe1.txt", "/wanghe/text/wanghe1.txt");
System.out.println("----------------------------------------------------------------");
getFile(conf, fs, "/usr/local/Cellar/hadoop/Exp/wanghe/wanghe2.txt", "/wanghe/text/wanghe2.txt");
fs.close();
}
public static void putFile(Configuration conf, FileSystem fs, String localFile, String hdfsPath) {
try {
FileInputStream fileInputStream = new FileInputStream(new File(localFile));
FSDataOutputStream fileOutputStream = fs.create(new Path(hdfsPath));
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fileInputStream.read()) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("本地文件:" + localFile + "\n已写入HDFS:" + hdfsPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void getFile(Configuration conf, FileSystem fs, String localFile, String hdfsPath) {
try {
FSDataInputStream fsDataInputStream = fs.create(new Path(hdfsPath));
File file = new File(localFile);
if (!file.isExists()) {
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(file, true); // 追加写入文件
byte[] b = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(b)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fsDataInputStream.close();
fileOutputStream.close();
System.out.println("HDFS文件:" + hdfsPath + "\n已下载到本地:" + localFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果为:
我们查看下载至本地文件内容与源文件内容:
我们查看上传至HDFS文件内容与源文件内容: