Hadoop详解

1、前言

对于初次接触Hadoop的小伙伴来说,Hadoop是一个很陌生的东西,尤其是Hadoop与大数据之间的关联,写这篇文章之前,我也有许多关于Hadoop与大数据的疑惑,接下来让我带着和大家共同的疑惑去探索Hadoop。以下仅为我个人的理解和资料查找,仅供参考,结果存在差异性


 

2、Hadoop介绍

  • 第一问:我们为什么要学习Hadoop,网上说Hadoop的作用是能够处理海量数据,那我们为什么不能直接用数据库+大量磁盘呢,或者其他工具?

    • 首先考虑的是成本问题,数据库庞大的体量随着用户的增多往往伴随着维护成本和硬件的要求导致的成本的增加。而Hadoop实施成本较低,它可以使用普通的商用硬件并根据需求伸缩,因为是通过在可用的计算机集群之间分配数据并完成计算任务,所以它可以随着用户增长拓展服务结点,扩大集群,而且是开源的,使用者不需要支付任何使用费用,而Hadoop后面有着一个持续增加的社区团队,该团队会经常对Hadoop进行维护和增强,好家伙,直接白嫖。

    • 其次技术上的限制,其他工具不太了解,这里就传统数据库来说,传统数据库只能操作结构化的数据,而MapReduce可以轻松处理大量(批处理能力强)结构化半结构化非结构化的数据,灵活。Hadoop拥有强大的计算能力,因此非常适合用于计算密集型的分析需求。Hadoop具有很高的运算速度,可以很容易地处理复杂的计算逻辑。

    • 此外Hadoop除了以上低成本高扩展性之外,还有天生的

      • 云化属性:在云服务中可以简单的部署完整的Hadoop。

      • 高可靠性:数据存储有多个备份,集群设置在不同的机器上,可以防止一个结点宕机造成集群损坏,如果数据请求失败,Hadoop会自动重新部署计算任务,Hadoop框架中有备份机制和检验模式,Hadoop会对问题的部分镜像修复,也可以通过设置快照的方式在集群出现问题时回到之前的一个时间点。

      • 高效性:Hadoop能够在节点之间动态地移动数据,在数据所在的节点进行并发处理。

      • 高容错性:因为Hadoop的分布式文件HDFS在存储文件时会在多个节点或多台机器上存储文件的备份副本,当读取文档出错或者某台机子宕机了,系统会调用其他节点的备份文件保证程序的顺利进行,如果启动的任务失败,Hadoop会重新运行该任务或启用其他任务来完成这个任务没有完成的部分。

      • Hadoop基本框架是用Java语言编写的:Hadoop带有用Java语言编写的框架,因此在Linux生产平台上是非常理想的,Hadoop上的应用程序也可以使用其他语言编写,如c++。

  • 第二问:什么是传统数据库,跟Hadoop的区别是什么,与大数据有什么关系?

    • 存储:传统数据库是按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。我们通常使用DBMS对数据进行管理操作。

    • 价值:传统数据库中的数据是对基本信息的存储,单条数据价值高,而Hadoop中的数据中单个数据价值低,大数据通过Hadoop海量分析处理数据产生价值。

    • 来源:传统数据库一般都是真人输入记录,而Hadoop系统的数据是通过用户终端系统录入上报,部分数据也来自于数据库。

    • 数据存储:传统数据可以更改,而Hadoop如同快照一样,是对过往数据按时间存储,文件一旦写入只能增加,不能更改,一次录入多次读取。 目的是未来保证数据的一致性。

  • 第三问:结构化和半结构化和非结构化数据和无格式数据分别是什么?

    • 结构化数据,是指由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式(int/varchar/datatime/decimal/…)与长度规范(varchar(50),varchar(20)).即关系数据库中的表。这里的20是指20字节varchar(20)的意思是只能存放20个字节长度的数据,不同编码方式的文字占的字节也不相同,如:

      • ASCI码:一个汉字2个字节,一个英文字母(不区分大小写)占一个字节。

      • UTF-8码:一个汉字(含繁体)等于三个字节,一个英文字母等于一个字节;中文标点符号占三个字节,英文标点占一个字节。

      • Unicode码:一个英文两个字节,一个中文(含繁体)等于两个字节。中文标点符号与英文符号占两个字节。

        • 等于与占的区别:

