Hadoop

Hadoop相关知识

基础知识

Hadoop是一个用Java编写的Apache开源框架,用来处理分布式大型数据集.

Hadoop架构

框架包括四个模块:
1.Hadoop Common:其他Hadoop模块所需的Java库和实用程序,这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的Java文件和脚本.
2.Hadoop YARN:用于作业调度和集群资源管理的框架.
3.HDFS:分布式文件系统.
4.Hadoop MapReduce:基于YARN处理大数据集的系统.

MapReduce

MapReduce是一个软件框架,用于轻松编写应用程序,以可靠,容错的方式在大型集群硬件上并行处理大量数据.
实际Hadoop程序执行两个不同任务:
1.The Map Task
2.The Reduce Task
输入输出都存储在文件系统中,改框架负责调度任务.

Hadoop分布式文件系统

Hadoop可以直接与任何安装的分布式文件系统一起工作,Hadoop使用的文件系统是HDFS.HDFS基于谷歌文件系统(GFS),并提供一个分布式文件系统,并提供了一个类似任何其他文件系统的shell,用命令与文件交互.

Hadoop工作流程

第一阶段:用户/应用程序可以通过指定以下项目来向Hadoop(hadoop作业客户端)提交作业以获取所需的进程:分布式文件系统中输入和输出文件的位置。java类以jar文件的形式包含map和reduce函数的实现。通过设置作业的不同参数来配置作业。
第二阶段:Hadoop作业客户端然后将作业(jar /可执行文件等)和配置提交给JobTracker,JobTracker然后承担将软件/配置分发给从属的责任,Hadoop作业客户端然后将作业(jar /可执行文件等)和配置提交给JobTracker,JobTracker然后承担将软件/配置分发给从属的责任。
第三阶段:不同节点上的TaskTracker根据MapReduce实现执行任务,reduce函数的输出存储在文件系统上的输出文件中。

Hadoop优势

快速编写和测试分布系统,高效;不依赖硬件提供容错和高可用性;服务器可以动态添加或从集群中删除,Hadoop继续运行而不中断。Hadoop是开源产品,基于Java,在所有平台上都兼容.

HDFS文件读写过程

文件读取剖析

(1)客户端通过调用FileSystem对象的open()来读取要打开的文件
(2)DistributedFileSystem通过RPC来调用namenode,以确定文件的开头部分的块位置对于每一块,namenode返回具有该块副本的datanode地址。此外,这些datanode根据他们与client的距离来排序(根据网络集群的拓扑)。
(3)接着client对这个输入流调用read()。存储着文件开头部分的块的数据节点的地址DFSInputStream随即与这些块最近的datanode相连接。
(4)通过在数据流中反复调用read(),数据会从datanode返回client。
(5)到达块的末端时,DFSInputStream会关闭与datanode间的联系,然后为下一个块找到最佳的datanode。client端只需要读取一个连续的流,这些对于client来说都是透明的。

文件写入剖析

⑴客户端通过在DistributedFileSystem中调用create()来创建文件。
⑵DistributedFileSystem 使用RPC去调用namenode,在文件系统的命名空间创一个新的文件,没有块与之相联系。namenode执行各种不同的检查以确保这个文件不会已经存在,并且在client有可以创建文件的适当的许可。分布式文件系统返回一个文件系统数据输出流,让client开始写入数据。就像读取事件一样,文件系统数据输出流控制一个DFSOutputStream,负责处理datanode和namenode之间的通信。
⑶在client写入数据时,DFSOutputStream将它分成一个个的包,写入内部的队列,成为数据队列。数据队列随数据流流动,数据流的责任是根据适合的datanode的列表要求这些节点为副本分配新的块。这个数据节点的列表形成一个管线————假设副本数是3,所以有3个节点在管线中。
⑷数据流将包分流给管线中第一个的datanode,这个节点会存储包并且发送给管线中的第二个datanode。同样地,第二个datanode存储包并且传给管线中的第三个数据节点。
⑸DFSOutputStream也有一个内部的包队列来等待datanode收到确认,成为确认队列。一个包只有在被管线中所有的节点确认后才会被移除出确认队列。
⑹client完成数据的写入后,就会在流中调用close()。
⑺在向namenode节点发送完消息之前,此方法会将余下的所有包放入datanode管线并等待确认。namenode节点已经知道文件由哪些块组成(通过Data streamer 询问块分配),所以它只需在返回成功前等待块进行最小量的复制。

