Hadoop基础-通过IO流操作HDFS

时间:2023-12-13 20:48:38

                  Hadoop基础-通过IO流操作HDFS

                                        作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.上传文件

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils; import java.io.File;
import java.io.FileInputStream;
import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception {
putFileToHDFS();
} public static void putFileToHDFS() throws Exception{
//配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3");
//创建配置信息对象
Configuration conf = new Configuration();
//获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
//创建输入流
FileInputStream inStream = new FileInputStream(new File("D:\\yinzhengjie\\data\\yinzhengjie.txt"));
//获取输出路径
String putFileName = "hdfs://node105.yinzhengjie.org.cn:8020/user/yinzhengjie/2018-11-04.txt";
Path writePath = new Path(putFileName);
//创建输出流
FSDataOutputStream outStream = fs.create(writePath);
//流对接
try{
IOUtils.copyBytes(inStream, outStream, 4096, false);
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭流,释放资源
IOUtils.closeStream(inStream);
IOUtils.closeStream(outStream);
}
}
}

二.下载文件

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; import java.io.File;
import java.io.FileOutputStream;
import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception {
getFileToHDFS();
} public static void getFileToHDFS() throws Exception{
//配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3");
//创建配置信息对象
Configuration conf = new Configuration();
//获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
//获取读取文件路径
String filename = "hdfs://node105.yinzhengjie.org.cn:8020/user/yinzhengjie/2018-11-04.txt";
//创建读取path
Path readPath = new Path(filename);
//创建建输入流
FSDataInputStream inStream = fs.open(readPath);
//创建输出流,指定本地路径
FileOutputStream fos = new FileOutputStream(new File("D:\\yinzhengjie\\data\\output.txt")); try{
//流对接输出到控制台
// IOUtils.copyBytes(inStream, System.out, 4096, false);
//流对考输出到本地磁盘
IOUtils.copyBytes(inStream,fos, conf); }catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
IOUtils.closeStream(inStream);
IOUtils.closeStream(fos);
fos.close();
}
}
}

三.定位读取文件

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package hdfs.yinzhengjie.org.cn; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; import java.io.FileOutputStream;
import java.net.URI; public class HdfsClient { public static void main(String[] args) throws Exception {
readFileSeek1();
readFileSeek2();
} //读取第一个块大小,128M
public static void readFileSeek1() throws Exception{
//配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3");
//创建配置信息对象
Configuration conf = new Configuration();
//获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
//获取输入流路径
Path path = new Path("hdfs://node105.yinzhengjie.org.cn:8020//yinzhengjie/cloudera-manager.tar.gz");
//打开输入流
FSDataInputStream fis = fs.open(path);
//创建输出流
FileOutputStream fos = new FileOutputStream("D:\\yinzhengjie\\data\\cloudera-manager-1.tar.gz");
//定义缓冲区大小是1024
byte[] buf = new byte[1024];
//读取一个128M的文件
for (int i = 0; i < 128 * 1024; i++) {
//将数据从输入流读出然后在写入输出流。
fis.read(buf);
fos.write(buf);
}
//关闭流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
} //将128M后续的大小都读取出来
public static void readFileSeek2() throws Exception{
//配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3");
//创建配置信息对象
Configuration conf = new Configuration();
//获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
//获取输入流路径
Path path = new Path("hdfs://node105.yinzhengjie.org.cn:8020//yinzhengjie/cloudera-manager.tar.gz");
//打开输入流
FSDataInputStream fis = fs.open(path);
//创建输出流
FileOutputStream fos = new FileOutputStream("D:\\yinzhengjie\\data\\cloudera-manager-2.tar.gz");
//定位偏移量(第二块的首位,1024*1024就是1M,也就是说他的起始位置是从128M开始的!)
fis.seek(1024 * 1024 * 128);
//流对接
IOUtils.copyBytes(fis, fos, 1024);
//关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
} /**
* 将数据写入到本地后,可以使用cmd窗口进入到“D:\yinzhengjie\data”目录中,并执行:D:\yinzhengjie\data>type cloudera-manager-2.tar.gz >> cloudera-manager-1.tar.gz
* 之后你可以拿到完整的数据,也可以解压该文件的详细信息。
*/