大数据从入门到实战-HDFS-JAVA接口之读取文件

在本关和之后的关卡中,我们要深入探索HadoopFileSystem类,它是与Hadoop的某一文件系统进行交互的API

为了完成本关任务,你需要学习并掌握:1.FileSystem对象的使用,2.FSDataInputSteam对象的使用。

如果你想要在windows下调试编写Hadoop程序,可以查看这篇帖子:在Windows下开发Hadoop程序

FileSystem对象

要从Hadoop文件系统中读取文件,最简单的办法是使用java.net.URL对象打开数据流,从中获取数据。不过这种方法一般要使用FsUrlStreamHandlerFactory实例调用setURLStreamHandlerFactory()方法。不过每个Java虚拟机只能调用一次这个方法,所以如果其他第三方程序声明了这个对象,那我们将无法使用了。
因为有时候我们不能在程序中设置URLStreamHandlerFactory实例,这个时候咱们就可以使用FileSystem API来打开一个输入流,进而对HDFS进行操作。

FileSystem API 实例
接下来我们通过一个 实例 来学习它的用法。

首先我们在本地创建一个文件,然后上传到HDFS以供测试。

接下来,我们使用FileSystem,查看咱们刚刚上传的文件。
示例代码如下:

  1. public sattic void main(String[] args){
    URI uri = URI.create("hdfs://localhost:9000/user/tmp/test.txt");
    Configuration config = new Configuration();
    FileSystem fs = FileSystem.get(uri, config);
    InputStream in = null;
    try {
    in = fs.open(new Path(uri));
    IOUtils.copyBytes(in, System.out, 2048, false);
    } catch (Exception e) {
    IOUtils.closeStream(in);
    }
    }

你可以直接在右侧命令行与代码文件中测试,点击评测可以查看代码运行效果。运行成功效果如下:

上文中,FileSystem是一个通用的文件系统APIFileSystem实例有下列几个静态工厂方法用来构造对象。


public static FileSystem get(Configuration conf)throws IOException
public static FileSystem get(URI uri,Configuration conf)throws IOException
public static FileSystem get(URI uri,Configuration conf,String user)throws IOException
 

Configuration对象封装了客户端或服务器的配置,通过设置配置文件读取类路径来实现(如:/etc/hadoop/core-site.xml)。

  • 第一个方法返回的默认文件系统是在core-site.xml中指定的,如果没有指定,就使用默认的文件系统。
  • 第二个方法使用给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则返回默认文件系统,
  • 第三个方法作为给定用户来返回文件系统,这个在安全方面来说非常重要。

FSDataInputStream对象

实际上,FileSystem对象中的open()方法返回的就是FSDataInputStream对象,而不是标准的java.io类对象。这个类是继承了java.io.DataInputStream的一个特殊类,并支持随机访问,由此可以从流的任意位置读取数据。

在有了FileSystem实例之后,我们调用open()函数来获取文件的输入流。


public FSDataInputStream open(Path p)throws IOException
public abstract FSDataInputStream open(Path f,int bufferSize)throws IOException

第一个方法使用默认的缓冲区大小为4KB

了解了这些,我们在来回顾上文代码,就能更好的理解这些方法的作用了:

编程要求

在右侧代码编辑区中编写代码实现如下功能:

  • 使用FSDataInputStream获取HDFS/user/hadoop/目录下的task.txt的文件内容,并输出,其中urihdfs://localhost:9000/user/hadoop/task.txt

测试说明

点击评测,平台会通过脚本创建/user/hadoop/task.txt文件并添加相应内容,无需你自己创建,开启hadoop,编写代码点击评测即可。因为Hadoop环境非常消耗资源,所以你如果一段时间不在线,后台会销毁你的镜像,之前的数据会丢失(你的代码不会丢失),这个时候需要你重新启动Hadoop

代码文件

package step2;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


public class FileSystemCat {
	public static void main(String[] args) throws IOException {
		//请在Begin-End之间添加你的代码,完成任务要求。
        /********* Begin *********/
    URI uri = URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
    Configuration config = new Configuration();
    FileSystem fs = FileSystem.get(uri, config);
    InputStream in = null;
    try {
        in = fs.open(new Path(uri));
        IOUtils.copyBytes(in, System.out, 2048, false);
    } catch (Exception e) {
        IOUtils.closeStream(in);
    }
		/********* End *********/
	}
}

命令行