此外,int(5)却不代表数据长度,int类型的数据有他固定的长度,不同编译器里的占用字节长度不同,对应的数据不同,微型机中,int占用2字节,16位,数据范围为-32768~32767[-2^15~2^15-1]在32位系统中int的长度为-2147483648~2147483647[-2^31~2^31-1],每个int数据占4个字节。在开启zerofill(填充零)情况下,若int(5)存储的数字长度是小于5的则会在不足5位数的前面补充0,但是如果int(5)中存储的数字长度大于5位的话,则按照实际存储的显示(数据大小在int类型的4个字节范围内即可)。此外同学们如果有兴趣的话还可自己探索其他的数据类型,与int相似的还有double、char等。

- 扩展资料:int是一个向CPU发送中断的指令。格式为INT vec。vec为中断向量号,其值为0~255。CPU根据这个向量号去调用内核对应的中断例程。指令操作为:(这里我没动,有兴趣的小伙伴可以自己去拓展)
$$
(SP)←(SP)-2,((SP)+1:(SP))←(FR)
 
(IF)←0,(TF)←0
 
(SP)←(SP)-2,((SP)+1:(SP))←(CS)
 
(SP)←(SP)-2,((SP)+1:(SP))←(IP)
 
(CS)←(vec*4+2),(IP)←(vec*4)
$$
    •   半结构化数据,非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档JSON文档、Email等。

      •   XML文档:

        •   可扩展标记语言(XML)与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML的宗旨传输数据的,而与其同属标准通用标记语言的HTML主要用于显示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。

        •   与HTML的联系:同HTML一样, 可扩展标记语言是标准通用标记语言的一个 [1] 子集,它是描述网络上的数据内容和结构的标准。尽管如此,XML不像HTML,HTML仅仅提供了在页面上显示信息的通用方法(没有上下文相关和动态功能) ,XML则对数据赋予上下文相关功能,它继承了标准通用标记语言的大部分功能,却使用了不太复杂的技术。

        •   格式:起始标签<Unicode字符>,结束标签<Unicode字符/>,在标签内还有可使用的属性,而且与HTML不同的是XML必须为双标签。(这里需要一点基础,等我学了再详细解答)

        •   例:

      •     JSON文档:

        •   全称 JavaScript Object Notation,一种键值对格式文件,有两种表示结构(对象和数组)。

          1、 并列的数据之间用逗号(”, “)分隔。2、 映射用冒号(”: “)表示。3、 并列数据的集合(数组)用方括号(“[]“)表示。4、 映射的集合(对象)用大括号(”{}”)表示。

        • JSON对象(object):

          {"城市":"北京","面积":16800,"人口":1600}

           

        • JSON数组(array):

          [
            {"城市":"北京","面积":16800,"人口":1600},
            {"城市":"上海","面积":6400,"人口":1800}
          ]

          语言总是苍白无力,接下来我用代码给大家展示一下,这是我后台使用axios请求时控制台打印的返回数据。data是它带回来的数据,其他的是它本身自带的。我们很明显可以看到JSON数组是由由多个对象集合组成,用中括号包裹起来,使用逗号(,)隔开的一串数据。JSON对象则是单个对象。

           

           

          这里有一个小细节,大家发现没有Object下是没有length方法的,而data数组中是有length方法,所以数组与对象还有一个区别就是,对象只能通过for in遍历,而数组是可以通过索引遍历,数组是有序的,对象是无序的。

           

          这里可能有小伙伴又疑惑了,在我们平时的学习中,我们定义一个数组都是:

          var a=[1,2,3]

          为什么这里的数组出现了对象,这就是JSON数据的巧妙之处了。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。(哈哈哈,直接cv的官方定义)

          问:数据交换语言为什么可以通用?。

        • 拓展:

          有的小伙伴可能还了解过对象的另外一种表现形式:关联数组(associative array)。关联数组是对象还是数组?,为什么它有对象的特性又称为数组,百度:在JavaScript中,关联数组就是对象,对象也就是关联数组。但是在不同语言,如PHP中,关联数组是数组。

          • js中关联数组的写法:

            //对象的写法
            var a={“城市”:”北京”,”面积”:16800,”人口”:1600};
            //关联数组的写法:
            var a["城市"]=”北京”;
            var b["面积"]=16800;
            var c["人口"]=1600;

             

      • JSON格式验证网站,通常我们像快速判断一串字符串是不是json数据,把数据复制粘贴到该网页指定页面即可。

      •   Email:邮箱。

    •   非结构化数据:没有固定模式的数据,如word文档、PDF、PPT、EXL(Excel)、各种格式的图片、视频等。

  • 第四问:什么是集群,分布式,集群跟分布式有什么关联?

    • 集群:顾名思义,由多个个体组成的整体。在大数据中,集群是一组相互独立、通过高速计算机网络互联的计算机,集群中的个体计算机通常被称为节点,通常通过局域网连接(此外也有其他的连接方式)。并以单一系统的模式加以管理,在Hadoop中,管理这个系统的是YARN。集群的好处我觉得可以用中国一句俗语比喻:“三个臭皮匠和一个诸葛亮”。

      • 计算机网络:这个有点复杂…嗯…这里就先使用一下官方定义:

        利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。不过在大数据中,计算机网络的定义下面这个更贴切:

        计算机网络就是由大量独立的、但相互连接起来的计算机来共同完成计算机任务。这些系统称为计算机网络(computer networks)。

      • 局域网:某个区域内相互联成的计算机组,如一个机房里的计算机组,一个网吧里的计算机组,一个公司里的计算机组(计算机组是俩个也可以上千个),局域网是一种私有网络,覆盖范围一般是方圆几千米内。一个完整的局域网由计算机设备(服务器、工作站)、网络连接设备(网卡、集线器、交换机)、网络传输介质(网线,常见的水晶头(同轴电缆、双绞线、光缆))。我们使用的WiFi就是一种无线局域网。无线网可以用来传输音频、视频、文字。WiFi本身是不要钱的。我们平时所交的WiFi费用一部分是用来维护设备和支付一定的专利费。

      • 如何自己搭建一个局域网,狗头,这些有兴趣的小伙伴可以自己探索。

      • 服务器:比普通计算机性能更优的特殊计算机。

    • 分布式:Hadoop就是一个很典型的分布式系统。

      • 分布性:分布式系统由多台计算机组成,地域上允许分开,整个系统的功能是分散在各个节点上实现的。

      • 自治性:整个分布式系统中的各个节点都包含自己的处理机和内存,各自拥有独立的处理数据的功能。

      • 并行性:一个大的任务可以划分为若干个子任务,分别在不同的主机上执行。

      • 全局性:分布式系统中必须存在一个单一的、全局的进程通信机制,使得任何一个进程都能与其他进程通信,并且不区分本地通信与远程通信。同时,还应当有全局的保护机制。系统中所有机器上有统一的系统调用集合,它们必须适应分布式的环境。在所有CPU上运行同样的内核,使协调工作更加容易。(这段直接百度,我也还不太理解)

    • 关联:在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。分布式系统和计算机网络系统的共同点是:多数分布式系统是建立在计算机网络之上的,所以分布式系统与计算机网络在物理结构上是基本相同的。分布式操作系统的设计思想和网络操作系统是不同的,这决定了他们在结构、工作方式和功能上也不同。网络操作系统要求网络用户在使用网络资源时首先必须了解网络资源,网络用户必须知道网络中各个计算机的功能与配置、软件资源、网络文件结构等情况,在网络中如果用户要读一个共享文件时,用户必须知道这个文件放在哪一台计算机的哪一个目录下;分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。(摘自百度百科分布式系统:建立在网络之上的软件系统

  • 第五问:什么是并发处理(计算)(Concurrent computing),Hadoop的并发处理是什么样子?

    • 并发是将一个计算任务,分区成几个小的部分同时被计算,之后再汇整计算结果。并发运算是一种程序运算的特性,可以被视为是对并行运算的进一步抽象,它包涵了时间片这种可以被用来实现虚拟并行运算(pseudoparallelism)的技术,因此在实际的物理运作中,计算过程可能是并行,或非并行的。(时间管理大师)。实现并发程序有许多方式,依编程语言操作系统的支持,可以用进程,或是线程来实现。它可以运行在单一处理器上,将不同的运行步骤分散在不同时间片中运行,以非并行方式循序运算;它也可以用并行计算来实现,将每个进程指定给处理器组中的某个处理器,以单片机多处理器平台,或是透过网络链接的分散平台来实做。

      • 并行计算:当并发计算的程序,在机器平台上同时被运行的状况,因此,并行计算是一种机器运算的形式之一。分布式计算(Distributed computing)则是并行计算的一个特例,它采用计算机网络来进行同步。

      • 时间片:百度链接我觉得讲得很详细,这里就不做过多赘述。

      • 关于其他的概念,这里都附有链接。这里就不做过多赘述。

  • 第六问:什么是宕机,Hadoop宕机是什么情况,什么原因?,怎么解决?

  • 第七问:什么是云服务,云服务能干什么?

  • 第八问:上面说的MapReduce和HDFS,还有YARN是什么,跟Hadoop又有什么关系,除此之外Hadoop还有哪些组件共同支持Hadoop的运作?

    • HDFS:Hadoop的核心,HDFS是一个主从(Master/Slave)分布式文件系统。主要负责集群数据的存储与读取。HDFS系统主要包括:

      • Name Node(一个)(Master):存储元数据以及处理客户端发起的请求。在Name Node中存放元信息的文件是fsimage文件。系统允运行期间,对所有的元数据的操作被保存到内存中,并被持久化(持久化存储就是把运行时产生的数据保存为文件,且在系统关闭后依旧存在)到另外一个文件edits中。当Name Node启动时,fsimage会被加载到内存,然后对内存里的数据执行edits所记录的操作。以确保内存所保留的数据处于最新的状态(有点像继承)。

      • Seconday NameNode(一个)(Slave):用于备份Name Node的数据,周期性将edits文件合并到fsimage文件并在本地备份。将新的fsimage存到Name Node覆盖其原来的fsimage文件。再删除自身的edits文件 ,重新创建一个edits文件继续存储文件修改状态。

      • DataNode(多个)(Slave):真正存储数据的地方,当文件上传到HDFS时,会被分割为128mb(Hadoop2x)的数据块然后存储到不同或者同一个Data Node中,并且对其备份(怎么备份,备份到哪里?)。

    • MapReduce: 分布式计算框架

    • YARN:集群资源管理器,基本组成结构(Master/Slave)。

      • Resource Manage(RM)(Scheduler(调度器),Application Manage(应用程序管理器))(Master):负责对各个NodeManage上的资源进行统一调度管理。

      • Node Manager(NM)(Slave):每个节点的资源和任务管理器,一方面向RM汇报该节点的资源情况和各个Container(YARN中的资源抽象,封装了某个节点的多维度资源,如内存、CPU、磁盘、网络YARN会为每一个任务分配一个Container,且只能使用该Container的资源,又有点像C#中类的继承,不知道如果想用其他的资源有没有接口)的运行状态。另一方面,接收ApplicationMaster的Container启动停止等各种请求。

      • ApplicationMaster(AM):在用户提交每个应用程序时,系统都会生成一个ApplicationMaster并包含到提交的应用程序中。主要功能是:

        • 与ResouceMaster调度器协商以获取资源(用Container表示)。

        • 将得到的任务进一步分给内部的任务???怎么分?。

        • 与NodeManager通信以启动停止任务。

        • 监控任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。(为什么需要间断性申请资源呢,因为为了资源的利用率更高,这里关于线程的问题,通常一台电脑只有一个cpu,而一个cpu只能执行一个线程,而为什么我们平时可以看似同时执行多个线程呢?这里上面关于时间片的地方已经说过,可以再看看上面的)。

      • Client Application:客户端应用程序。客户端将应用程序提交到RM,首先会创建一个Application上下文件对象,并设置AM必需的资源请求信息,然后提交到RM。

    • 除此之外,一个完整的Hadoop系统还需要用到许多组件工具。

      • HBase:是一个针对非结构化数据的可伸缩、高性能、分布式和面向列的动态模式数据库。

      • Hive:是建立在Hadoop上的数据仓库基础架构。它提供了一系列的工具,可存储、查询和分析存储在Hadoop中的大规模数据。Hive定义了一种类SQL语言HQL,通过简单的HQL语言将数据操作转换为复杂的MapReduce。能够帮工作人员大大减少Map Reduce的学习成本。但是Hive只有在结构化的数据中才能大显神通。Hive处理具有延迟性。最佳使用场所是大数据集的批处理作业,例如网络日志的分析。

      • Pig:基于Hadoop的大规模数据分析框架。

      • Sqoop:用于Hive与传统数据库(MySql等)进行数据传递。

      • Flume:一个由Cloudea提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统。同时能对数据进行简单处理,并写到各种数据接收方(可定制)拓展·:Log4。

      • Oozie:当我们需要调用多个任务时,可通过Oozie串联任务,通过Oozie调动整个任务进程,而不用麻烦地一个一个去启动任务。通过xml的形式写调度流程,可以调度MapReduce、Pig、Hive、Shell、JAR任务等。

      • ZooKeeper:可解决分布式环境下数据管理问题:统一命名、状态同步、集群管理、配置同步等。

      • Mahout:主要目标是创建一些可扩展的机器学习领域经典算法。

  • 第九问:上面关于Hadoop的几个特性在代码层都是怎么实现的,原理是什么?

    • 这个问题本人暂时无法解答。

  • 第十问:Hadoop的应用场景。

    • 在线旅游

    • 移动数据

    • 电子商务

    • 能源开采

    • 图像处理

    • 诈骗检测

    • IT安全

    • 医疗保健

    • 搜索引擎

    • 社交平台


版权声明:本文为元名原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yuanmingx/p/16213239.html