大数据开发工程师Hadoop(HDFS是如何保证数据可靠性的?)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据开发工程师Hadoop(HDFS是如何保证数据可靠性的?)相关的知识,希望对你有一定的参考价值。

参考技术A

HDFS是如何保证数据可靠性的?

(1)安全模式

① HDFS刚启动时,NameNode进入安全模式,处于安全模式的NameNode不能做任何的文件操作,甚至内部的副本创建也是不允许的,NameNode这时需要和各个DataNode进行通信,获得DataNode存储的数据块信息,并对数据块信息进行检查,只有通过了NameNode的检查,一个数据块才被认为是安全的。当认为安全的数据块所占比例达到了某个阈值,NameNode才会开始启动;

(2)SecondaryNamenode备份机制

① 在Hadoop中使用SecondaryNameNode来备份NameNode的元数据,以防止在NameNode宕机的时候,能从SecondaryNameNode中恢复出NameNode上的元数据;

② NameNode中保存了整个文件系统的元数据,而SecondaryNameNode的作用就是周期性保存NameNode的元数据。元数据中包括FSImage镜像文件数据和EditLog编辑日志。FSImage相当于HDFS的检查点,NameNode启动时候会读取FSImage的内容到内存,并将其与EditLog日志中的所有修改信息合并生成新的FSImage。在NameNode运行过程中,所有关于HDFS的修改都将写入EditLog日志文件中。这样,如果NameNode宕机,可以通过SecondaryNameNode中保存的FSImage和EditLog数据恢复出NameNode最近的状态,尽量减少数据的损失;

(3)心跳机制和副本重新创建

① 为了保证NameNode和各个DataNode的联系,HDFS采用了心跳机制。NameNode周期性的向各个DataNode发送心跳包,而收到心跳包的DataNode要进行回复。因为心跳包是定时发送的,所以NameNode就把要执行的命令也通过心跳包发送给DataNode,而DataNode收到心跳包,一方面要回复NameNode,另一方面就要开始应用数据的传输;

② 如果检测到DataNode失效,NameNode之前保存在这个DataNode上的数据就变成不可用数据。如果有的副本存储在失效的DataNode上,那么需要重新创建这个副本,放到另外可用的地方去;

(4)数据一致性

① 一般来讲,DataNode与应用交互的大部分情况都是通过网络进行的,而网络数据传输带来的一大问题就是数据是否原样到达。为了保证数据的一致性,HDFS采用了数据校验和(checkSum)机制。创建文件时,HDFS会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间中。传输数据时会将数据与校验和数据一起传输,应用收到数据后可以进行校验,如果两个校验的结果不同,则文件出错了,这个数据块就变成无效的。如果判定为无效,则需要从其他DataNode上读取副本数据;


(每日1小题,进步1点点)

大数据-09-Intellij idea 开发java程序操作HDFS

主要摘自 http://dblab.xmu.edu.cn/blog/290-2/

简介

本指南介绍Hadoop分布式文件系统HDFS,并详细指引读者对HDFS文件系统的操作实践。Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop核心组件之一,如果已经安装了Hadoop,其中就已经包含了HDFS组件,不需要另外安装。

利用Java API与HDFS进行交互

Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。
利用Java API进行交互,需要利用软件Eclipse编写Java程序。

(一) 在Ubuntu中安装Intellij idea

直接在官网下载试用版本ideaIU-2018.1.1.tar.gz

(二)在idea创建项目

点击创建新项目

选择java项目, 如果在SDK未显示1.8, 请点南new按键添加相应SDK,默认位置为/usr/lib/jvm/java-8-openjdk-amd64

在“Project name”后面输入工程名称“HDFSExample”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/HDFSExample”目录下然后,点击界面底部的“Next>”按钮,进入下一步的完成设置。

(三)为项目添加需要用到的JAR包

在File>Project Struecture 中添加引用JAR包

需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFS的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中按钮,

为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。
比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar添加到当前的Java工程中。

(四)编写Java应用程序代码

输入新建的Java类文件的名称,这里采用名称“HDFSFileIfExist”,其他都可以采用默认设置,然后,点击界面右下角“OK”按钮,

创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
    public static void main(String[] args){
        try{
            String fileName = "test";
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://192.168.3.236:9000");  // 这里根据自己实际情况调整
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            if(fs.exists(new Path(fileName))){
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
 
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

(五)编译运行程序

在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:

cd /usr/local/hadoop
./sbin/start-dfs.sh

在Project窗口中,选中HDFSFileIfExist类,右键选择run,即可看到结果。 上java代码中,我们设置的判断HDFS中是否含有test名字的文件,可以根据实际情况作调整。

(六)应用程序的部署

下面介绍如何把Java应用程序生成JAR包,部署到Hadoop平台上运行。首先,在Hadoop安装目录下新建一个名称为myapp的目录,用来存放我们自己编写的Hadoop应用程序,可以在Linux的终端中执行如下命令:

cd /usr/local/hadoop
mkdir myapp

然后,请在Idea工作界面左侧的File > Project Structure,出现如下面示后,再作相应选择:

然后选择要导出的类

然后选删除其它依赖类,只留下自己的代码即可


选择菜单栏的Build,选择Build Artifacts。
然后测试程序

cp out/artifacts/HDFSExample_jar/HDFSExample.jar  /usr/local/hadoop/
 ./bin/hadoop jar HDFSExample.jar

我这里输出结果是

文件不存在

如果在上面导出设置时,不删除依赖类,则用下面的方法也可以运行:

java -jar ./HDFSExample.jar

得到一样的结果。

以上是关于大数据开发工程师Hadoop(HDFS是如何保证数据可靠性的?)的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop(11)——HDFS如何保证数据安全

如何根据数据冷热程度分层存储,让HDFS更高效?

大数据开发工程师面试《一》Shopee虾皮技术面

大数据生态技术体系都有哪些?

大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合

浅谈大数据HDFS架构演变的来世今生