Hadoop实践(三)---使用HDFS的Java API
2016-10-07 16:06
323 查看
HDFS Java API 可以用于任何Java程序与HDFS交互,该API使我们能够从其他Java程序中利用到存储在HDFS中的数据,也能够使用其他非Hadoop的计算框架处理该数据 为了以编程方式与HDFS进行交互,首先需要得到当前配置文件系统的句柄,实例化一个Configuration对象,并获得一个Hadoop环境中的FileSystem句柄,它将指向当前环境的HDFS NameNode
Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf);
FileSystem.create(filepath);方法会在指定的路径创建一个新的文件,并提供一个到新创建的文件的FSDataOutputStream对象;FSDataOutputStream封装了java.io.DataOutputStream,并允许程序向文件中写入基本Java数据类型;如果该文件存在FileSystem.create()方法会覆盖该文件
Path file = new Path("demo.txt"); FSDataOutputStream outStream = fs.create(file); outStream.writeUTF("Welcome to HDFS Java API !!!"); outStream.close();
在该例子中,该文件将在HDFS中相对于用户的主目录进行创建,产生类似/user/user_name/demo.txt的路径
FileSyste.open(filePath)打开给定文件的FSDataInputStream,FSDataInputStream封装了java.io.DataInputStream,允许程序从文件中读取剧本Java数据类型
FSDataInputStream inStream = fs.open(file); String data = inStream.readUTF(); System.out.println(data); inStream.close();
配置文件系统对象
可以在Hadoop的环境之外使用HDFS的Java API,这样做必须显示配置HDFS的NameNode和端口,以下是几种进行该项配置的方法:在获得FileSystem对象之前加载Configuration对象的配置文件,需要确保所有的Hadoop和依赖库都添加在类路径中
Configuration conf = new Configuration(); conf.addResource(new Path(".../hadoop/conf/core-site.xml")); conf.addResource(new Path(".../hadoop/conf/hdfs-site.xml")); FileSystem fs = FileSystem.get(conf);
通过指定NameNode和端口,将NAMENODE_HOSTNAME和PORT替换为HDFS安装的NameNode的主机名和端口
Configuration conf = new Configuration(); conf.set("fs.default.name","hdfs://NAMENODE_HOSTNAME:PORT"); FileSystem fs = FileSystem.get(conf);
HDFS的文件系统API是一种支持多个文件系统的抽象,如果上述程序无法找到有效的HDFS配置,它将会指向本地文件系统,而不是HDFS,可以使用getUti()函数识别FileSystem对象的当前文件系统,在使用正确的HDFS配置文件的情况下,返回hdfs://your_namenode:port,在使用本地文件系统的情况下,则返回file:///
FileSystem fs = FileSystem.get(conf); fs.getUri();
获取文件的数据块列表
FileSystem对象的getFileBlockLocations()函数,可以用来获取存储在HDFS中的文件数据块的列表,同时可以获取存储块的主机名和块的偏移量,如果计划使用Hadoop MapReduce之外的其他框架执行文件数据的任何数据本地化操作,那么这些信息非常有用Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf);
Path file = new Path("demo.txt");
FileStatus fileStatus = fs.getFileStatus(file);
eBlockLocations[]= blocks = fs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());
相关文章推荐
- hadoop学习之HDFS(2.8):hdfs的javaAPI使用及示例
- Hadoop学习笔记:HDFS的java API使用
- 使用Hadoop的JAVA API远程访问HDFS
- 使用Hadoop的Java API操作HDFS
- Hadoop总结:在java中使用FileSystem的api读写数据(能力工场)
- Hadoop Java API 操作 hdfs--1
- hadoop - hadoop2.6 伪分布式 - Java API 操作 HDFS
- hadoop之hdfs api的简单使用
- JAVA操作HDFS API(hadoop)
- HDFS中Java的API使用测试
- Sqoop-1.4.6 mysql数据导出到HDFS提示;注: java使用或覆盖了已过时的 API。关详细信息, 请使用 -Xlint:deprecation 重新编译。
- HDFS中Java的API使用测试
- Zookeeper实践(三)java api 使用
- 使用老版本的java api提交hadoop作业
- 使用JAVA将Hadoop HDFS中的日志文件导入HBase中(一)
- JAVA操作HDFS API(hadoop)
- 使用Hadoop API操作HDFS文件时遇到的问题及解决总结
- 使用Hadoop提供的API操作HDFS
- 使用Hadoop API访问Kerberos 安全HDFS
- 第二篇:Hadoop HDFS常用JAVA api操作程序