python hadoop教程_大数据工具Hadoop快速入门4-HDFS读写教程

什么是HDFS?

管理跨网络的存储特定操作的文件系统称为分布式文件系统。

Hadoop分布式文件系统(HDFS:Hadoop Distributed File System)是基于Java的分布式文件系统。它是分布式,可扩展和可移植的文件系统,旨在跨越大型商用服务器集群。 HDFS的设计基于谷歌文件系统GFS(https://ai.google/research/pubs/pub51)。与许多其他分布式文件系统一样,HDFS拥有大量数据并提供对许多客户端的透明访问。

HDFS以可靠和可扩展的方式存储非常大的文件:PB(1PB=1024TB,,针对非常大的文件)、GB和MB。它使用块结构文件系统来完成的。单个文件被拆分为固定大小的块,存储在集群中的计算机上。由多个块组成的文件通常不会将所有块存储在一台机器。

HDFS通过复制块并在集群中分发副本来确保可靠性。默认复制因子为3,表示每个块在群集上存在三次。即使单机出现故障,块级复制也保证数据可用。

HDFS是一种分布式文件系统,用于存储在商用硬件集群上运行的非常大的数据文件。它具有容错性,可扩展性和扩展性,非常简单。 Hadoop捆绑了HDFS(Hadoop分布式文件系统)。

HDFS架构

HDFS集群主要由管理文件系统元数据的NameNode和存储实际数据的DataNode组成。

NameNode:NameNode可以视为系统的主节点。它维护文件系统树以及系统中存在的所有文件和目录的元数据。两个文件的“命名空间image”和“编辑日志”用于存储元数据信息。 Namenode了解包含给定文件的数据块的所有数据节点,但是,它不会持久存储块位置。系统启动时,每次从数据节点重建此信息。

DataNode:DataNode是驻留在集群中每台计算机上的从属服务器,提供实际存储。它负责为客户提供服务,读写请求。

HDFS中的读/写操作在块级操作。 HDFS中的数据文件被分成块大小的块,这些块作为独立单元存储。默认块大小为64 MB。

HDFS基于数据复制的概念运行,其中创建多个数据块副本并将其分布在整个集群中的节点上,以在节点发生故障时实现数据的高可用性。

HDFS中的文件小于单个块,不会占用块的完整存储空间。

大数据Hadoop工具python教程1-HDFS Hadoop分布式文件系统

HDFS的体系结构设计由两个进程组成:一个NameNode进程保存文件系统的元数据,一个或多个DataNode进程存储块。 NameNode和DataNode可以在一台机器上运行,但HDFS集群通常包含专机运行NameNode进程,可能还有数千台运行DataNode进程的计算机。

NameNode是HDFS中最重要的机器。它存储整个文件系统的元数据:文件名,文件权限以及每个文件对应块的位置。为了允许快速访问,NameNode将整个元数据结构存储在内存中。

NameNode还跟踪块的复制,确保机器故障不会导致数据丢失。由于NameNode存在单点故障,可以使用第2个NameNode生成主NameNode内存结构的快照,从而降低NameNode失败时数据丢失的风险。

在HDFS中存储块的机器称为DataNode。 DataNode通常是具有大存储容量的商用机器。与NameNode不同,少量DataNode失败,HDFS将继续正常运行。当DataNode失败时,NameNode将复制丢失的块,以保证最少复制数。

图片.png

HDFS读操作

数据读取请求由HDFS,NameNode和DataNode提供。

image.png

客户端通过调用FileSystem对象的 'open()' 方法来启动读取请求;它是DistributedFileSystem类型的对象。

此对象使用RPC连接到namenode,并获取元数据信息,例如文件块的位置。请注意,这些地址是文件的前几个块。

响应于该元数据请求,返回具有该块的副本的DataNode的地址。

一旦接收到DataNode的地址,就会将类型为FSDataInputStream的对象返回给客户端。 FSDataInputStream包含DFSInputStream,它负责与DataNode和NameNode的交互。在上图所示的步骤4中,客户端调用'read()' 方法,该方法使DFSInputStream与第一个DataNode建立与文件的第一个块的连接。

以流的形式读取数据,其中客户端重复调用'read()' 方法。 read()'操作的这个过程一直持续到块结束。

到达块的结尾后,DFSInputStream关闭连接并继续查找下一个块的下一个DataNode

一旦客户端完成了读取操作,它就会调用close()方法。

HDFS写操作

在本节中,我们将了解如何通过文件将数据写入HDFS。

image.png

客户端通过调用DistributedFileSystem对象的create()' 方法启动写操作,该方法创建一个新文件。

DistributedFileSystem对象使用RPC调用连接到NameNode并启动新文件创建。但是,此文件创建操作不会将任何块与文件关联。 NameNode负责验证文件是否已经存在,并且客户端具有创建新文件的正确权限。如果文件已存在或客户端没有足够的权限来创建新文件,则会向客户端抛出IOException。否则,操作成功,NameNode将创建该文件的新记录。

一旦在NameNode中创建了新记录,就会将类型为FSDataOutputStream的对象返回给客户端。客户端使用它将数据写入HDFS。调用数据写入方法。

F- SDataOutputStream包含DFSOutputStream对象,该对象负责与DataNodes和NameNode的通信。当客户端继续写入数据时,DFSOutputStream继续使用此数据创建数据包。这些数据包被排入队列,称为DataQueue。

还有一个名为DataStreamer的组件使用此DataQueue。 DataStreamer还要求NameNode分配新块,从而选择用于复制的理想DataNode。

现在,复制过程从使用DataNodes创建管道开始。在我们的例子中,我们选择了3的复制级别,因此管道中有3个DataNode。

DataStreamer将数据包注入管道中的第一个DataNode。

管道中的每个DataNode都存储由它接收的数据包,并将其转发到管道中的第二个DataNode。

另一个队列'Ack Queue'由DFSOutputStream维护,用于存储等待DataNode确认的数据包。

一旦从管道中的所有DataNode接收到对队列中的分组的确认,就将其从'Ack Queue'中移除。如果任何DataNode发生故障,来自此队列的数据包将用于重新启动操作。

在客户端完成写入数据之后,它调用close()方法,结果将剩余的数据包刷新到管道,然后等待确认。

收到最终确认后,将联系NameNode告诉它文件写入操作已完成。

参考资料

命令行交互

与HDFS交互主要使用hdfs的脚本

$ hdfs COMMAND [-option ]

通用文件操作

在HDFS上执行基本文件操作操作,使用dfs子命令。 dfs命令支持类似Linux shell中的许多文件操作。

$ hdfs COMMAND [-option ]

注意:hdfs命令以系统用户的权限运行。 以下示例用“hduser”的用户运行。

列出HDFS中目录的内容,请使用-ls命令:

$ hdfs dfs -mkdir /user

$ hdfs dfs -mkdir /user/hduser

$ hdfs dfs -ls /

Found 1 items

drwxr-xr-x - hduser_ supergroup 0 2019-01-21 16:37 /user

$ hdfs dfs -ls -R /user

drwxr-xr-x - hduser_ supergroup 0 2019-01-21 16:45 /user/hduser

put与get数据

$ hdfs dfs -put /home/hduser_/input.txt /user/hduser

$ hdfs dfs -cat /user/hduser/input.txt

https://china-testing.github.io/

$ hdfs dfs -get /user/hduser/input.txt /home/hduser_/test.txt

命令参考

$ hdfs dfs

Usage: hadoop fs [generic options]

[-appendToFile ... ]

[-cat [-ignoreCrc] ...]

[-checksum ...]

[-chgrp [-R] GROUP PATH...]

[-chmod [-R] PATH...]

[-chown [-R] [OWNER][:[GROUP]] PATH...]

[-copyFromLocal [-f] [-p] [-l] [-d] ... ]

[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] ... ]

