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
* 之后你可以拿到完整的数据,也可以解压该文件的详细信息。
*/

Hadoop基础-通过IO流操作HDFS的更多相关文章

  1. io 流操作hdfs

    hdfs 文件上传 本地   -------->    文件系统对象   -------->    hdfs 文件系统 输入流                                ...

  2. Hadoop基础-MapReduce的Join操作

    Hadoop基础-MapReduce的Join操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.连接操作Map端Join(适合处理小表+大表的情况) no001 no002 ...

  3. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  4. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  5. Java IO流操作汇总: inputStream 和 outputStream【转】

    我们在进行Android java 开发的时候,经常会遇到各种IO流操作.IO流操作一般分为两类:字符流和字节流.以“Reader”结尾都是字符流,操作的都是字符型的数据:以“Stream”结尾的都是 ...

  6. IO流----操作文件的9种方法代码实现

    IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1:          每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...

  7. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  8. python IO流操作

    python IO流操作 学习完本篇,你将会独立完成 实现操作系统中文件及文件目录的拷贝功能. 将目标图片拷贝到指定的目录中 实现一个自动阅卷程序, Right.txt保存正确答案,xx(学生姓名). ...

  9. Hadoop学习(2)-java客户端操作hdfs及secondarynode作用

    首先要在windows下解压一个windows版本的hadoop 然后在配置他的环境变量,同时要把hadoop的share目录下的hadoop下的相关jar包拷贝到esclipe 然后Build Pa ...

随机推荐

  1. Android大学课件SQLite3 数据库操作

    一.数据库介绍 SQLite3:当有大量相似结构的数据需要存储的时候 . 其实SQLite3 就是一个文件,类似之前学过的MySQL SqlServer等. 二.SQLiteOpenHelper 是一 ...

  2. 【HDU5950】Recursive sequence(矩阵快速幂)

    BUPT2017 wintertraining(15) #6F 题意 \(f(1)=a,f(2)=b,f(i)=2*(f(i-2)+f(i-1)+i^4)\) 给定n,a,b ,\(N,a,b < ...

  3. 自学Python4.4-装饰器的进阶

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  4. Android RadioGroup 学习

    Api 参考地址 博文地址 RadioGroup相关属性: //返回该单选按钮组中所选择的单选按钮的标识 ID,如果没有选中的单选按钮则返回 -1. RadioGroup.getCheckedRadi ...

  5. Dynamic CRM 2015学习笔记(2)更改系统显示语言

    默认装的是英文的系统,想换成中文的.下面列出操作步骤: 1. 下载并安装语言包 http://www.microsoft.com/en-US/download/details.aspx?id=4501 ...

  6. Libre OJ 144、145 (DFS序)

    部分参考自博客:https://blog.csdn.net/hpu2022/article/details/81910490 在许多问题中,由于树结构复杂通常会导致问题很棘手,因为其实非线性结构,操作 ...

  7. C# Winform 对话框控件&简单记事本

    一.对话框 1.弹出可供用户选择“确定”.“取消”的对话框 Dialogresult dr =  MessigeBox.Show("这里显示的是对话框的内容","这里显示 ...

  8. C# 下载文件 只利用文件的存放路径来下载

    第一种方式: 最简单的就是返回一个file类型的数据即FilePathResult类型的对象 string serverPath = ConfigurationManager.AppSettings[ ...

  9. Django 配置QQ邮箱连接

    首先要在settings.py内进行配置 # 邮件服务配置文件 EMAIL_USE_SSL = True # 邮箱服务 EMAIL_HOST = 'smtp.qq.com' # 端口号 EMAIL_P ...

  10. C++ 容器操作

    typedef struct point { int x; int y; }Point; 在声明变量的时候就可以:Point p1; 如果没有typedef, 如: struct point { in ...