热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的架构梦:(五十九)ApacheHadoop架构与原理

ApacheHadoop架构与原理一、Hadoop的重要组成二、HDFS分布式文件系统三、MapReduce编程框架四、YARN资源调度一、Hadoop的重要组成HadoopHD


Apache Hadoop 架构与原理

    • 一、Hadoop的重要组成
    • 二、HDFS分布式文件系统
    • 三、MapReduce编程框架
    • 四、YARN资源调度


一、Hadoop的重要组成

Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算框架)+Yarn(资源协调框架)+Common模块

1、Hadoop HDFS:(Hadoop Distribute File System )一个高可靠、高吞吐量的分布式文件系统

比如:100T数据存储,“分而治之”

分:拆分–》数据切割,100T数据拆分为10G一个数据块由一个电脑节点存储这个数据块。

数据切割制作副本分散储存

在这里插入图片描述
图中涉及到几个角色

NameNode(nn): 存储文件的元数据,比如文件名、文件目录结构、文件属性(生成时间、副
本数、文件权限),以及每个文件的块列表和块所在的DataNode等。

SecondaryNameNode(2nn): 辅助NameNode更好的工作,用来监控HDFS状态的辅助后台
程序,每隔一段时间获取HDFS元数据快照。

DataNode(dn): 在本地文件系统存储文件块数据,以及块数据的校验。

注意:NN,2NN,DN这些既是角色名称,进程名称,代指电脑节点名称!!!

2、Hadoop MapReduce:一个分布式的离线并行计算框架

拆解任务分散处理汇整结果

MapReduce计算 = Map阶段 + Reduce阶段

Map阶段就是“”的阶段,并行处理输入数据;

Reduce阶段就是“”的阶段,对Map阶段结果进行汇总;

在这里插入图片描述

3、Hadoop YARN:作业调度与集群资源管理的框架

计算资源协调

在这里插入图片描述

Yarn中有如下几个主要角色,同样,既是角色名、也是进程名,也指代所在计算机节点名称。

ResourceManager(rm): 处理客户端请求、启动/监控ApplicationMaster、监控
NodeManager、资源分配与调度。

NodeManager(nm): 单个节点上的资源管理、处理来自ResourceManager的命令、处理来自
ApplicationMaster的命令。

ApplicationMaster(am): 数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。

Container: 对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。

ResourceManager是老大,NodeManager是小弟,ApplicationMaster是计算任务专员。

在这里插入图片描述

4、Hadoop Common:支持其他模块的工具模块(Configuration、RPC、序列化机制、日志操作)


二、HDFS分布式文件系统

1、HDFS 简介

HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组成,是分布式存储服务。

分布式文件系统横跨多台计算机,在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。

HDFS是分布式文件系统中的一种。

2、HDFS的重要概念

HDFS 通过统一的命名空间目录树来定位文件; 另外,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色(分布式本质是拆分,各司其职)。

2.1 典型的 Master/Slave 架构


  • HDFS 的架构是典型的 Master/Slave 结构。
  • HDFS集群往往是一个NameNode(HA架构会有两个NameNode,联邦机制)+多个DataNode组成;
  • NameNode是集群的主节点,DataNode是集群的从节点。

2.2 分块存储(block机制)


  • HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定;
  • Hadoop2.x版本中默认的block大小是128M;

2.3 命名空间(NameSpace)


  • HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动 或重命名文件。

  • Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。

  • HDFS提供给客户单一个抽象目录树,访问形式:hdfs://namenode的hostname:port/test/inputhdfs://linux121:9000/test/input

2.4 NameNode元数据管理


  • 我们把目录结构及文件分块位置信息叫做元数据。

  • NameNode的元数据记录每一个文件所对应的block信息(block的id,以及所在的DataNode节点的信息)

2.5 DataNode数据存储


  • 文件的各个 block 的具体存储管理由 DataNode 节点承担。

  • 一个block会有多个DataNode来存储,DataNode会定时向NameNode来汇报自己持有的block信息。

2.6 副本机制


  • 为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。 副本数量默认是3个。

2.7 一次写入,多次读出


  • HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的随机修改。 (支持追加写入, 不只支持随机更新)

  • 正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用(修改不方便,延迟大,网络开销大,成本太高)

3、HDFS 架构

在这里插入图片描述

3.1 NameNode(nn): Hdfs集群的管理者,Master


  • 维护管理Hdfs的名称空间(NameSpace)
  • 维护副本策略
  • 记录文件块(Block)的映射信息
  • 负责处理客户端读写请求