[-count [-q] [-h] [-v] [-t []] [-u] [-x] ...]

[-cp [-f] [-p | -p[topax]] [-d] ... ]

[-createSnapshot []]

[-deleteSnapshot ]

[-df [-h] [ ...]]

[-du [-s] [-h] [-x] ...]

[-expunge]

[-find ... ...]

[-get [-f] [-p] [-ignoreCrc] [-crc] ... ]

[-getfacl [-R] ]

[-getfattr [-R] {-n name | -d} [-e en] ]

[-getmerge [-nl] [-skip-empty-file] ]

[-help [cmd ...]]

[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [ ...]]

[-mkdir [-p] ...]

[-moveFromLocal ... ]

[-moveToLocal ]

[-mv ... ]

[-put [-f] [-p] [-l] [-d] ... ]

[-renameSnapshot ]

[-rm [-f] [-r|-R] [-skipTrash] [-safely] ...]

[-rmdir [--ignore-fail-on-non-empty]

[-setfacl [-R] [{-b|-k} {-m|-x } ]|[--set ]]

[-setfattr {-n name [-v value] | -x name} ]

[-setrep [-R] [-w] ...]

[-stat [format] ...]

[-tail [-f] ]

[-test -[defsz] ]

[-text [-ignoreCrc] ...]

[-touchz ...]

[-truncate [-w] ...]

[-usage [cmd ...]]

Generic options supported are:

-conf specify an application configuration file

-D define a value for a given property

-fs specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.

-jt specify a ResourceManager

-files specify a comma-separated list of files to be copied to the map reduce cluster

-libjars specify a comma-separated list of jar files to be included in the classpath

-archives specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:

command [genericOptions] [commandOptions]

更多帮助可以 hdfs dfs -usage 或 hdfs dfs -help

更多命令示例

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

$HADOOP_HOME/bin/hdfs dfs -ls /

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

使用Python API访问HDFS

库简介

hdfs和PyArrow比较常用,这里以hdfs为例:

hdfs快速入门

from hdfs import InsecureClient

# 3.0+ 已经修改为9870

client = InsecureClient('http://localhost:50070', user='hduser_')

fs_folders_list = client.list("/")

print(fs_folders_list)

with client.read('/user/hduser/input.txt', encoding='utf-8') as reader:

for line in reader:

print(line)

执行结果:

['user']

https://china-testing.github.io/

其他参考

大数据Hadoop工具python教程

使用JAVA API访问HDFS

为了以编程方式与Hadoop的文件系统进行交互,Hadoop提供了多个JAVA类。org.apache.hadoop.fs的包中包含操作Hadoop文件系统中的类。这些操作包括打开,读取,写入和关闭。实际上,Hadoop的文件API是通用的,可以扩展为与HDFS以外的其他文件系统进行交互。

以编程方式从HDFS读取文件

Object java.net.URL用于读取文件的内容。首先,我们需要让Java识别Hadoop的hdfs URL方案。这是通过在URL对象上调用setURLStreamHandlerFactory方法并将FsUrlStreamHandlerFactory的实例传递给它来完成的。此方法每个JVM只需执行一次,因此它包含在静态块中。

public class URLCat {

static {

URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());

}

public static void main(String[] args) throws Exception {

InputStream in = null;

try {

in = new URL(args[0]).openStream();

IOUtils.copyBytes(in, System.out, 4096, false);

} finally {

IOUtils.closeStream(in);

}

}

}

此代码打开并读取文件的内容。 HDFS上此文件的路径作为命令行参数传递给程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值