首页 文章 精选 留言 我的

精选列表

搜索[分布式锁],共10000篇文章
优秀的个人博客,低调大师

阿里云一键部署 Spark 分布式集群

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎,可以完成各种各样的运算,包括 SQL 查询、文本处理、机器学习等,而在 Spark 出现之前,我们一般需要学习各种各样的引擎来分别处理这些需求。本文主要目的是为大家提供一种非常简单的方法,在阿里云上部署Spark集群。 通过<阿里云ROS资源编排服务>,将VPC、NAT Gateway、ECS创建,Hadoop和Spark部署过程自动化,使大家能够非常方便地部署一个Spark集群。本文创建的Spark集群包含三个节点:master.hadoop,slave1.hadoop,slave2.hadoop。 急速部署Spark集群 一键部署Spark集群>> 注意: 必须确保可以正确下载Jdk,Hadoop,Scala和Spark安装包,我们可以选择

优秀的个人博客,低调大师

[ElasticSearch]原理之分布式文档存储(Distributed Document Store)

之前的文章中,我们已经知道如何存储数据到索引中以及如何检索它。但是我们掩盖了数据存储到集群中以及从集群中获取数据的具体实现的技术细节(But we glossed over many technical details surrounding how the data is distributed and fetched from the cluster)。 1. 路由文档到分片中(Routing a Document to a Shard) 当你索引一篇文档时,它会存储到一个主分片中。但是ElasticSearch如何知道文档是属于哪个分片呢?当我们创建一个新的文档,它是怎么知道它是应该存储到分片1上还是分片2上? 数据存储到分片的过程是有一定规则的,并不是随机发生的,因为我们日后还需要从分片中检索出文档。数据存储过程取决于下面的公式: shard = hash(routing) % number_of_primary_shards Routing值是一个任意字符串,默认为文档的id,也可以设置为一个用户自定义的值。Routing这个字符串通过一个hash函数处理,并返回一个数值,然后再除以索引中主分片的数目number_of_primary_shards,所得的余数作为主分片的编号,取值一般在0到number_of_primary_shards - 1之间的余数范围中。通过这种方法计算出该数据是存储到哪个分片中。 这就解释了为什么主分片个数在创建索引之后就不能再更改了:如果主分片个数在创建之后可以修改,那么之前所有通过公式得到的值都会失效,之前存储的文档也可能找不到。 所有的文档API(get , index , delete , bulk , update , 和 mget)都可以接受一个routing参数,来自定义文档与分片之间的映射。一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中。 2. 主分片与副本分片如何交互 假设我们有一个三个节点的集群。集群里有一个名称为blog的索引,有两个主分片(primary shards)。每个主分片都有两个副本。相同节点的副本不会分配到同一节点,最后如下图展示: 我们可以发送请求到集群中的任何一个节点,每个节点都有能力处理我们的请求。每个节点都知道集群中任意文档的存储位置,所以可以直接将请求转发到所需的节点(Every node knows the location of every document in the cluster,so can forward requests directly to the required node)。 在下面的例子中,我们将请求都发送到节点1上,我们将其称为协调节点(coordinating node)。 2.1 创建,索引和删除文档 创建,索引和删除请求都是写操作,所以必须在主分片上写操作完成之后才能被复制到相关的副本分片上(Create, index, and delete requests are write operations, which must be successfully completed on the primary shard before they can be copied to any associated replica shards)。 交互过程如下图所示: 下面是成功在主分片和副本分片上创建,索引以及删除文档所必须的步骤: 客户端发送了一个新建,索引 或者 删除文档 请求给节点 1; 节点 1 通过请求文档的 id 值判断出该文档应该被存储在分片 0 中,并且知道分片 0 的主分片 P0 位于节点 3 上。因此节点 1 会把这个请求转发给节点 3; 节点 3 在主分片上执行请求。如果请求执行成功,节点 3 并行将该请求转发给节点 1 和节点 2 上的的副本分片(R0)。一旦所有的副本分片都成功地执行了请求,则向节点 3 报告成功,节点 3 向协调节点 (Node 1 )报告成功,协调节点向客户端报告成功。 在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。 有一些可选的请求参数允许您影响这个过程,可能以数据安全为代价提升性能。这些选项很少使用,因为Elasticsearch已经很快,但是为了完整起见,在这里阐述如下: 2.1.1 一致性 默认情况下,在尝试进行写操作之前,主分片需要规定数量(quorum)或大多数(majority)的分片副本shard copies(其中分片副本可以是主分片或副本分片a shard copy can be a primary or a replica shard)。 这是为了防止将数据写入网络分区的“错误的一边wrong side”。 规定数量quorum定义如下: int( (primary + number_of_replicas) / 2 ) + 1 一致性consistency值可以是one(只有主分片),all(主分片和所有的副本),或者默认值quorum,或者大多数的分片副本(The allowed values for consistency are one (just the primary shard), all (the primary and all replicas), or the default quorum, or majority, of shard copies.)。 请注意,number_of_replicas是索引设置中指定的副本数,而不是当前活跃的副本数。 如果指定索引有三个副本,则quorum将如下定义: int( (primary + 3 replicas) / 2 ) + 1 = 3 但是,如果仅启动两个节点,则活跃的分片副本不满足规定数量,您将无法对任何文档进行索引或删除。 2.1.2 超时 如果没有足够的副本分片会发生什么? Elasticsearch会等待,希望更多的分片出现。默认情况下,它最多等待1分钟。 如果你需要,你可以使用 timeout 参数 使它更早终止: 100 100毫秒,30s 是30秒。 备注 新索引默认有 1 个副本分片,这意味着为满足 规定数量 应该 需要两个活动的分片副本。 但是,这些默认的设置会阻止我们在单一节点上做任何事情。为了避免这个问题,要求只有当 number_of_replicas 大于1的时候,规定数量才会执行。 2.2 检索文档 我们可以从一个主分片(primary shard)或者它们任一副本中检索文档,流程如下图: 下面是从主分片或者副本分片上检索文档所需要的一系列步骤: 客户端发送了一个 Get 请求给节点 1; 节点 1 通过请求文档的 id 值判断出该文档被存储在分片 0 中。三个节点上都存有分片 0 的复制(节点1上R0,节点2上R0,节点3上P0)。这一次,它将请求转发给节点 2 。 节点 2 返回文档给节点 1 ,节点 1 在返回文档给客户端。 对于读请求,对于每一次请求,请求节点都会选择一个不同的副本分本,达到负载均衡。通过轮询所有的副本分片。 在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片。 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的。 2.3 局部更新文档 更新 API (Update API)融合了上面解释的两种读写模式,如下图所示: 下面是部分更新一篇文档所需要的一系列步骤: 客户端发送了一个 Update 请求给节点 1; 节点 1 通过请求文档的 id 值判断出该文档被存储在分片 0 中。并且知道分片 0 的主分片 P0 位于节点 3 上。因此节点 1 会把这个请求转发给节点 3; 节点 3 从主分片(P0)上检索出指定文档,并更改_source字段中的JSON,修改完毕之后试着重新索引文档到主分片(P0)上。如果有人已经修改了该文档,那么会重复步骤3,如果尝试retry_on_conflict次还没有成功则放弃。 如果节点 3 更新文档成功,节点 3 会把文档新版本并行发给节点 1 和 节点 2 上的副本分片,重新索引文档。一旦所有的副本分片返回成功,节点 3 向协调节点返回成功,协调节点向客户端返回成功。 基于文档的复制 当主分片把更改转发到副本分片时, 它不会转发更新请求。 相反,它转发完整文档的新版本。请记住,这些更改将会异步转发到副本分片,并且不能保证它们以发送它们相同的顺序到达。 如果Elasticsearch仅转发更改请求,则可能以错误的顺序应用更改,导致得到损坏的文档。 2.4 多文档模式 mget 和 bulk API的模式类似于单文档模式。 不同的是,协调节点知道每个文档存储在哪个分片中。 它将多文档请求分解成对每个分片的多文档请求,并将请求并行转发到每个参与节点。 一旦从每个节点接收到应答,将每个节点的响应整合到单个响应中,并返回给客户端 2.4.1 mget 如下图所示: 以下是使用单个 mget 请求取回多个文档所需的步骤顺序: 客户端向节点 1 发送 mget 请求。 节点 1 为每个分片构建多文档获取请求,然后并行转发这些请求到托管在每个所需的主分片或者副本分片的节点上。一旦收到所有应答, 节点 1 构建响应并将其返回给客户端。 2.4.2 bulk bulk API,允许在单个批量请求中执行多个创建、索引、删除和更新请求,如下图所示: bulk API 按如下步骤顺序执行: 客户端向 节点 1 发送 bulk 请求。 节点 1 为每个节点创建一个批量请求,并将这些请求并行转发到每个包含主分片的节点主机。 主分片一个接一个按顺序执行每个操作。当每个操作成功时,主分片并行转发新文档(或删除)到副本分片,然后执行下一个操作。 一旦所有的副本分片报告所有操作成功,该节点将向协调节点报告成功,协调节点将这些响应收集整理并返回给客户端。 bulk API 还可以在整个批量请求的最顶层使用 consistency 参数,以及在每个请求中的元数据中使用 routing 参数。