3.2 DataNode:NameNode下达命令,DataNode执行实际操作,Slave节点。


  • 保存实际的数据块
  • 负责数据块的读写

3.3 Client:客户端


  • 上传文件到HDFS的时候,Client负责将文件切分成Block,然后进行上传
  • 请求NameNode交互,获取文件的位置信息
  • 读取或写入文件,与DataNode交互
  • Client可以使用一些命令来管理HDFS或者访问HDFS

在这里插入图片描述

4、HDFS读写解析

4.1 HDFS读数据流程

在这里插入图片描述


  • 客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据, 找到文件块所在的DataNode地址。
  • 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  • DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  • 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

4.2 HDFS写数据流程

在这里插入图片描述


  • 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
  • NameNode返回是否可以上传。
  • 客户端请求第一个 Block上传到哪几个DataNode服务器上。
  • NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
  • 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
  • dn1、dn2、dn3逐级应答客户端。
  • 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个确认队列等待确认。
  • 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

4.3 验证Packet代码

@Test
public void testUploadPacket() throws IOException {// 1.准备读取本地文件的输入流final FileInputStream in = new FileInputStream(new File("d:/riemann.txt"));// 2.准备好写出数据到hdfs的输出流final FSDataOutputStream out = fs.create(new Path("/riemann.txt"), new Progressable() {public void progress() {// 这个progress方法就是每传输64KB(packet)就会执行一次,System.out.println("&");}});// 3.实现流拷贝IOUtils.copyBytes(in, out, configuration); // 默认关闭流选项是true,所以会自动关闭// 4.关流 可以再次关闭也可以不关了
}

5、HDFS元数据管理机制

问题1:NameNode如何管理和存储元数据?

计算机中存储数据两种:内存或者是磁盘

元数据存储磁盘:存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应,但是安全性高。

元数据存储内存:元数据存放内存,可以高效的查询以及快速响应客户端的查询请求,数据保存在内 存,如果断点,内存中的数据全部丢失。

解决方案:内存+磁盘; NameNode内存+FsImage的文件(磁盘)

新问题:磁盘和内存中元数据如何划分?

两个数据一模一样,还是两个数据合并到一起才是一份完整的数据呢?

一模一样:client如果对元数据进行增删改操作,需要保证两个数据的一致性。FsImage文件操作起来 效率也不高。

两个合并=完整数据:NameNode引入了一个edits文件(日志文件:只能追加写入)edits文件记录的 是client的增删改操作,

不再选择让NameNode把数据dump出来形成FsImage文件(这种操作是比较消耗资源)。

元数据管理流程图

在这里插入图片描述
5.1 第一阶段:NameNode启动


  • 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加 载编辑日志和镜像文件到内存。
  • 客户端对元数据进行增删改的请求。
  • NameNode记录操作日志,更新滚动日志。
  • NameNode在内存中对数据进行增删改。

5.2 第二阶段:Secondary NameNode工作


  • Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否执 行检查点操作结果。
  • Secondary NameNode请求执行CheckPoint。
  • NameNode滚动正在写的Edits日志。
  • 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
  • Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
  • 生成新的镜像文件fsimage.chkpoint。
  • 拷贝fsimage.chkpoint到NameNode。
  • NameNode将fsimage.chkpoint重新命名成fsimage。

三、MapReduce编程框架

1、MapReduce思想

MapReduce思想在生活中处处可见。我们或多或少都曾接触过这种思想。MapReduce的思想核心是分 而治之

充分利用了并行处理的优势。

即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。

MapReduce任务过程是分为两个处理阶段:


  • Map阶段:Map阶段的主要作用是“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。 Map阶段的这些任务可以并行计算,彼此间没有依赖关系。
  • Reduce阶段:Reduce阶段的主要作用是“合”,即对map阶段的结果进行全局汇总。

再次理解MapReduce的思想

在这里插入图片描述

2、MapReduce原理分析

2.1 MapTask运行机制详解

MapTask流程

在这里插入图片描述
详细步骤:


  • 首先,读取数据组件InputFormat(默认TextInputFormat)会通过getSplits方法对输入目录中文 件进行逻辑切片规划得到splits,有多少个split就对应启动多少个MapTask。split与block的对应关系默认是一对一。
  • 将输入文件切分为splits之后,由RecordReader对象(默认LineRecordReader)进行读取,以\n 作为分隔符,读取一行数据,返回。Key表示每行首字符偏移值,value表示这一行 文本内容。
  • 读取split返回,进入用户自己继承的Mapper类中,执行用户重写的map函数。 RecordReader读取一行这里调用一次。
  • map逻辑完之后,将map的每条结果通过context.write进行collect数据收集。在collect中,会先 对其进行分区处理,默认使用HashPartitioner。
    MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对 输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的 取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到 job上。
  • 接下来,会将数据写入内存,内存中这片区域叫做环形缓冲区,缓冲区的作用是批量收集map结 果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写入缓冲区。当然写入之 前,key与value值都会被序列化成字节数组。
    a. 环形缓冲区其实是一个数组,数组中存放着key、value的序列化数据和key、value的元数据信 息,包括partition、key的起始位置、value的起始位置以及value的长度。环形结构是一个抽象概念。
    b. 缓冲区是有大小限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以 需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘 写数据的过程被称为Spill,中文可译为溢写。这个溢写是由单独线程来完成,不影响往缓冲区写 map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例 spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。
  • 当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为!
    a. 如果job设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的 value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整 个模型中会多次使用。
    b. 那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner 绝不能改变最终的计算结果。Combiner只应该用于那种Reduce的输入key/value与输出key/value 类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重, 如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。
  • 合并溢写文件:每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果 map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当 整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个,写入 磁盘,并且为这个文件提供了一个索引文件,以记录每个reduce对应数据的偏移量。

至此map整个阶段结束!!

MapTask的一些配置
在这里插入图片描述

官方参考地址

https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

2.2 MapTask的并行度

MapTask并行度思考

MapTask的并行度决定Map阶段的任务处理并发度,从而影响到整个Job的处理速度。

MapTask并行度决定机制

数据块:Block是HDFS物理上把数据分成一块一块。

切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。

在这里插入图片描述

2.2.1 切片机制源码阅读

在这里插入图片描述

默认就是128M;

MapTask并行度是不是越多越好呢?

答案不是,如果一个文件仅仅比128M大一点点也被当成一个split来对待,而不是多个split.

MR框架在并行运算的同时也会消耗更多资源,并行度越高资源消耗也越高,假设129M文件分为两个分 片,一个是128M,一个是1M;

对于1M的切片的Maptask来说,太浪费资源。

129M的文件在Hdfs存储的时候会不会切成两块?

2.3 ReduceTask 工作机制

在这里插入图片描述

Reduce大致分为copy、sort、reduce三个阶段,重点在前两个阶段。copy阶段包含一个 eventFetcher来获取已完成的map列表,由Fetcher线程去copy数据,在此过程中会启动两个merge线 程,分别为inMemoryMerger和onDiskMerger,分别将内存中的数据merge到磁盘和将磁盘中的数据 进行merge。待数据copy完成之后,copy阶段就完成了,开始进行sort阶段,sort阶段主要是执行 finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调用用户定义的reduce函数进行处理。

详细步骤


  • Copy阶段,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求 maptask获取属于自己的文件。
  • Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数 值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge 有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的 数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过 程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种 merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge 方式生成最终的文件。
  • 合并排序。把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。
  • 对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个 或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。

2.4 ReduceTask并行度

ReduceTask的并行度同样影响整个Job的执行并发度和执行效率,但与MapTask的并发数由切片数决定
不同,ReduceTask数量的决定是可以直接手动设置:

// 默认值是1,手动设置为4
job.setNumReduceTasks(4);

注意事项


  • ReduceTask=0,表示没有Reduce阶段,输出文件数和MapTask数量保持一致;
  • ReduceTask数量不设置默认就是一个,输出文件数量为1个;
  • 如果数据分布不均匀,可能在Reduce阶段产生倾斜;

2.5 Shuffle机制

map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫
shuffle。

shuffle: 洗牌、发牌——(核心机制:数据分区,排序,分组,combine,合并等过程)

在这里插入图片描述

在这里插入图片描述


四、YARN资源调度

1、Yarn架构

在这里插入图片描述

ResourceManager(rm):处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资 源分配与调度;

NodeManager(nm):单个节点上的资源管理、处理来自ResourceManager的命令、处理来自 ApplicationMaster的命令;

ApplicationMaster(am):数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错。

Container:对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运
行相关的信息。

2、Yarn任务提交(工作机制)

在这里插入图片描述

作业提交过程之YARN


  • 作业提交
    第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
    第2步:Client向RM申请一个作业id。
    第3步:RM给Client返回该job资源的提交路径和作业id。
    第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
    第5步:Client提交完资源后,向RM申请运行MrAppMaster。
  • 作业初始化
    第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
    第7步:某一个空闲的NM领取到该Job。
    第8步:该NM创建Container,并产生MRAppmaster。
    第9步:下载Client提交的资源到本地。
  • 任务分配
    第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
    第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分 别领取任务并创建容器。
  • 任务运行
    第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager 分别启动MapTask,MapTask对数据分区排序。
    第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
    第14步:ReduceTask向MapTask获取相应分区的数据。
    第15步:程序运行完毕后,MR会向RM申请注销自己。
  • 进度和状态更新
    YARN中的任务将其进度和状态返回给应用管理器, 客户端每秒(通过 mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
  • 作业完成
    除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作 业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完 成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备 之后用户核查。

3、 Yarn调度策略

Hadoop作业调度器主要有三种:FIFOCapacity SchedulerFair SchedulerHadoop2.9.2默认的资源调度器是Capacity Scheduler

3.1 FIFO(先进先出调度器)

在这里插入图片描述

3.2 容量调度器(Capacity Scheduler 默认的调度器)

Apache Hadoop默认使用的调度策略。Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集 群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内 部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部, 资源的调度是采用的是先进先出(FIFO)策略。

在这里插入图片描述

3.3 Fair Scheduler(公平调度器,CDH版本的hadoop默认使用的调度器)

Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。公 平调度在也可以在多个队列间工作。举个例子,假设有两个用户A和B,他们分别拥有一个队列。 当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运 行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它 job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之 一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。

3.4 Yarn多租户资源隔离配置

Yarn集群资源设置为A,B两个队列,


  • A队列设置占用资源70%主要用来运行常规的定时任务,
  • B队列设置占用资源30%主要运行临时任务,
  • 两个队列间可相互资源共享,假如A队列资源占满,B队列资源比较充裕,A队列可以使用B队列的 资源,使总体做到资源利用最大化.

3.5 选择使用Fair Scheduler调度策略

3.5.1 yarn-site.xml


<property><name>yarn.resourcemanager.scheduler.classname><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSch edulervalue><description>In case you do not want to use the default schedulerdescription>
property>

3.5.2 创建fair-scheduler.xml文件

在Hadoop安装目录/etc/hadoop创建该文件


<allocations><defaultQueueSchedulingPolicy>fairdefaultQueueSchedulingPolicy><queue name&#61;"root" ><queue name&#61;"default"><aclAdministerApps>*aclAdministerApps><aclSubmitApps>*aclSubmitApps><maxResources>9216 mb,4 vcoresmaxResources><maxRunningApps>100maxRunningApps><minResources>1024 mb,1vcoresminResources><minSharePreemptionTimeout>1000minSharePreemptionTimeout><schedulingPolicy>fairschedulingPolicy><weight>7weight>queue><queue name&#61;"queue1"><aclAdministerApps>*aclAdministerApps><aclSubmitApps>*aclSubmitApps><maxResources>4096 mb,4vcoresmaxResources><maxRunningApps>5maxRunningApps><minResources>1024 mb, 1vcoresminResources><minSharePreemptionTimeout>1000minSharePreemptionTimeout><schedulingPolicy>fairschedulingPolicy><weight>3weight>queue>queue><queuePlacementPolicy><rule create&#61;"false" name&#61;"specified"/><rule create&#61;"true" name&#61;"default"/>queuePlacementPolicy>
allocations>

3.5.3 界面验证

在这里插入图片描述


推荐阅读
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • MongoDB核心概念与基础知识解析
    MongoDB 是一种基于分布式文件存储的非关系型数据库系统,主要采用 C++ 语言开发。本文将详细介绍 MongoDB 的核心概念和基础知识,包括其与传统 SQL 数据库的区别,数据库及集合的基本操作,如数据的插入、更新、删除和查询等。通过本文,读者可以全面了解 MongoDB 的基本功能及其应用场景。 ... [详细]
  • Hadoop——实验七:MapReduce编程实践
    文章目录一.实验目的二.实验内容三.实验步骤及结果分析 1.基于ubuntukylin14.04(7)版本,安装hadoop-eclipse-kepler-plugi ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
author-avatar
沐月954_290
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有