首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

HBase学习总结(5):HBase表设计

一、如何开始模式设计 当我们说到模式(schema),要考虑以下内容: (1)这个表应该有多少个列族? (2)列族使用什么数据? (3)每个列族应该有多少列? (4)列名应该是什么?(尽管列名不必在建表时定义,但是读写数据时是需要知道的。) (5)单元存放什么数据? (6)每个单元存储多少个时间版本? (7)行键结构是什么?应该包括什么信息? 1.问题建模 一个特定列族的所有数据在HDFS上会有一个物理存储。这个物理存储可能由多个HFile组成,理想情况下可以通过合并得到一个HFile。一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。这也是HBase被称为面向列族的存储(column-family-oriented store)的原因。 在模式设计流程中尽早定义访问模式,以便通过它们检验你的设计决定。 为了定义访问模式,第一步最好定义想使用表来回答什么问题。 2.需求定义:提前多做准备工作总是有好处的 列限定符可以按数据处理,就像值。这和关系型系统不同,关系型系统的列名是固定的并且需要在建表时预先定义。 HBase没有跨行事务的概念,要避开在客户端代码里需要事务逻辑的设计,因为这会让你不得不维护复杂的客户端。 3.均衡分布数据和负载的建模方法 HBase的运算速度涉及很多考量因素。具体包括: (1)表中KeyValue条目数量(包括put的结果和delete留下的墓碑标记)。 (2)HFile里数据块(HFile block)的数量。 (3)平均一个HFile里KeyValue条目的数量。 (4)每行里列的平均数量。 e代表任何指定时间在MemStore里的条目数量,因为MemStore是使用跳表(skip list)实现的,所以查找行的时间复杂度是O(log e)。 宽表(wide table)的一行包括很多列。高表(tall table)是一种新模式,HFile里的KeyValue对象存储列族名字,使用短的列族名字在减少硬盘和网络I/O方面很有帮助。 HBase语境中的热点指的是负载极度集中在一小部分region上。因为负载没有分散在整个集群上,这是不合理的。服务这些region的几台机器承担了绝大部分工作,将成为整体性能的瓶颈。 4.目标数据访问 HBase表里只有键(KeyValue对象的Key部分,包括行键、列限定符和时间戳)可以建立索引。访问一个特定行的唯一办法是通过行键。 在列限定符和时间戳上建立索引,可以让你在一行上不用扫描前面所有的列而直接跳到正确的列。 从表中获取数据有两种方式,即get和scan。如果需要一行,可以使用get调用,这种情况下必须提供行键;如果想执行一次扫描(scan),如果知道起始和停止键,可以选择使用它们来限制扫描器对象扫描的行数。 根据指定的键的某个部分,可以限制读取硬盘的数据量或者网络传输的数据量。指定行键则只返回需要的行,但是服务器返回整行给客户端。指定列族让你进一步限制读取行的什么部分,因为如果行键跨多个列族,可以只读取HFile的一个子集。进一步指定列限定符和时间戳,可以让你减少返回客户端的列数,因此节省了网络I/O。 把数据放入单元值和把它放入列限定符或行键将占用相同的存储空间,但是把数据从单元移到行键将可能得到更好的性能。 一些基础知识: (1) HBase表很灵活,可以用字符数组形式存储任何东西。 (2) 在同一列族里存储相似访问模式的所有数据。 (3) 索引建立在KeyValue对象的Key部分上,Key由行键、列限定符和时间戳按次序组成。 (4) 高表可能支持你把运算复杂度降到O(1),但是要在原子性上付出代价。 (5) 设计HBase模式时进行反规范化处理是一种可行的办法。 (6) 想想如何能够在单个API调用里而不是多个API调用里完成访问模式。HBase不支持跨行事务,要避免在客户端代码里维护这种复杂的逻辑。 (7) 散列支持定长键和更好的数据分布,但是失去了排序的好处。 (8) 列限定符可以用来存储数据,就像单元一样。 (9) 因为可以把数据放入列限定符,所以它的长度影响存储空间。当访问数据时,它也影响了硬盘和网络I/O的开销,所以尽量简练。 (10) 列族名字的长度影响了通过网络传回客户端的数据大小(在KeyValue对象里),所以尽量简练。 二、反规范化 规范化是关系型数据库世界的一种技术,其中每种重复信息都会放进一个自己的表。这有两个好处:当发生更新或删除时,不用担心更新指定数据所有副本的复杂性;通过保存单一副本而不是多个副本,减少了占用的存储空间。需要查询时,在SQL语句里使用JOIN子句重新联结这个数据。 反规范化是一个相反概念。数据是重复的,存在多个地方。因为你不再需要开销很大的JOIN子句,这使得查询数据变得更容易、更快。 从性能观点看,规范化为写做优化,而反规范化为读做优化。 三、相同表里的混杂数据 尽可能分离不同的访问模式。 四、行键设计原则 在设计HBase表时,行键是唯一重要的事情,应该基于预期的访问模式来为行键建模。 行键决定了访问HBase表时可以得到的性能。这个结论根植于两个事实:region基于行键为一个区间的行提供服务,并且负责区间内每一行;HFile在硬盘上存储有序的行。当region刷写留在内存里的行时生成了HFile。这些行已经排过序,也会有序地刷写到硬盘上。HBase表的有序特性和底层存储格式可以让你根据如何设计行键以及把什么放入列限定符来推理其性能表现。 关系型数据库可以在多个列上建立索引,但HBase只能在键上建立索引,访问数据的唯一办法是使用行键。如果不知道想访问的数据的行键,就必须扫描相当多的行。 五、I/O考虑 以下技巧针对访问模式对设计行键进行优化。 1.为写优化 应该如何把数据分散在多个region上呢? (1)散列 如果你愿意在行键里放弃时间戳信息,使用原始数据的散列值作为行键是一种可能的解决方案。 散列算法有一个非零碰撞概率。使用散列函数的方式也很重要。 (2)salting 在思考行键的构成时,salting是一种技巧。 2.为读优化 尽量把较少的HFile数据块读入内存,来获得要寻找的数据集。因为数据存储在一起,每次读取HFile数据块时可以比数据分散存储时得到更多的信息。 这里行键的结构对于读性能很重要。 3.基数和行键结构 有效的行键设计不仅要考虑把什么放入行键中,而且要考虑它们在行键里的位置。 信息在行键里的位置和选择放入什么信息同等重要。 六、从关系型到非关系型 从关系型数据库知识映射到HBase没有捷径,它们是不同的思考方式。 关系型数据库和HBase是不同的系统,它们拥有不同的设计特性,可以影响到应用系统的设计。 1.一些基本概念 关系型数据库建模包括3个主要概念: a.实体(entity)—映射到表(table)。 b.属性(attribute)—映射到列(column)。 c.联系(relationship)—映射到外键(foreign-key)。 (1)实体 在关系型数据库和HBase中,实体的容器(container)是表,表中每行代表实体的一个实例。用户表中每行代表一个用户。 (2)属性 为了把属性映射到HBase,必须区分至少两种属性类型: a.识别属性(identifying attribute):这种属性可以唯一地精确识别出实体的一个实例(也就是一行)。关系型表里,这种属性构成表的主键(primary key)。在HBase中,这种属性成为行键(rowkey)的一部分。 一个实体经常是由多个属性识别出来的,这一点正好映射到关系型数据库里的复合键(compound keys)概念。 b.非识别属性(non-identifying attribute):在HBase中,它们基本映射到列限定符。 (3)联系 逻辑关系模型使用两种主要联系:一对多和多对多。在关系型数据库中,把前者直接建模为外键(foreign key),把后者建模为连接表(junction table)。 HBase没有内建的联结(join)或约束(constrain),几乎不使用显示联系。 2.嵌套实体 HBase的列(也叫做列限定符)不需要在设计时预先定义。它们可以是任何东西。HBase具有在一个父实体或主实体的行里嵌套另一个实体的能力,但这远远不是一个灵活的模式行(flexible schema row)。 嵌套的实体是从关系型映射到非关系型的又一个工具。 如果你得到子实体的唯一方法是通过父实体,并且你希望在一个父实体的所有子实体上有事务级保护,这种技术是最正确的选择。 七、列族高级配置 1.可配置的数据块大小 HFile数据块大小可以在列族层次设置。数据块索引存储每个HFile数据块的起始键。数据块大小配置会影响数据块索引的大小。数据块越小,索引越大,因而占用的内存空间越大。同时,因为加载进内存的数据块更小,随机查找性能更好。 2.数据块缓存 把数据放进读缓存,但工作负载却经常不能从中获得性能提升。 3.激进缓存 可以选择一些列族,赋予它们在数据块缓存里有更高的优先级(LRU缓存)。 4.布隆过滤器 布隆过滤器允许对存储在每个数据块的数据做一个反向测试。当某行被请求时,先检查布隆过滤器,看看该行是否不在这个数据块中。 5.生存时间(TTL) HBase可以让你在数秒内在列族级设置一个TTL,早于指定TTL值的数据在下一次大合并时会被删除。如果你在同一单元上有多个时间版本,早于设定TTL的版本会被删除。 6.压缩 HFile可以被压缩并存放在HDFS上,HBase可以使用多种压缩编码,包括LZO、Snappy和GZIP。 注意,数据只在硬盘上是压缩的,在内存里或通过网络传输时是没有压缩的。 7.单元时间版本 在默认情况下,HBase每个单元维护3个时间版本,这个属性是可以设置的。 同时也可以指定列族存储的最少时间版本数。 八、过滤数据 过滤器也被称为下推判断器,支持你把数据过滤标准从客户端下推到服务器。 较为常用的过滤器包括: 1.行过滤器 这是一种预装的比较过滤器,支持基于行键过滤数据。 2.前缀过滤器 这是行过滤器的一种特例,它基于行键的前缀值进行过滤。 3.限定符过滤器 它是一种类似于行过滤器的比较过滤器,不同之处是它用来匹配列限定符而不是行键。它使用与行过滤器相同的比较运算符和比较器类型。 4.值过滤器 它提供了与行过滤器或限定符过滤器一样的功能,只是针对的是单元值。 5.时间戳过滤器 它允许针对返回给客户端的时间版本进行更细粒度的控制。 6.过滤器列表 组合使用多个过滤器经常是很有用的。 九、小结 模式设计的出发点是问题,而不是关系。 模式设计永远不会结束。 数据规模是第一本质性的因素。 每个维度都是一个提升性能的机会。 本人微信公众号:zhouzxi,请扫描以下二维码:

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

