第2关:HDFS-JAVA接⼝之读取⽂件
任务描述
本关任务:使⽤HDFS的Java接⼝进⾏⽂件的读写,⽂件uri地址为hdfs://localhost:9000/user/。
相关知识
在本关和之后的关卡中,我们要深⼊探索Hadoop的FileSystem类,它是与Hadoop的某⼀⽂件系统进⾏交互的API。
为了完成本关任务,你需要学习并掌握:1.FileSystem对象的使⽤,2.FSDataInputSteam对象的使⽤。
如果你想要在windows下调试编写Hadoop程序,可以查看这篇帖⼦:
FileSystem对象
要从Hadoop⽂件系统中读取⽂件,最简单的办法是使⽤java.URL对象打开数据流,从中获取数据。不过这种⽅法⼀般要使
⽤FsUrlStreamHandlerFactory实例调⽤setURLStreamHandlerFactory()⽅法。不过每个Java虚拟机只能调⽤⼀次这个⽅法,所以如果其他第三⽅程序声明了这个对象,那我们将⽆法使⽤了。
因为有时候我们不能在程序中设置URLStreamHandlerFactory实例,这个时候咱们就可以使⽤FileSystem API来打开⼀个输⼊流,进⽽
对HDFS进⾏操作。
FileSystem API 实例
接下来我们通过⼀个 实例 来学习它的⽤法。
⾸先我们在本地创建⼀个⽂件,然后上传到HDFS以供测试。
接下来,我们使⽤FileSystem,查看咱们刚刚上传的⽂件。
⽰例代码如下:
1. public sattic void main(String[] args){
2. URI uri = ate("hdfs://localhost:9000/user/");
3. Configuration config = new Configuration();
4. FileSystem fs = (uri, config);
5. InputStream in = null;
6. try {
7. in = fs.open(new Path(uri));
8. pyBytes(in, System.out, 2048, false);
9. } catch (Exception e) {
10. IOUtils.closeStream(in);
11. }
12. }
你可以直接在右侧命令⾏与代码⽂件中测试,点击评测可以查看代码运⾏效果。运⾏成功效果如下:
上⽂中,FileSystem是⼀个通⽤的⽂件系统API,FileSystem实例有下列⼏个静态⼯⼚⽅法⽤来构造对象。
1. public static FileSystem get(Configuration conf)throws IOException
2. public static FileSystem get(URI uri,Configuration conf)throws IOException
3. public static FileSystem get(URI uri,Configuration conf,String user)throws IOException
Configuration对象封装了客户端或服务器的配置,通过设置配置⽂件读取类路径来实现(如:/etc/l)。
第⼀个⽅法返回的默认⽂件系统是在l中指定的,如果没有指定,就使⽤默认的⽂件系统。
第⼆个⽅法使⽤给定的URI⽅案和权限来确定要使⽤的⽂件系统,如果给定URI中没有指定⽅案,则返回默认⽂件系统,第三个⽅法作为给定⽤户来返回⽂件系统,这个在安全⽅⾯来说⾮常重要。
FSDataInputStream对象
实际上,FileSystem对象中的open()⽅法返回的就是FSDataInputStream对象,⽽不是标准的java.io类对象。这个类是继承了java.io.DataInputStream的⼀个特殊类,并⽀持随机访问,由此可以从流的任意位置读取数据。
在有了FileSystem实例之后,我们调⽤open()函数来获取⽂件的输⼊流。
1. public FSDataInputStream open(Path p)throws IOException
2. public abstract FSDataInputStream open(Path f,int bufferSize)throws IOException
第⼀个⽅法使⽤默认的缓冲区⼤⼩为4KB。
了解了这些,我们在来回顾上⽂代码,就能更好的理解这些⽅法的作⽤了:
编程要求
在右侧代码编辑区中编写代码实现如下功能:
使⽤FSDataInputStream获取HDFS的/user/hadoop/⽬录下的的⽂件内容,并输出,其
中uri为hdfs://localhost:9000/user/。
测试说明
点击评测,平台会通过脚本创建/user/⽂件并添加相应内容,⽆需你⾃⼰创建,开启ha
doop,编写代码点击评测即可。因为Hadoop环境⾮常消耗资源,所以你如果⼀段时间不在线,后台会销毁你的镜像,之前的数据会丢失(你的代码不会丢失),这个时候需要你重新启动Hadoop。
public class FileSystemCat {
public static void main(String[] args) throws IOException { URI uri = ate("hdfs://localhost:9000/user/");
Configuration config = new Configuration();
FileSystem fs = (uri, config);
InputStream in = null;
try {
in = fs.open(new Path(uri));
} catch (Exception e) {
IOUtils.closeStream(in);
}
}
}
预期输出:
WARN [main] - Unable to load native-hadoop library for using builtin-java classes where applicable
怕什么真理⽆穷,进⼀⼨有⼀⼨的欢喜。
第⼀⾏打印出来的是log4j的⽇志警告,可以忽略。
开始你的任务吧,祝你成功!
>在线代码运行器
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论