使用到的hdfs的包文件:
org.apache.hadoop.fs.FSDataInputStream:hdfs文件系统输入流
io流方式上传文件
当数据在系统中不是以文本形式存在时,可以通过io流对接的方式写入hdfs,省去了将数据流先本地持久化后再在上传hdfs。
public static void main(String[] args) throws Exception {
//获取文件系统,在本地配置core后,就不需要在代码中配置hdfs地址和用户名
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(configuration);
//确定输出流
FSDataOutputStream fos = fs.create(new Path("/test/abc"));
//输入流,没有生产数据流的环境,就从文件读取,如果是文件上传不必要使用流,这里用作演示
FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\统计学.txt"));
//对接流,org.apache.hadoop.io.IOUtils; 然后关闭流
IOUtils.copyBytes(fis, fos, configuration);
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
io流方式上传下载
...
FSDataInputStream fis = fs.open(new Path("/test/abc")); //输入流
FileOutputStream fos = new FileOutputStream(new
File("C:\\Users\\Administrator\\Desktop\\acr")); //输出流
IOUtils.copyBytes(fis, fos, configuration); //流对接
...
io分块读取hdfs实现大文件下载
fs.seek(1024*1024*128)
hadoop3中,一个块大小默认是128m, 一个块大小等于 128*1204*1024B ,大文件时逐块读取,用seek定位遍历读取