Riak学习(3):Riak对比HBase(转)

文章转自:http://blog.nosqlfan.com/html/4081.html 文章来自Riak官方wiki,是一篇Riak与HBase的对比文章。Riak官方的对比通常都做得很中肯,并不刻意偏向自家产品。本文也是一样。 对比的Riak版本是1.1.x,HBase是0.94.x。 大方面对比 Riak 与 HBase 都是基于Apache 2.0 licensed 发布 Riak 的实现是基于Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable Riak 主要用 Erlang 写成,包括一部分的C,而 HBase 是用 Java 写的。 功能性对比 功能点 Riak HBase 数据模型 Riak 通过bucket作为命名空间,存储 Key-Value 信息 Buckets, Keys, and Values HBase 按预先定义好的 column family 结构来存储数据(每一条数据有一个key以及若干个列属性值组成,每列的数据都有自己的版本信息)。HBase 中的数据是按列进行有序存储的(不像关系型数据库中按行存储)。 HBase Data Model Supported Data Types 存储引擎 Riak 采用模块化的思想,将存储层作为引擎挂到系统上。你可以根据自己的需要选择不同的存储引擎。 Riak 支持的存储引擎 你也可以甚至 Riak 的backend API实现你自己的存储引擎。 HBase 是存在于 HDFS之上的,其数据文件存在HDFS中。与BigTable 类似,数据存储分为内存中的MemStore 和落地存储的 StoreFiles。其数据文件称为HFile,基于BigTable 的SSTable。可以直接使用JVM的 文件系统IO操作来对数据文件进行操作。 HDFS Hadoop Uses HDFS 数据访问接口 除了直接使用 Erlang 之外,Riak 还提供了两种数据访问接口,REST方式和 Protocol Buffer : HTTP Protocol Buffers Riak 的客户端都是基于上面的API来实现,目前对主流的语言支持很好。 Client-Libraries Community Developed Libraries and Projects HBase 的操作主要通过在JVM中直接执行代码。HBase 也提供了外部数据访问方式,包括REST方式以及Thrift协议的访问。 Java Interface REST Thrift 数据操作方式 Riak中支持下面四种方式的操作 对主键进行直接操作(GET,PUT,DELETE,UPDATE) MapReduce 方式 Riak 还提供 Secondary Indexes Riak Search 插件 上面几种方式的对比文章 HBase 有两种方式的数据操作,通过对有序key值进行扫描查询,获取value值,或者借助强大的Hadoop来进行MapReduce查询 Scanning MapReduce Secondary Indexes 数据一致性问题 Riak 通过 vector clock的方式来维护数据版本,处理不一致的情况。同时你也可以不使用vector clock,而是采用基于时间戳的 “last-write-wins” 策略 Vector Clocks Why Vector Clocks Are Easy Why Vector Clocks Are Hard HBase 采用了强一致性的读写保证。数据会在多个不同的region中进行保存。Column families 可以包含无限多个数据版本,每个版本可以有自己的TTL Consistent Architecture Time to Live 并发 Riak 集群中的所有节点都能同时进行读写操作,Riak只负责进行数据的写入操作(基于vector clock进行带版本控制的保存),在数据读取的时候再来定义数据冲突的处理逻辑。 HBase 通过行级锁来保证写操作的原子性,但是不支持多行写操作的事务性。数据扫描操作不保证一致性。 Consistency Guarantees 复制 Riak 的数据复制系统的理论来源主要是Dynamo 的论文和 Eric Brewer 博士的CAP 理论。Riak 采用一致性hash对数据进行分片,同一份数据会在多个节点中保存备份。在一致性hash的理论支持下,Riak采用的是虚拟节点的方式来实现数据的复制并进行数据平衡分配的保证。引入虚拟节点使得数据与实际节点间能够保持松耦合 Replication Clustering Riak 的API 提供在一致性和可用性之间的自由选择,你可以根据自己的应用场景选择不同策略。在最初存储数据到Riak中时,可以按bucket为单位进行复制方式的配置。在后续的读写操作中,每次都能够再进行复制份数的设置。 Reading, Writing, and Updating Data HBase 是典型的最终一致性实现,数据复制通过 master向slave的推送来实现。最近HBase也添加了master-master 的实现。 Replication 扩展性 Riak 支持动态添加我删除节点,所有节点都对等,不存在主从的区别。当向Riak 中添加一个节点后,集群会通过gossiping 发现节点并分配对应的数据范围并进行数据迁移。移除节点的过程相反。Riak提供了一系列工具来完成节点的增删操作。 Adding and Removing Nodes Command Line Tools HBase 以regions为单位进行分片,region会分裂和合并,并自动在多个节点间分配。Regions Node Management HBase Architecture 多数据中心的数据同步 只有Riak的企业版才支持多数据中心的部署方案,通常用户仅支持单数据中心的部署。 Riak Enterprise HBase通过region来进行分片,天然就支持多数据中心的部署。 Node Management 图形化的监控管理工具 从Riak 1.1.x 开始,Riak 发布了 Riak Control,这是一个针对Riak的开源的图形化管理工具。 Riak Control Introducing Riak Control HBase 有一些开源社区开发的图形化工具,同时也有一个命令行的控制终端能用。 Admin Console Tools Eclipse Dev Plugin HBase Manager GUI Admin 来源:wiki.basho.com

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

Hadoop概念学习系列之hadoop Java API、 hadoop Streaming 、hadoop Pipes 三者比较学习(十九...

1、hadoop Java API Hadoop的主要编程语言是Java,因而,Java API是最基本的对外编程接口。 2、hadoop Streaming 1、概述 它是为方便非java用户编写Mapreduce程序而设计的工具包。 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer, 例如: 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer) $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper cat \ -reducer wc 2、Hadoop Streaming原理 mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。 如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。 默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。 对于reducer,类似。 以上是Map/Reduce框架和streaming mapper/reducer之间的基本通信协议。 3、Hadoop Streaming用法 Usage: $HADOOP_HOME/bin/hadoop jar \ $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar [options] options: (1)-input:输入文件路径 (2)-output:输出文件路径 (3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本 (4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本 (5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。 (6)-partitioner:用户自定义的partitioner程序 (7)-combiner:用户自定义的combiner程序(必须用java实现) (8)-D:作业的一些属性(以前用的是-jonconf),具体有: 1)mapred.map.tasks:map task数目 2)mapred.reduce.tasks:reduce task数目 3)stream.map.input.field.separator/stream.map.output.field.separator: map task输入/输出数 据的分隔符,默认均为\t。 4)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目 5)stream.reduce.input.field.separator/stream.reduce.output.field.separator:reduce task输入/输出数据的分隔符,默认均为\t。 6)stream.num.reduce.output.key.fields:指定reduce task输出记录中key所占的域数目 另外,Hadoop本身还自带一些好用的Mapper和Reducer: (1) Hadoop聚集功能 Aggregate提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(例如“sum”,“max”,“min”等)用于聚合一组value的序列。用户可以使用Aggregate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。Combiner/reducer利用适当的聚合器聚合这些可聚合项。要使用Aggregate,只需指定“-reducer aggregate”。 (2)字段的选取(类似于Unix中的‘cut’) Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduc帮助用户高效处理文本数据,就像unix中的“cut”工具。工具类中的map函数把输入的key/value对看作字段的列表。 用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。 同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。 关于Hadoop Streaming高级编程方法,可参考这篇文章:Hadoop Streaming高级编程,Hadoop编程实例。 3、hadoop Pipes 它是为方便C/C++用户编写Mapreduce程序而设计的工具包。 Hadoop pipes允许C++程序员编写mapreduce程序,它允许用户混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五个组件。 1. 什么是Hadoop pipes? Hadoop pipes允许用户使用C++语言进行MapReduce程序设计。它采用的主要方法是将应用逻辑相关的C++代码放在单独的进程中,然后通过Socket让Java代码与C++代码通信。从很大程度上说,这种方法类似于Hadoop Streaming,不同之处是通信方式不同:一个是标准输入输出,另一个是socket。 org.apache.hadoop.mapred.pipes.Submitter包中有一个public static方法用于提交作业,该方法将作业封装成一个JobConf对象和一个main方法(接收一个应用程序,可选的配置文件,输入目录和输出目录等),main方法的CLI(Client Line Interface)如下: bin/hadoop pipes \ [-input inputDir] \ #输入数据目录 [-output outputDir] \ #输出数据目录 [-jar applicationJarFile] \ #应用程序jar包 [-inputformat class ] \ #Java版的InputFormat [-map class ] \ #Java版的Mapper [-partitioner class ] \#Java版的Partitioner [-reduce class ] \#Java版的Reducer [-writer class ] \ #Java版的 RecordWriter [-program program url] \ #C++可执行程序 [-conf configuration file] \#xml配置文件 [-D property=value] \ #配置JobConf属性 [-fs local|namenode:port] \#配置namenode [-jt local|jobtracker:port] \#配置jobtracker [-files comma separated list of files] \ #已经上传文件到HDFS中的文件,它们可以像在本地一样打开 [-libjars comma separated list of jars] \#要添加到classpath 中的jar包 [-archives comma separated list of archives]#已经上传到HDFS中的jar文件,可以 在程序中直接使用 本文主要介绍了Hadoop pipes的设计原理,包括设计架构,设计细节等。 2. Hadoop pipes设计架构 用户通过bin/hadoop pipes将作业提交到org.apache.hadoop.mapred.pipes中的Submmit类,它首先会进行作业参数配置(调用函数setupPipesJob),然后通过JobClient(conf).submitJob(conf)将作业提交到Hadoop集群中。 在函数setupPipesJob中,Java代码会使用ServerScoket创建服务器对象,然后通过ProcessBuilder执行C++binary, C++binary实际上是一个Socket client,它从Java server中接收key/value数据,经过处理(map,partition或者reduce等)后,返还给Java server,并由Java Server将数据写到HDFS或者磁盘。 3. Hadoop pipes设计细节 Hadoop pipes允许用户用C++编写五个基本组件:mapper,reducer,partitioner,combiner,recordReader,这五个组件可以是Java编写的,也可以是C++编写的,下面分别介绍这几个函数的执行过程。 (1) mapper Pipes会根据用户的配置定制InputFormat,如果用户要使用Java的InputFormat(hadoop.pipes.java.recordreader=true),则Hadoop会使用户输入的InputFormat(默认为TextInputFormat);如果用户使用C++的InputFormat,则Pipes Java端的代码会读取每个InputSplit,并调用downlink.runMap(reporter.getInputSplit(), job.getNumReduceTasks(), isJavaInput);通过socket传输给C++端的runMap(string _inputSplit, int _numReduces, bool pipedInput)函数。 在C++端,RecordReader会解析整个InputSplit,获取数据来源(主要是文件路径)和每个key/value对,并交给map函数处理,map将每个key/value的处理结果通过emit(const string& key, const string& value)函数返还给Java Server。 (2) paritioner C++端处理完的结果会通过emit(const string& key, const string& value)函数传给Java Server,以便将数据写到磁盘上。在emit函数中,如果用户定义了自己的paritioner,则Pipes会通过该函数判断当前key/value将给哪个reduce task处理,并调用partitionedOutput(int reduce, const string& key,const string& value)函数将key/value传递给相应的reduce task。 (3) reducer reducer的执行过程与mapper基本一致。 4. 总结 Hadoop pipes给C++程序员提供了一个编写MapReduce作业的方案,它使用socket让Java和C++之间进行通信,这类似于thrift RPC的原理,也许Hadoop Pipes用thrift编写会更加简单。 Hadoop pipes使用Java代码从HDFS上读写数据,并将处理逻辑封装到C++中,数据会通过socket从Java传输给C++,这虽然增加了数据传输的代价,但对于计算密集型的作业,其性能也许会有改进。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5449082.html,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册