API操作HDFS

使用HDFS的JAVA API操作HDFS的文件系统,首先要获取用于操作文件系统的实例,而文件系统的又是与当前的系统的环境变量息息相关。对于操作HDFS来说,环境配置主要是core-site.xml中的相关配置。

获取文件系统访问实例

①Configuration conf = new Configuration(); //获取当前的默认环境配置

②FileSystem fs = FileSystem.get(conf); //根据当前环境配置,获取文件系统访问实例

Configuration还用提供了用于增加/修改当前环境配置的相关方法,如addResource(Path file)可以增加xml格式的配置,set(String name,String value)以键值对的形式新增/修改配置项。

获取文件系统访问实例方法有:

①public static FileSystem get(Configuration conf) throws IOException;

②public static FileSystem get(URI uri,Configuration conf) throws IOException;

第一个方法是使用默认的URI地址(core-site.xml中配置)获取当前环境变量来加载文件系统,第二个方法则传入指定的URI路径来获取实例。

向HDFS中写入数据

①public FSDataOutputStream create(Path f) throws IOException;

②public FSDataOutputStream append(Path f) throws IOException;

③public void write(byte b[]) throws IOException;

④public final void writeBytes(String s) throws IOException

⑤public final void writeUTF(String str) throws IOException

首先要根据当前的环境,获取写出数据了对象,create方法根据路径创建数据流对象,如果path目录的文件已经存在,则会覆盖原文件的内容。append方法则在原路径的文件上追加写入。都返回了FSDataOutputStream对象,其继承至DataOutputStream,提供了标准I/O的操作。FSDataOutputStream提供了很多写出数据流的方法如重载的write,writeBytes,writeUTF等。flush提供了一种将缓冲区的数据强制刷新到文件系统的方法。此外,write()提供了一种带有回调方法的参数,回去在每次写出缓存时,提供进度。

读取HDFS文件系统的数据

①public FSDataInputStream open(Path f) throws IOException;

②public final int read(byte b[], int off, int len) throws IOException;

③public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable, ByteBufferReadable, HasFileDescriptor, CanSetDropBehind, CanSetReadahead, HasEnhancedByteBufferAccess, CanUnbuffer ;

open()方法根据传进来的path路径,获取环境变量,并设置读取的缓冲区大小(默认为4096),然后返回FSDataInputStream实例,FSDataInputStream继承至DataInputStream,并实现了Seekable等接口。DataInputStream继承至标准I/O类,Seekable接口实现对数据的重定位,PositionedReadable接口实现从指定偏移量处读取文件。

read()方法从指定off位置读取len长度的字节存入byte数组。如果到达文件尾则返回-1,否则返回读取的实际长度。

文件/目录操作

①public boolean mkdirs(Path f) throws IOException;

提供递归的创建path目录功能,mkdirs还有带权限的重载版本

②public abstract boolean delete(Path paramPath, boolean paramBoolean) throws IOException;

如果paramBoolean为false,则不能递归的删除子目录,如果此时目录非空,将抛出异常Directory is not empty

③public abstract FileStatus[] listStatus(Path paramPath) throws FileNotFoundException, IOException;

④private void listStatus(ArrayList results, Path f, PathFilter filter) throws FileNotFoundException, IOException;

listStatus方法可以列出指定目录下的文件或者文件夹(不能递归列出),具有PathFilter过滤的重载版本

FileStatus对象描述了文件的各种属性,诸如文件是否是文件夹,文件的权限,所有者等,isDirectory(),getLen(),getPath()…

⑤copyFromLocalFile(src, dst); //从本地拷贝文件到HDFS

⑥copyToLocalFile(src, dst); //从HDFS直接拷贝文件到本地

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Hadoop相关知识
    1. 1.1. 基础知识
      1. 1.1.1. Hadoop架构
      2. 1.1.2. MapReduce
      3. 1.1.3. Hadoop分布式文件系统
      4. 1.1.4. Hadoop工作流程
      5. 1.1.5. Hadoop优势
  2. 2. HDFS文件读写过程
    1. 2.0.1. 文件读取剖析
    2. 2.0.2. 文件写入剖析
  • 3. API操作HDFS
    1. 3.0.1. 获取文件系统访问实例
    2. 3.0.2. 向HDFS中写入数据
    3. 3.0.3. 读取HDFS文件系统的数据
    4. 3.0.4. 文件/目录操作
  • 本站总访问量: , 本页阅读量: