深入理解HDFS工作原理:大数据存储和容错性机制解析

**

引言:

**

在当今数据爆炸的时代,存储和管理大规模数据成为了许多组织面临的重要挑战。为了解决这一挑战,分布式文件系统应运而生。Hadoop分布式文件系统(HDFS)作为Apache Hadoop生态系统的核心组件之一,已经成为处理大数据的事实标准之一。它以其高可靠性、高容错性和高可用性等特点,在大规模数据存储和处理方面发挥着关键作用。

首先,我们将了解HDFS是如何通过数据分片和数据复制等机制来实现数据的高可靠性存储和容错性。随后,我们将探讨HDFS中节点角色的分工,包括NameNode和DataNode,以及它们是如何协同工作来管理文件系统和存储数据的。接着,我们将讨论HDFS的容错性机制,包括数据复制、健康检查和自动恢复等,以及如何确保系统在面对节点故障或其他异常情况时能够保持正常运行。

HDFS工作原理解析

1. 数据分片(Data Splitting)

HDFS将大文件分割成固定大小的数据块(通常默认为128MB或256MB),并将这些数据块存储在分布式集群中的不同节点上。每个数据块通常在多个节点上复制,以提供容错性和高可用性。

- block bytes -- 块字节 ack  -- 确认 datanode -- 数据节点  Block write complete -- 块写入完成

当文件写入HDFS时,HDFS将文件划分为块并负责其复制。此操作(大部分)执行一次,然后可供集群上运行的所有 MR 作业使用。这是集群范围的配置;

数据分片的基本工作原理

  1. 文件切分:当一个大文件要被存储到HDFS中时,HDFS会将该文件切分成一个个固定大小的数据块。通常情况下,数据块的大小由HDFS的配置决定,默认情况下通常是128MB或256MB。

  2. 数据块存储:切分后的数据块会被分布式地存储在HDFS集群的不同节点上。这些节点称为DataNode。每个数据块通常会存储在多个DataNode上,以提供数据的冗余备份,以防止数据丢失。

  3. 数据块的副本
    HDFS会为每个数据块创建多个副本,并将这些副本分布存储在不同的DataNode上。这样做有两个目的:
    1.提高数据的可靠性和容错性:当某个DataNode或数据块发生故障时,可以从其他副本中恢复数据。
    2.提高数据的读取性能:客户端可以从距离更近的副本读取数据,减少网络传输的开销。

  4. 数据块的位置信息:NameNode负责维护文件系统的元数据,包括文件和数据块的位置信息。客户端在访问文件时会先与NameNode通信,获取数据块的位置信息,然后直接与相应的DataNode通信进行数据读取或写入操作。

  5. 数据块的管理:HDFS会定期检查数据块的完整性,并在发现数据块损坏或丢失时进行修复。如果某个数据块的副本数低于指定的阈值,HDFS会自动创建新的副本来替换丢失的副本。

**

2.节点角色

**
在Hadoop分布式文件系统(HDFS)中,有两种主要类型的节点扮演不同的角色:NameNode 和 DataNode。

  • HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

HDFS Architecture --HDFS架构 Namenode --名称节点 metadata ops  --元数据操作 client  --客户 read  --读 rack  --架子 write  --写 replication  --复制 blocks --块

  • Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。

    集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。

1.NameNode

  • NameNode 是HDFS的关键组件之一,负责管理文件系统的命名空间和文件的元数据。
  • NameNode 维护了文件系统的目录结构,以及每个文件的元数据信息,如文件名、文件大小、数据块的位置等。
  • 当客户端请求读取或写入文件时,NameNode负责确定数据块的位置信息,并将这些信息返回给客户端。
  • NameNode是单点故障,因为所有文件系统的元数据都存储在它的内存中。为了防止元数据丢失,通常会定期备份元数据,并启用NameNode的高可用性解决方案,如HA(High Availability)。

2.DataNode:

  • DataNode 是HDFS中存储实际数据的节点,它负责存储和检索数据块。
  • 当客户端向HDFS写入数据时,DataNode 接收客户端发送的数据块,并将其存储在本地文件系统上。
  • 当客户端请求读取文件时,DataNode 负责从本地文件系统读取数据块并将其传输给客户端。
  • DataNode 在运行时向NameNode发送心跳消息,用于报告节点的健康状况以及数据块的状态。

3.节点角色工作原理

  • 客户端与NameNode通信,获取文件的元数据信息。
  • NameNode 返回文件的元数据信息给客户端。
  • 客户端根据元数据信息直接与DataNode通信,进行数据读取或写入操作。
  • DataNode 在写入或读取数据时,负责与客户端进行实际的数据传输。

**

3.数据访问

**
数据访问是指客户端从HDFS中读取数据或向HDFS中写入数据的过程。以下是数据访问的基本工作原理:

1.读取数据的工作原理

  • 客户端首先与NameNode通信,请求读取特定文件的数据。客户端提供文件路径等信息给NameNode。
  • NameNode返回包含文件的元数据信息,包括文件的大小、数据块的位置等。
  • 客户端根据元数据信息确定数据块的位置,并向对应的DataNode发送读取请求。
  • DataNode接收到读取请求后,从本地存储中读取数据块,并将数据返回给客户端。

2.写入数据的工作原理

  • 客户端首先与NameNode通信,请求将数据写入到指定的文件中。客户端提供文件路径等信息给NameNode。
  • NameNode确定数据写入的位置以及数据块的分配情况,并将这些信息返回给客户端。
  • 客户端将数据按照数据块进行分割,并将每个数据块发送给对应的DataNode。
  • DataNode接收到数据块后,负责存储数据,并向客户端发送确认信息,表示数据写入操作完成。

3.数据块的复制与容错处理

  • 在数据写入过程中,HDFS会根据副本配置策略,在集群中的其他DataNode上创建相应数量的数据块副本。这些副本的创建是异步进行的,并且在后台由HDFS系统自动管理。
  • 当某个DataNode或数据块发生故障时,HDFS能够自动检测到故障并进行处理。如果某个数据块的副本数低于指定的阈值,HDFS会自动创建新的副本来替换丢失的副本。
    在这里插入图片描述

步骤1:客户端通过调用文件系统对象(对于HDFS来说是分布式文件系统的一个实例)上的open()来打开它希望读取的文件。

步骤 2:分布式文件系统 (DFS) 使用远程过程调用 (RPC) 调用名称节点,以确定文件中前几个块的位置。对于每个块,名称节点返回具有该块副本的数据节点的地址。 DFS 将 FSDataInputStream 返回给客户端以供其读取数据。 FSDataInputStream 又包装了一个 DFSInputStream,它管理数据节点和名称节点 I/O。

步骤 3:然后客户端在流上调用 read()。 DFSInputStream 存储了文件中主要几个块的信息节点地址,然后连接到文件中主要块的主要(最近)数据节点。

步骤 4:数据从数据节点流式传输回客户端,客户端在流上重复调用 read()。

步骤5:当到达块的末尾时,DFSInputStream将关闭与数据节点的连接,然后为下一个块寻找最佳数据节点。这对客户端来说是透明的,从客户端的角度来看,这只是在读取无尽的流。块被读取为,DFSInputStream 打开到数据节点的新连接,因为客户端读取流。它还将根据需要调用名称节点来检索下一批块的数据节点位置。

第 6 步:当客户端完成读取文件后,将调用 FSDataInputStream 上的 close() 函数。

**

4.数据复制

**
数据复制是指在HDFS中将数据块复制到多个节点以增加数据的容错性和可用性。

  • HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。
    Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。
    在这里插入图片描述

副本存放: 最最开始的一步

  • 副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。这种特性需要做大量的调优,并需要经验的积累。HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。目前实现的副本存放策略只是在这个方向上的第一步。实现这个策略的短期目标是验证它在生产环境下的有效性,观察它的行为,为实现更先进的策略打下测试和研究的基础。大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id。一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。三分之一的副本在一个节点上,三分之二的副本在一个机架上,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。

数据复制的基本工作原理:

  • 副本配置
    HDFS的副本配置是通过参数设置的,通常在Hadoop集群的配置文件中指定。这些参数包括每个数据块的副本数目以及副本放置策略。

  • 副本创建:
    当客户端向HDFS写入数据时,根据副本配置,HDFS会在写入数据块时为每个数据块创建指定数量的副本。这些副本通常存储在集群中的不同节点上。

  • 副本放置
    1.HDFS会根据副本放置策略,将数据块的副本分布在集群的不同节点上。默认情况下,HDFS会尽量将副本分布在不同的机架上,以降低机架级别的故障对数据的影响。
    2.如果集群中有多个机架,则HDFS会将数据块的副本均匀分布在这些机架上。这样做可以提高数据的容错性,以防止机架级别的故障导致数据不可用。

  • 副本管理:
    1.HDFS会定期检查数据块的副本情况,并根据需要创建新的副本或删除多余的副本。如果某个副本因节点故障或其他原因不可用,HDFS会自动将其替换为新的副本,以保证数据的可靠性和可用性。
    2.当客户端向HDFS写入数据时,如果数据块的副本数低于指定的阈值,HDFS会立即创建新的副本,以确保数据的容错性。

  • 副本同步
    当数据块的主副本更新时,HDFS会通过后台线程将这些更新同步到其他副本上。这样可以确保所有副本的数据保持一致性。

**

5.容错性

**
容错性是指系统在面对硬件故障、软件错误或其他异常情况时能够保持正常运行的能力。容错性是通过以下几种机制来实现的:

数据复制

  • HDFS将数据切分为固定大小的数据块,并在集群中多个节点上存储数据块的副本。当某个节点或数据块发生故障时,HDFS能够从其他副本中恢复数据,确保数据的可靠性和可用性。
    在这里插入图片描述
  • 创建的副本数量取决于复制因子,默认情况下为3。如果任何计算机出现故障,则可以从包含相同数据副本的另一台计算机访问该数据块。因此,不会因为副本存储在不同的机器上而导致数据丢失。

HDFS复制机制示例
在这里插入图片描述
假设用户存储一个文件。 HDFS 将这个文件分成块;说 B1、B2、B3、B4 和 B5。假设有五个数据节点,即 D1、D2、D3、D4 和 D5。 HDFS为每个块创建副本并将其存储在不同的节点上以实现容错。对于每个原始块,将在不同节点上存储三个副本(复制因子3)。让块1存储在数据节点D1、D2和D3上,块2存储在数据节点D1、D4和D5上,其他3个块类似。如果数据节点 1 发生故障,则用户仍可从数据节点(B1 为 D2、D3)、B2(B2 为 D4、D5)和(B4 为 D2、D5)使用 D1 中存在的块 1、2 和 4。因此,即使在不利的条件下,也不会丢失数据。

健康检查和心跳机制

  • DataNode定期向NameNode发送心跳消息,报告节点的健康状况以及数据块的状态。如果NameNode在一定时间内未收到某个DataNode的心跳消息,则会将该节点标记为不可用,并将其上的数据块副本复制到其他节点上,以确保数据的容错性。

故障检测和自动恢复

  • HDFS能够自动检测到节点或数据块的故障,并在必要时进行故障处理和数据恢复。当某个数据块的副本数低于指定的阈值时,HDFS会自动创建新的副本以保证数据的完整性。

高可用性解决方案

  • HDFS提供了一些高可用性解决方案,如NameNode的HA(HighAvailability),通过在集群中运行多个NameNode实例,并使用共享存储或共享编辑日志来实现故障切换,以提高NameNode的可用性。

数据校验

  • HDFS在存储数据时会使用数据校验和(checksum)来验证数据的完整性。当数据被读取时,HDFS会校验数据的完整性,以检测数据的损坏或篡改,并在必要时重新获取数据块的副本。

**

6.数据写入流程

**
数据写入流程是指将数据写入到HDFS中的过程,包括客户端向HDFS写入数据的整个流程。以下是数据写入流程的基本工作原理:

客户端请求:

  • 客户端向HDFS发送写入请求,请求将数据写入到指定的文件中。

NameNode操作:

  • 客户端与NameNode通信,请求向文件中写入数据。NameNode负责管理文件系统的元数据,包括文件的命名空间、文件和数据块的位置信息等。

数据块分配:

  • NameNode确定数据写入的文件位置以及数据块的分配情况。它会告知客户端应该将数据写入到哪些数据块中,以及这些数据块在集群中的位置。

数据写入:

  • 客户端按照NameNode返回的信息,将数据按照数据块进行分割,并通过网络发送给集群中的DataNode。
  • 客户端与DataNode进行直接通信,将数据写入到指定的数据块中。数据写入过程中,DataNode负责存储数据并确认写入操作的完成。

数据复制

  • 当数据写入完成后,HDFS会根据副本配置策略,在集群中的其他DataNode上创建相应数量的数据块副本。这些副本的创建是异步进行的,并且在后台由HDFS系统自动管理。

确认写入

  • DataNode在完成数据写入操作后向客户端发送确认信息,告知客户端数据写入操作的状态。客户端收到确认信息后,可以继续执行后续操作。

元数据更新

  • 在数据写入操作完成后,NameNode会更新文件系统的元数据,包括文件的大小、数据块的位置信息等。这样可以确保文件系统的元数据与实际数据存储的一致性。

总的来说,数据写入流程是客户端与NameNode和DataNode之间进行交互的过程,考虑配图以更好地理解这个概念
在这里插入图片描述
步骤1:客户端通过调用DistributedFileSystem(DFS)上的create()来创建文件。

第 2 步: DFS 对名称节点进行 RPC 调用,以在文件系统的命名空间中创建一个新文件,并且没有与其关联的块。名称节点执行各种检查以确保该文件尚不存在并且客户端具有创建该文件的正确权限。如果这些检查通过,名称节点会准备新文件的记录;否则,无法创建该文件,因此客户端会抛出错误,即 IOException。 DFS 返回一个 FSDataOutputStream 供客户端开始写入数据。

步骤 3:由于客户端写入数据,DFSOutputStream 将其拆分为数据包,并将其写入称为信息队列的室内队列。数据队列由 DataStreamer 消耗,DataStreamer 负责要求名称节点通过选择合适的数据节点清单来存储副本来分配新块。数据节点列表形成一个管道,这里我们假设复制级别为三,因此管道中有三个节点。 DataStreamer 将数据包流式传输到管道内的主数据节点,该节点存储每个数据包并将其转发到管道内的第二数据节点。

步骤 4:类似地,第二个数据节点存储数据包并将其转发到管道中的第三个(也是最后一个)数据节点。

步骤 5: DFSOutputStream 维护等待数据节点确认的数据包的内部队列,称为“ack 队列”。

步骤 6:此操作将所有剩余数据包发送到数据节点管道,并在连接到名称节点以指示文件是否完整之前等待确认。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第2题两数相加

题目: 题解: class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head null, tail null;int carry 0;while (l1 ! null || l2 ! null) {int n1 l1 ! null ? l1.val : 0;int n2 l2 ! null ? l2.val : 0;int sum…

罗永浩直播阿里云服务器ECS u1性能如何?值得买吗?

罗永浩直播卖阿里云服务器,企业专享云服务器ECS通用算力型u1实例是什么?性能如何?目前阿里云服务器ECS u1实例,2核4G,5M固定带宽,80G ESSD Entry盘,优惠价格199元一年,罗永浩今晚直播…

算法学习16:数论03(容斥原理、博弈论)

算法学习16:数论03(容斥原理、博弈论) 文章目录 算法学习16:数论03(容斥原理、博弈论)前言一、容斥原理:求多个集合的并集二、博弈论1.Nim游戏:2.集合N-im游戏 总结 前言 提示&#…

【AI系列】Python NLTK 库和停用词处理的应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

04 | Swoole 源码分析之 epoll 多路复用模块

首发原文链接:Swoole 源码分析之 epoll 多路复用模块 大家好,我是码农先森。 引言 在传统的IO模型中,每个IO操作都需要创建一个单独的线程或进程来处理,这样的操作会导致系统资源的大量消耗和管理开销。 而IO多路复用技术通过…

INA350ABSIDDFR 仪表放大器 单路低功耗 TSOT-23-8

NA350ABSIDDFR 是一款高精度、低功耗、单片式精密运算放大器。它具有出色的直流精度和低失调电压,适用于需要高精度信号处理的应用。这款产品广泛应用于各种领域,如工业控制、医疗设备、测试与测量设备以及通信系统等。 制造商: Texas Instruments …

Apollo配置中心使用

apollo配置中心使用 Apollo配置中心-简介apollo源码Apollo配置基本概念Apollo特性Apollo基础模型Apollo架构设计Apollo架构设计-实时推送设计Apollo架构设计-可用性Apollo架构设计-监控Apollo架构设计-扩展Apollo-本地部署准备工作安装步骤mysql命令行创建ApolloPortalDBmysql客…

实时的软件生成 —— Prompt 编程打通低代码的最后一公里?

原文:实时的软件生成 —— Prompt 编程打通低代码的最后一公里?_运行_问题_示例 PS:这也是一篇畅想,虽然经过了一番试验,依旧有一些不足,但是大体上站得住脚。 传统的软件生成方式需要程序员编写大量的代…

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …

Redis类型 Stream Bitfield

Stream 类型 Stream类型就是Redis里的mq,是redis为了占领市场份额的产物 今天我们就来介绍一下Stream Redis的消息队列一般是两个方案 第一个是Lpush Rpop 队列的异步队列方案(一对一) 第二个方案就是pubsub(发布订阅)模式 (一对多) 注:这里如果没有消费者了,队列中的数据就直…

android RK3328 gpio处理,android高级面试2024

public static class CommandResult { public int result -1; public String errorMsg; public String successMsg; } /** 执行命令—单条 param command param isRoot return */ public static CommandResult execCommand(String command, boolean isRoot) { Str…

已上线项目,突然有一天网站虽进得去,但是接口拿不到数据,作为前端的你如何排查问题?

在开始写这篇博客之前,想说几句题外话哈,虽然自己的粉丝不多,但自己每篇博客都是用心在写,可能后面会针对部分文章开启只有VIP才能访问,原因你们也懂得(▽),无非是想赚点外块呗,不过主要现在也是知识付费时代,毕竟自己写出的东西也是本人亲身经历着,也是具有一定的价值…

试题G(买二赠一)

问题描述】 某商场有 N 件商品,其中第 i 件的价格是 Ai。现在该商场正在进行 “买二 赠一” 的优惠活动,具体规则是: 每购买 2 件商品,假设其中较便宜的价格是 P(如果两件商品价格一样, 则 P 等于其中一件…

Python之Opencv进阶教程(2):统计图片灰度级别的像素数量

1、什么是灰度像素数量 在OpenCV中,可以使用**cv2.calcHist()**函数来计算图像的直方图。直方图是一种图形统计表,用于表示图像中每个灰度级别(或颜色通道)的像素数量或密度分布。以下是一个示例代码,演示了如何使用O…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类:对外暴露的接口,供其他插件调用实现类:实现接口内的方法激活类:负责将插件注册到CTK框架中 二、接口、插件、服务…

CSS绘制三角形和梯形

以上效果对应的CSS依次如下,从左往右依次看就很直观了。 .border {width: 30px;height: 30px;margin: 10px;background-color: lightblue;&_1 {border: solid 1px #b160e7;}&_2 {border-top: solid 15px lightcoral;border-right: solid 15px lightgoldenr…

互联网、因特网、万维网的区别

互联网 internet:凡是能彼此通信的设备组成的网络就叫互联网,即使只有两台计算机,无论以何种技术使其彼此通信,都叫互联网。所以,根据互联网的覆盖规模可以分为: 局域网(Local Area Network&am…

阿里云服务器经济型e实例特点、适用场景介绍和问题解答

阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU处理器采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比&#xff0c…

腾讯云docker创建容器镜像及仓库

这里为了尽量简单,直接用腾讯云容器版本服务器 腾讯云有自己的镜像加速地址,速度还可以,单纯拉取容器还是够用的 但是当我push容器出现各种各样问题因为网络原因,国内访问docker官方镜像站非常麻烦,所以使用阿里的镜像…

储能系统--充电桩中国市场展望(四)

一、充电桩发展 充电桩产业十余年萌芽成长,迈入高速增长时代。2006-2015年为中国充电桩行业萌芽期,2006年,比亚迪在深圳总 部建立了第一座汽车充电站。2008年,北京市奥运会期间建设了国内第一个集中式充电站,在这个阶…