离线计算系统之HDFS Java API
HDFS的java操作:hdfs在生产应用中主要是客户端的开发,其核心步骤是从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件
一、搭建开发环境
1、引入依赖
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.1</version>
</dependency>
2、window下开发的说明注:如需手动引入jar包,hdfs的jar包----hadoop的安装目录的share下
建议在linux下进行hadoop应用的开发,不会存在兼容性问题。如在window上做客户端应用开发,需要设置以下环境:
- 在windows的某个目录下解压一个hadoop的安装包
- 将安装包下的lib和bin目录用对应windows版本平台编译的本地库替换
- 在window系统中配置HADOOP_HOME指向你解压的安装包
- 在windows系统的path变量中加入hadoop的bin目录
二、获取api中的客户端对象
在java中操作hdfs,首先要获得一个客户端实例
public class TestHDFS {Configuration conf = null;FileSystem fs = null;@Beforepublic void conn() throws IOException {conf = new Configuration();// conf.set("fs.defaultFS", "hdfs://192.168.18.103:9000");fs = FileSystem.get(conf);}@Afterpublic void close() throws IOException {fs.close();}
}
我们的操作目标是HDFS,所以获取到的fs对象应该是DistributedFileSystem的实例;
那么get方法是从何处判断具体实例化那种客户端类呢?
——从conf中的一个参数 fs.defaultFS的配置值判断: 如果我们的代码中没有指定fs.defaultFS,并且工程classpath下也没有给定相应的配置,conf中的默认值就来自于hadoop的jar包中的core-default.xml,默认值为: file:///,则获取的将不是一个DistributedFileSystem的实例,而是一个本地文件系统的客户端对象
三、DistributedFileSystem实例对象所具备的方法
四、客户端操作数据代码示例:
4.1、文件的增删改查
public class HdfsClient {FileSystem fs = null;@Beforepublic void init() throws Exception {// 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI// 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址// new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml// 然后再加载classpath下的hdfs-site.xmlConfiguration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://hdp-node01:9000");/*** 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置*/conf.set("dfs.replication", "3");// 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例// fs = FileSystem.get(conf);// 如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");}/*** 往hdfs上传文件** @throws Exception*/@Testpublic void testAddFileToHdfs() throws Exception {// 要上传的文件所在的本地路径Path src = new Path("g:/redis-recommend.zip");// 要上传到hdfs的目标路径Path dst = new Path("/aaa");fs.copyFromLocalFile(src, dst);fs.close();}/*** 从hdfs中复制文件到本地文件系统** @throws IOException* @throws IllegalArgumentException*/@Testpublic void testDownloadFileToLocal() throws IllegalArgumentException, IOException {fs.copyToLocalFile(new Path("/jdk-7u65-linux-i586.tar.gz"), new Path("d:/"));fs.close();}@Testpublic void testMkdirAndDeleteAndRename() throws IllegalArgumentException, IOException {// 创建目录fs.mkdirs(new Path("/a1/b1/c1"));// 删除文件夹 ,如果是非空文件夹,参数2必须给值truefs.delete(new Path("/aaa"), true);// 重命名文件或文件夹fs.rename(new Path("/a1"), new Path("/a2"));}/*** 查看目录信息,只显示文件** @throws IOException* @throws IllegalArgumentException* @throws FileNotFoundException*/@Testpublic void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {// 思考:为什么返回迭代器,而不是List之类的容器RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);while (listFiles.hasNext()) {LocatedFileStatus fileStatus = listFiles.next();System.out.println(fileStatus.getPath().getName());System.out.println(fileStatus.getBlockSize());System.out.println(fileStatus.getPermission());System.out.println(fileStatus.getLen());BlockLocation[] blockLocations = fileStatus.getBlockLocations();for (BlockLocation bl : blockLocations) {System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset());String[] hosts = bl.getHosts();for (String host : hosts) {System.out.println(host);}}System.out.println("--------------为angelababy打印的分割线--------------");}}/*** 查看文件及文件夹信息** @throws IOException* @throws IllegalArgumentException* @throws FileNotFoundException*/@Testpublic void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException {FileStatus[] listStatus = fs.listStatus(new Path("/"));String flag = "d-- ";for (FileStatus fstatus : listStatus) {if (fstatus.isFile()) flag = "f-- ";System.out.println(flag + fstatus.getPath().getName());}}
}
4.2、通过流的方式访问hdfs
/*** 相对那些封装好的方法而言的更底层一些的操作方式* 上层那些mapreduce spark等运算框架,去hdfs中获取数据的时候,就是调的这种底层的api* @author**/
public class StreamAccess { FileSystem fs = null;@Beforepublic void init() throws Exception {Configuration conf = new Configuration();fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");}@Testpublic void testDownLoadFileToLocal() throws IllegalArgumentException, IOException{ //先获取一个文件的输入流----针对hdfs上的FSDataInputStream in = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));//再构造一个文件的输出流----针对本地的FileOutputStream out = new FileOutputStream(new File("c:/jdk.tar.gz"));//再将输入流中数据传输到输出流IOUtils.copyBytes(in, out, 4096); }/*** hdfs支持随机定位进行文件读取,而且可以方便地读取指定长度* 用于上层分布式运算框架并发处理数据* @throws IllegalArgumentException* @throws IOException*/@Testpublic void testRandomAccess() throws IllegalArgumentException, IOException{//先获取一个文件的输入流----针对hdfs上的FSDataInputStream in = fs.open(new Path("/iloveyou.txt")); //可以将流的起始偏移量进行自定义in.seek(22); //再构造一个文件的输出流----针对本地的FileOutputStream out = new FileOutputStream(new File("c:/iloveyou.line.2.txt"));IOUtils.copyBytes(in,out,19L,true); } /*** 显示hdfs上文件的内容* @throws IOException* @throws IllegalArgumentException*/@Testpublic void testCat() throws IllegalArgumentException, IOException{ FSDataInputStream in = fs.open(new Path("/iloveyou.txt"));IOUtils.copyBytes(in, System.out, 1024);}
}
4.3、场景编程
在mapreduce 、spark等运算框架中,有一个核心思想就是将运算移往数据,或者说,就是要在并发计算中尽可能让运算本地化,这就需要获取数据所在位置的信息并进行相应范围读取
以下模拟实现:获取一个文件的所有block位置信息,然后读取指定block中的内容
@Testpublic void testCat() throws IllegalArgumentException, IOException{FSDataInputStream in = fs.open(new Path("/weblog/input/access.log.10"));//拿到文件信息FileStatus[] listStatus = fs.listStatus(new Path("/weblog/input/access.log.10"));//获取这个文件的所有block的信息BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(listStatus[0], 0L, listStatus[0].getLen());//第一个block的长度long length = fileBlockLocations[0].getLength();//第一个block的起始偏移量long offset = fileBlockLocations[0].getOffset();System.out.println(length);System.out.println(offset);//获取第一个block写入输出流
// IOUtils.copyBytes(in, System.out, (int)length);byte[] b = new byte[4096];FileOutputStream os = new FileOutputStream(new File("d:/block0"));while(in.read(offset, b, 0, 4096)!=-1){os.write(b);offset += 4096;if(offset>=length) return;};os.flush();os.close();in.close();}
离线计算系统之HDFS Java API相关推荐
- HDFS Java API 操作
文章目录 HDFS Java API操作 零.启动hadoop 一.HDFS常见类接口与方法 1.hdfs 常见类与接口 2.FileSystem 的常用方法 二.Java 创建Hadoop项目 1. ...
- Linux下Hadoop hdfs Java API使用
0 前言 搞了大约2天时间终于把Linux下面Java API的使用给弄清楚了.做个笔记方便以后参考.环境如下所示 Hadoop:2.5.1 Linux:Ubuntu kylin eclipse:lu ...
- 分布式文件系统—HDFS—Java API操作
原文作者:jiangw-Tony 原文地址:HDFS基础使用 hdfs 在生产应用中主要是客户端的开发,其核心步骤是从 hdfs 提供的 api 中构造一个 HDFS的访问客户端对象,然后通过该客户端 ...
- hdfs java api 读写文件操作_第十讲:通过JavaAPI对HDFS读写
上一讲我们通过java api 接口对虚拟机里面的hdfs进行了新建文件夹.下面我们要进行其他的操作: 注,以下的所有内容都是在第九讲的代码的基础上的. 1.删除hdfs上面的文件夹 2.删除dhfs ...
- HDFS java API操作
HDFS的javaAPI操作 目标:掌握如何使用API对HDFS上的目录和数据进行增.删.改.查操作. 1.idea创建maven工程 2.修改pom.xml文件如下: (需要下载jar包,时间可能稍 ...
- java hdfs创建文件_使用HDFS java api 创建文件出错。
//创建文件核心代码 public static void createNewHDFSFile(String toCreateFilePath, String content) throws IOEx ...
- hadoop hdfs (java api)
简单介绍使用java控制hdfs文件系统 一.注意namenode端访问权限,修改hdfs-site.xml文件或修改文件目录权限 本次采用修改hdfs-site.xml用于测试,在configura ...
- HDFS Java API 实践
文章目录 1. 启动 Hadoop 集群 2. 使用 HDFS Shell 3. 使用 HDFS Web UI 4. 安装 Eclipse IDE 4.1 上传文件 4.2 查询文件位置 4.3 创建 ...
- hdfs java api读写
如果想在win下下载hdfs的文件,需要安装hadoop的win版,因为写入磁盘的程序对linux和win编译结果不同 下载地址是: https://github.com/cdarlint/winut ...
最新文章
- Python打包PyPI上传实践
- Discuz!NT控件剖析 之 Button [原创: 附源码]
- 机器学习基础(1)——绪论
- Laravel的Class Laravel\Passport\Passport not found
- 10个用于处理日期和时间的 Python 库
- vscode输入vue自动_使用vscode,新建.vue文件,tab自动生成vue代码模板
- C语言switch如何退出,C语言萌新,想问问如何让下面那个switch函数输出的结果继续...
- 将有格式的int解析成float
- mysql取系统当前时间的函数
- 利用划分树求解整数区间内第K大的值
- WinCE应用程序产生Data Abort 错误分析
- lora发射和接收原理_无线收发模块LoRa
- python单元测试框架作用_Python单元测试框架:Pytest简介
- dll导出类比较好的方式
- 公司IT管理制度——案例分享
- 性别为什么不适合建立索引-值重复率高的字段不适合建索引
- Lucas-Kanade 算法原理以及应用
- bzoj2456瞎搞
- 搜狗百度seo推广优化需要注意的三大事项
- 近端梯度法(proximal gradient)
热门文章
- MATLAB中画曲线网格
- 中学计算机课小课题,小学信息技术学科小课题结题统计表已结题23个一等奖3.doc...
- 电脑桌面怎么恢复正常?
- 待时间嘉许,等春风得意(19年11月总结)
- C语言-泰勒级数求e
- [记录]hololens导出时报错 缺少命名空间“Windows.Devices.Haptics”
- 合并BIN文件的两种方法
- 二进制差分码规则_一篇文章弄明白Node.js与二进制数据流
- 网页设计作业-个人博客
- IDEA中把springboot项目中工具类打成jar包,其他项目进行依赖引用