root@evassh-12039904:~# start-dfs.sh
Starting namenodes on [localhost]
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-evassh-12039904.out
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-evassh-12039904.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-evassh-12039904.out
root@evassh-12039904:~# touch task.txt
root@evassh-12039904:~# vi task.txt
root@evassh-12039904:~# 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 头歌大数据入门实战 - 第2章 分布式文件系统hdfs 分布式文件系统HDFS是Apache Hadoop的核心组件之一,它是一个可扩展的、高可靠性的分布式文件系统,适用于大规模数据存储和处理。HDFS的设计目标是能够在廉价的硬件上运行,并且能够处理大量的数据。HDFS采用了主从架构,其中有一个NameNode负责管理文件系统的命名空间和客户端的访问,而多个DataNode负责存储实际的数据块。HDFS的数据块大小通常为128MB,这样可以减少寻道时间,提高数据读写效率。HDFS还提供了数据冗余机制,通过多个副本来保证数据的可靠性和高可用性。HDFS的应用场景非常广泛,包括数据仓库、日志分析、机器学习等领域。 ### 回答2: 分布式文件系统(hdfs)在大数据处理中扮演着非常重要的角色,本文将以“头歌大数据入门实战”的第二章为基础,分享一些本人的看法和学习体会。 首先,为什么需要分布式文件系统? 在大数据处理中,数据量很大,单机存储和处理是非常困难的,因此需要将数据存储到多个机器上,并且通过网络互相传递进行处理和计算,这就需要一种分布式文件系统来解决。分布式文件系统可以将数据分布到多个节点上,使得每个节点上处理的数据量相对较小,从而降低了单节点的存储和处理压力。 具体而言,hdfs是如何实现分布式文件系统的呢? hdfs的核心组成部分是namenode和datanode。namenode负责管理文件系统的命名空间和客户端访问数据的控制,datanode则负责实际存储数据和处理读写请求。其中,namenode具有高可靠性,因为它存储了整个文件系统的关键数据,如果出现故障,将会对整个文件系统造成影响。因此,为了保证namenode的高可用性,通常会使用hadoop的另外一个子系统,即hadoop HA(High Availability)。 此外,在hdfs中,还提供了数据块(block)的概念,每个数据块的大小默认为128MB。hdfs中的大文件会自动被分为多个数据块存储在不同的datanode上,这些数据块之间的复制也可以由hdfs自动完成。在hdfs中,副本的存储策略和副本数量可以由管理员进行配置,首次存储数据时,可以指定数据块的复制因子,副本在hdfs集群中具有很好的容错性,即使某个datanode发生故障,也可以从其他datanode上获取副本,从而保证了数据的可靠性和一致性。 最后,对于初学者而言,在学习hdfs的时候,需要先了解hdfs的基本组成和特性,再通过具体的实践和案例去深入学习和了解。在hdfs的使用过程中,需要注意一些具体的细节,例如文件的存储路径、权限设置、读写方式、数据复制等,都会对hdfs的性能和可靠性产生影响,需要认真细致地进行调试和优化。 总之,分布式文件系统在大数据处理中是非常重要的一环,hdfs作为其中的代表产品,具有很好的可扩展性、高可靠性和容错性,被广泛应用于大数据领域。学习hdfs需要注重基础知识的学习和实际练习的结合,全面深入地理解hdfs的原理和实现,从而能够更好地进行大数据处理和应用。 ### 回答3: 分布式文件系统HDFS是Apache Hadoop的核心组件之一,是一种适用于存储大量数据的分布式文件系统。该系统通过横向扩展,将大量的数据分散存储在多台计算机上,旨在提高数据的可靠性和可扩展性。 HDFS是由两个核心组件组成的:NameNode和DataNode。NameNode是HDFS的主节点,主要负责管理文件系统的命名空间和权限控制。它维护着整个文件系统的元数据信息,包括文件的名称、块的位置、副本数量等。DataNode是HDFS的数据节点,主要负责存储实际的数据块。在HDFS中,文件会被划分为一个个的块,并将每个块的多个副本分散存储在多台机器上,以确保数据的可靠性和高可用性。 HDFS还提供了一些重要的特性,例如数据的自动副本备份机制、故障转移系统、数据块的迁移和压缩等。这些特性可以帮助用户轻松地管理大规模的数据,从而降低存储和维护成本。 为了更好地理解HDFS的工作原理,用户需要学习Hadoop中的文件读写操作。针对文件的读操作主要分为两个阶段:第一阶段是客户端向NameNode查询文件的元数据信息,包括所有数据块的位置和大小;第二阶段是客户端根据元数据信息向对应的DataNode获取数据块,并将数据合并还原为一个完整的文件。文件的写操作大致分为三个步骤:首先,客户端向NameNode申请创建一个新的文件,并分配空间;其次,客户端向一个或多个DataNode写入数据;最后,客户端通知NameNode文件写入完成,NameNode更新文件系统中该文件的元数据信息。 总之,分布式文件系统HDFS大数据领域扮演着至关重要的角色,它能够协助用户轻松处理大规模的数据,降低存储和维护成本,提高数据的可靠性和可扩展性,具有重要的发展前景和应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值