优秀的个人博客,低调大师

Hadoop分布式文件系统:架构和设计要点

原文:http://hadoop.apache.org/core/docs/current/hdfs_design.html一、前提和设计目标 1、硬件错误是常态,而非异常情况, HDFS可能是有成百上千的 server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是 HDFS的核心架构目标。 2、跑在 HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。 3、 HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至 T字节,一个单一 HDFS实例应该能支撑数以千万计的文件。 4、 HDFS应用对文件要求的是 write-one-read-many访问模型。一个文件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问 题,使高吞吐量的数据访问成为可能。典型的如 MapReduce框架,或者一个 web crawler应用都很适合这个模型。 5、移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好, HDFS提供给应用这样的接口。 6、在异构的软硬件平台间的可移植性。 二、 Namenode和 Datanode HDFS采用 master/slave架构。一个 HDFS集群是有一个 Namenode和一定数目的 Datanode组成。 Namenode是一个中心服 务器,负责管理文件系统的 namespace和客户端对文件的访问。 Datanode在集群中一般是一个节点一个,负责管理节点上它们附带的存储。在内 部,一个文件其实分成一个或多个 block,这些 block存储在 Datanode集合里。 Namenode执行文件系统的 namespace操作,例如 打开、关闭、重命名文件和目录,同时决定 block到具体 Datanode节点的映射。 Datanode在 Namenode的指挥下进行 block的创 建、删除和复制。 Namenode和 Datanode都是设计成可以跑在普通的廉价的运行 linux的机器上。 HDFS采用 java语言开发,因此可以部 署在很大范围的机器上。一个典型的部署场景是一台机器跑一个单独的 Namenode节点,集群中的其他机器各跑一个 Datanode实例。这个架构并不排 除一台机器上跑多个 Datanode,不过这比较少见。 单一节点的 Namenode大大简化了系统的架构。 Namenode负责保管和管理所有的 HDFS元数据,因而用户数据就不需要通过 Namenode(也就是说文件数据的读写是直接在 Datanode上)。 三、文件系统的 namespace HDFS支持传统的层次型文件组织,与大多数其他文件系统类似,用户可以创建目录,并在其间创建、删除、移动和重命名文件。 HDFS不支持 user quotas和访问权限,也不支持链接( link),不过当前的架构并不排除实现这些特性。 Namenode维护文件系统的 namespace,任何对文 件系统 namespace和文件属性的修改都将被 Namenode记录下来。应用可以设置 HDFS保存的文件的副本数目,文件副本的数目称为文件的 replication因子,这个信息也是由 Namenode保存。 四、数据复制 HDFS被设计成在一个大集群中可以跨机器地可靠地存储海量的文件。它将每个文件存储成 block序列,除了最后一个 block,所有的 block都是同 样的大小。文件的所有 block为了容错都会被复制。每个文件的 block大小和 replication因子都是可配置的。 Replication因子可 以在文件创建的时候配置,以后也可以改变。 HDFS中的文件是 write-one,并且严格要求在任何时候只有一个 writer。 Namenode全权管 理 block的复制,它周期性地从集群中的每个 Datanode接收心跳包和一个 Blockreport。心跳包的接收表示该 Datanode节点正常工 作,而 Blockreport包括了该 Datanode上所有的 block组成的列表。 1、副本的存放,副本的存放是 HDFS可靠性和性能的关键。 HDFS采用一种称为 rack-aware的策略来改进数据的可靠性、有效性和网络带宽的利 用。这个策略实现的短期目标是验证在生产环境下的表现,观察它的行为,构建测试和研究的基础,以便实现更先进的策略。庞大的 HDFS实例一般运行在多个机 架的计算机形成的集群上,不同机架间的两台机器的通讯需要通过交换机,显然通常情况下,同一个机架内的两个节点间的带宽会比不同机架间的两台机器的带宽 大。 通过一个称为 Rack Awareness的过程, Namenode决定了每个 Datanode所属的 rack id。一个简单但没有优化的策略就是将副本存放在单独的机架上。这样可以防止整个机架(非副本存放)失效的情况,并且允许读数据的时候可以从多个机架读 取。这个简单策略设置可以将副本分布在集群中,有利于组件失败情况下的负载均衡。但是,这个简单策略加大了写的代价,因为一个写操作需要传输 block到 多个机架。 在大多数情况下, replication因子是 3, HDFS的存放策略是将一个副本存放在本地机架上的节点,一个副本放在同一机架上的另一个节点,最后一 个副本放在不同机架上的一个节点。机架的错误远远比节点的错误少,这个策略不会影响到数据的可靠性和有效性。三分之一的副本在一个节点上,三分之二在一个 机架上,其他保存在剩下的机架中,这一策略改进了写的性能。 2、副本的选择,为了降低整体的带宽消耗和读延时, HDFS会尽量让 reader读最近的副本。如果在 reader的同一个机架上有一个副本,那么就读该副本。如果一个 HDFS集群跨越多个数据中心,那么 reader也将首先尝试读本地数据中心的副本。 3、 SafeMode Namenode启动后会进入一个称为 SafeMode的特殊状态,处在这个状态的 Namenode是不会进行数据块的复制的。 Namenode从所有的 Datanode接收心跳包和 Blockreport。 Blockreport包括了某个 Datanode所有的数据块列表。每个 block都有指定的最 小数目的副本。当 Namenode检测确认某个 Datanode的数据块副本的最小数目,那么该 Datanode就会被认为是安全的;如果一定百分比(这 个参数可配置)的数据块检测确认是安全的,那么 Namenode将退出 SafeMode状态,接下来它会确定还有哪些数据块的副本没有达到指定数目,并将 这些 block复制到其他 Datanode。 五、文件系统元数据的持久化 Namenode存储 HDFS的元数据。对于任何对文件元数据产生修改的操作, Namenode都使用一个称为 Editlog的事务日志记录下来。例如, 在 HDFS中创建一个文件, Namenode就会在 Editlog中插入一条记录来表示;同样,修改文件的 replication因子也将往 Editlog插入一条记录。 Namenode在本地 OS的文件系统中存储这个 Editlog。整个文件系统的 namespace,包括 block到文件 的映射、文件的属性,都存储在称为 FsImage的文件中,这个文件也是放在 Namenode所在系统的文件系统上。 Namenode在内存中保存着整个文件系统 namespace和文件 Blockmap的映像。这个关键的元数据设计得很紧凑,因而一个带有 4G内存的 Namenode足够支撑海量的文件和目录。当 Namenode启动时,它从硬盘中读取 Editlog和 FsImage,将所有 Editlog中的事务作 用( apply)在内存中的 FsImage ,并将这个新版本的 FsImage从内存中 flush到硬盘上 ,然后再 truncate这个旧的 Editlog,因为这个旧的 Editlog的事务都已经 作用在 FsImage上了。这个过程称为 checkpoint。在当前实现中, checkpoint只发生在 Namenode启动时,在不久的将来我们将 实现支持周期性的 checkpoint。 Datanode并不知道关于文件的任何东西,除了将文件中的数据保存在本地的文件系统上。它把每个 HDFS数据块存储在本地文件系统上隔离的文件中。 Datanode并不在同一个目录创建所有的文件,相反,它用启发式地方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录创建 所有的文件不是最优的选择,因为本地文件系统可能无法高效地在单一目录中支持大量的文件。当一个 Datanode启动时,它扫描本地文件系统,对这些本地 文件产生相应的一个所有 HDFS数据块的列表,然后发送报告到 Namenode,这个报告就是 Blockreport。 六、通讯协议 所有的 HDFS通讯协议都是构建在 TCP/IP协议上。客户端通过一个可配置的端口连接到 Namenode,通过 ClientProtocol与 Namenode交互。而 Datanode是使用 DatanodeProtocol与 Namenode交互。从 ClientProtocol和 Datanodeprotocol抽象出一个远程调用 (RPC),在设计上, Namenode不会主动发起 RPC,而是是响应来自客户端和 Datanode 的 RPC请求。 七、健壮性 HDFS的主要目标就是实现在失败情况下的数据存储可靠性。常见的三种失败: Namenode failures, Datanode failures和网络分割( network partitions)。 1、硬盘数据错误、心跳检测和重新复制 每个 Datanode节点都向 Namenode周期性地发送心跳包。网络切割可能导致一部分 Datanode跟 Namenode失去联系。 Namenode通过心跳包的缺失检测到这一情况,并将这些 Datanode标记为 dead,不会将新的 IO请求发给它们。寄存在 dead Datanode上的任何数据将不再有效。 Datanode的死亡可能引起一些 block的副本数目低于指定值, Namenode不断地跟踪需要复制的 block,在任何需要的情况下启动复制。在下列情况可能需要重新复制:某个 Datanode节点失效,某个副本遭到损坏, Datanode上的硬盘错 误,或者文件的 replication因子增大。 2、集群均衡 HDFS支持数据的均衡计划,如果某个 Datanode节点上的空闲空间低于特定的临界点,那么就会启动一个计划自动地将数据从一个 Datanode搬移 到空闲的 Datanode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并分布到集群中以满足应用的要求。这些均衡计划目前 还没有实现。 3、数据完整性 从某个 Datanode获取的数据块有可能是损坏的,这个损坏可能是由于 Datanode的存储设备错误、网络错误或者软件 bug造成的。 HDFS客户端 软件实现了 HDFS文件内容的校验和。当某个客户端创建一个新的 HDFS文件,会计算这个文件每个 block的校验和,并作为一个单独的隐藏文件保存这些 校验和在同一个 HDFS namespace下。当客户端检索文件内容,它会确认从 Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择 从其他 Datanode获取该 block的副本。 4、元数据磁盘错误 FsImage和 Editlog是 HDFS的核心数据结构。这些文件如果损坏了,整个 HDFS实例都将失效。因而, Namenode可以配置成支持维护多 个 FsImage和 Editlog的拷贝。任何对 FsImage或者 Editlog的修改,都将同步到它们的副本上。这个同步操作可能会降低 Namenode每秒能支持处理的 namespace事务。这个代价是可以接受的,因为 HDFS是数据密集的,而非元数据密集。当 Namenode重启的 时候,它总是选取最近的一致的 FsImage和 Editlog使用。 Namenode在 HDFS是单点存在,如果 Namenode所在的机器错误,手工的干预是必须的。目前,在另一台机器上重启因故障而停止服务的 Namenode这个功能还没实现。 5、快照 快照支持某个时间的数据拷贝,当 HDFS数据损坏的时候,可以恢复到过去一个已知正确的时间点。 HDFS目前还不支持快照功能。 八、数据组织 1、数据块 兼容 HDFS的应用都是处理大数据集合的。这些应用都是写数据一次,读却是一次到多次,并且读的速度要满足流式读。 HDFS支持文件的 write- once-read-many语义。一个典型的 block大小是 64MB,因而,文件总是按照 64M切分成 chunk,每个 chunk存储于不同的 Datanode 2、步骤 某个客户端创建文件的请求其实并没有立即发给 Namenode,事实上, HDFS客户端会将文件数据缓存到本地的一个临时文件。应用的写被透明地重定向到 这个临时文件。当这个临时文件累积的数据超过一个 block的大小(默认 64M),客户端才会联系 Namenode。 Namenode将文件名插入文件系 统的层次结构中,并且分配一个数据块给它,然后返回 Datanode的标识符和目标数据块给客户端。客户端将本地临时文件 flush到指定的 Datanode上。当文件关闭时,在临时文件中剩余的没有 flush的数据也会传输到指定的 Datanode,然后客户端告诉 Namenode文件已经 关闭。此时 Namenode才将文件创建操作提交到持久存储。如果 Namenode在文件关闭前挂了,该文件将丢失。 上述方法是对通过对 HDFS上运行的目标应用认真考虑的结果。如果不采用客户端缓存,由于网络速度和网络堵塞会对吞估量造成比较大的影响。 3、流水线复制 当某个客户端向 HDFS文件写数据的时候,一开始是写入本地临时文件,假设该文件的 replication因子设置为 3,那么客户端会从 Namenode 获取一张 Datanode列表来存放副本。然后客户端开始向第一个 Datanode传输数据,第一个 Datanode一小部分一小部分( 4kb)地接收数 据,将每个部分写入本地仓库,并且同时传输该部分到第二个 Datanode节点。第二个 Datanode也是这样,边收边传,一小部分一小部分地收,存储 在本地仓库,同时传给第三个 Datanode,第三个 Datanode就仅仅是接收并存储了。这就是流水线式的复制。 九、可访问性 HDFS给应用提供了多种访问方式,可以通过 DFSShell通过命令行与 HDFS数据进行交互,可以通过 java API调用,也可以通过 C语言的封装 API访问,并且提供了浏览器访问的方式。正在开发通过 WebDav协议访问的方式。具体使用参考文档。 十、空间的回收 1、文件的删除和恢复 用户或者应用删除某个文件,这个文件并没有立刻从 HDFS中删除。相反, HDFS将这个文件重命名,并转移到 /trash目录。当文件还在 /trash目 录时,该文件可以被迅速地恢复。文件在 /trash中保存的时间是可配置的,当超过这个时间, Namenode就会将该文件从 namespace中删除。 文件的删除,也将释放关联该文件的数据块。注意到,在文件被用户删除和 HDFS空闲空间的增加之间会有一个等待时间延迟。 当被删除的文件还保留在 /trash目录中的时候,如果用户想恢复这个文件,可以检索浏览 /trash目录并检索该文件。 /trash目录仅仅保存被删除 文件的最近一次拷贝。 /trash目录与其他文件目录没有什么不同,除了一点: HDFS在该目录上应用了一个特殊的策略来自动删除文件,目前的默认策略是 删除保留超过 6小时的文件,这个策略以后会定义成可配置的接口。 2、 Replication因子的减小 当某个文件的 replication因子减小, Namenode会选择要删除的过剩的副本。下次心跳检测就将该信息传递给 Datanode, Datanode就会移除相应的 block并释放空间,同样,在调用 setReplication方法和集群中的空闲空间增加之间会有一个时间延迟。 参考资料: HDFS Java API: http://hadoop.apache.org/core/docs/current/api/ HDFS source code: http://hadoop.apache.org/core/version_control.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册