大数据面试题之HBase(2)

发布于:2024-06-29 ⋅ 阅读:(59) ⋅ 点赞:(0)

目录

列式数据库的适用场景和优势?列式存储的特点? 

HBase的rowkey设计原则 

HBase的rowkey为什么不能超过一定的长度?为什么要唯一?rowkey太长会影响Hfile的存储是吧? 

HBase的RowKey设置讲究有什么原因 

HBase的大合并、小合并是什么? 

HBase和关系型数据库(传统数据库)的区别(优点)? 

HBase数据结构 

HBase为什么随机查询很快? 

HBase的LSM结构 

HBase的Get和Scan的区别和联系? 

HBase数据的存储结构(底层存储结构) 

HBase数据compact流程? 


列式数据库的适用场景和优势?列式存储的特点? 

列式数据库的适用场景主要包括:

1、数据仓库:适合执行大容量数据加载和复杂查询分析,列式存储通过仅加载查询所需列来减少I/O操作和内存使用,提高查询性能。
2、数据分析:在大数据分析场景中,列式存储能够显著加速数据处理速度,特别是在执行聚合操作或涉及大量数据筛选的查询时。
3、实时数据处理:适用于实时流处理和数据挖掘,因为数据按列处理,可以高效地处理和分析连续的数据流。
4、高性能计算:在科学计算、金融计算和图形处理等需要高效数据访问和计算的领域,列式存储能够减少数据访问时间,提升计算速度。
5、NoSQL数据库:特别适合于分布式数据库环境,如Apache Cassandra、HBase等,有助于提高数据压缩率和查询性能。

列式存储的特点包括:
1、高效查询性能:仅需读取查询所涉及到的列,而非整行数据,大大减少了I/O操作和内存占用。
2、高数据压缩比:由于同一列的数据类型相同,可以使用高效压缩算法,减少存储空间需求。
3、优化的计算效率:数据按列存储,便于对某一列数据进行并行处理和矢量化运算。
4、自动索引化:查询中的选择规则通常依据列来定义,列式存储天然适合这种模式,减少了索引管理的复杂度。
5、适应大规模数据:在处理PB级别的数据时,列式存储能够有效提高数据处理和分析的效率。

列式数据库的优势在于:
1、降低存储成本:通过高效的数据压缩,减少存储需求。
2、提升查询速度:仅加载必要的列,减少I/O操作,加快查询响应时间。
3、高效分析能力:对于分析型查询,能够并行处理列数据,加速数据聚合和统计操作。
4、扩展性:易于水平扩展,以应对不断增长的数据量和查询需求。
5、资源优化:在内存中高效组装数据,提升缓存效率,减少计算资源消耗。

HBase的rowkey设计原则 

HBase的RowKey设计是其性能和效率的关键因素之一,良好的RowKey设计应当遵循以下原则:

1、唯一性:
RowKey必须在表中具有唯一性,因为HBase使用RowKey作为数据的主键。如果有重复的RowKey,后续的写入操作可能会覆盖之前的数据
(尤其是在版本数量设置为1的情况下)。
2、长度原则:
RowKey的长度建议控制在较短范围内,尽管理论上限为64KB,但实际上推荐长度为10到100字节,甚至有建议尽量不超过16字节。较短的
RowKey可以减少存储空间的消耗,提高数据的存储和访问效率。
3、散列原则:
如果RowKey设计中包含时间戳或其他可能引起数据热点(如递增ID)的字段,应通过散列或其他技术(如反转、加盐)来分散写入压力,避
免所有新数据集中写入同一RegionServer,从而实现负载均衡。
4、可排序性:
根据业务需求,设计RowKey时可以考虑其自然排序逻辑,以便于范围查询和扫描操作。例如,将时间戳作为RowKey的一部分,并将其置于
合适的位置,可以方便地进行时间序列查询。
5、访问模式匹配:
设计时应考虑数据的访问模式,将经常一起访问的数据尽可能靠近存储,以利用HBase的局部性原理,减少数据读取的I/O开销。
6、预分区:
如果可以预见数据的分布,可以通过预分区来提前规划数据分布,确保数据能够均匀地分布在各个Region中,进一步提升查询效率。
7、易理解性:
尽管RowKey是二进制的,设计时也应考虑其可读性和易于理解,便于管理和排查问题。

综上所述,RowKey设计是一个平衡各种因素的决策过程,需要根据具体的业务需求和查询模式来综合考虑。

HBase的rowkey为什么不能超过一定的长度?为什么要唯一?rowkey太长会影响Hfile的存储是吧?

HBase的RowKey长度不宜过长,主要原因包括:

1、存储效率:RowKey是每条记录的唯一标识符,存储在HFile中。如果RowKey过长,会导致HFile占用更多的存储空间。因为HBase是以
KeyValue的形式存储数据,长RowKey会增加每个KeyValue单元的大小,进而增加HFile的整体大小,影响存储效率。
2、内存利用率:HBase的MemStore会在数据写入磁盘之前,先将数据缓存在内存中。如果RowKey太长,会降低MemStore内存的有效利用
率,因为更少的数据能够被缓存。这可能导致频繁的flush操作,增加了I/O操作,降低了写入性能和检索效率。
3、检索效率:查询操作时,RowKey的长度直接影响检索速度。短RowKey意味着更快的比较和定位速度,尤其是在进行范围查询或者扫描操
作时,较短的RowKey可以更快地定位到目标数据。

至于RowKey为何需要唯一,这是因为:
 1) 数据完整性:RowKey的唯一性是保证数据准确无误的基础。如果RowKey重复,根据HBase的存储机制,后写入的数据可能会覆盖之前
的数据,导致数据丢失或混乱。
2) 一致性:在分布式系统中,唯一性的RowKey简化了数据一致性维护的问题,避免了在多版本控制时可能产生的冲突。

简而言之,RowKey长度的限制主要是为了优化存储空间使用、提高内存和I/O效率,以及确保数据的完整性和一致性。而RowKey的唯一性是
维持数据正确性和一致性的基础要求。

HBase的RowKey设置讲究有什么原因

HBase的RowKey设计之所以讲究,主要基于以下几个核心原因:

1、性能优化:RowKey是数据在HBase中定位的唯一标识,其设计直接影响数据的存储布局、查询效率和整体性能。良好的RowKey设计可以
最小化I/O操作,提升读写速度。
2、数据分布:HBase通过RowKey的字典顺序进行数据分区和分布,决定了数据在Region间的分布情况。设计时需考虑如何均匀分散数据,
避免热点问题,确保负载均衡。
3、查询优化:RowKey决定了数据的物理存储顺序,合理的RowKey设计能够利用这一特性,优化常见查询路径,支持高效的范围查询、点查
询等操作。
4、存储效率:RowKey过长会增加存储开销,包括HFile的大小和MemStore中占用的内存空间,进而影响存储和缓存效率。
5、数据压缩:列式存储和按列族组织数据使得列数据类型统一,利于高效压缩,但RowKey作为每条记录的入口,其长度和结构同样影响到
压缩效果。
6、可扩展性和灵活性:随着数据量的增长,RowKey设计需要考虑未来的数据扩展性,以及对数据模型变化的适应性。
7、唯一性保障:RowKey必须保证全局唯一,避免数据覆盖和冲突,这对于维护数据的一致性和完整性至关重要。

综上所述,RowKey的设计不仅关乎数据的存储和访问效率,还直接关系到整个系统的扩展性、稳定性和运维成本,因此在设计时需要综合考
量业务需求、查询模式、数据增长趋势等多方面因素。

HBase的大合并、小合并是什么?

HBase中的合并操作(Compaction)是维护其存储文件(HFiles)的重要机制,旨在提高读取效率、减少存储空间占用,并确保数据一致
性。HBase的合并分为两大类:小合并(Minor Compaction)和大合并(Major Compaction)。

小合并(Minor Compaction)

 1) 目的:小合并主要是为了减少存储在MemStore中的数据落盘到HFile后的文件碎片问题。它将一个Region内的几个较小的HFile合并
成较大的文件,但不会合并所有的HFile,也不会删除已标记为删除或过期的数据。
 2) 触发条件:小合并通常是自动触发的,当一个Region中的HFile数量达到预设阈值时,或者MemStore数据刷写到磁盘后,为了优化读
取性能,系统会自动执行小合并。
 3) 效果:小合并可以减少查询时需要扫描的文件数量,提升查询效率,同时也有助于控制单个Region的文件数量,避免文件过多导致管理
开销增大。

大合并(Major Compaction)

 1) 目的:大合并则是更为彻底的整理过程,它会将一个Region下的所有HFile(除了那些被删除标记的数据)合并成一个或少数几个大的
HFile,并在此过程中清理掉所有被标记为删除或已过期的数据。
 2) 触发条件:大合并可以手动触发,也可以根据配置的策略自动触发,比如在特定的时间点、当HFile的数量达到某个极值时,或者
HFile占用的空间超过一定的比例时。
 3) 效果:大合并能够显著减少HFile的数量,释放存储空间,提高读取效率。但它也是一个相对耗时且资源密集的操作,可能会影响集群
的写入性能,因此通常在低峰时段安排执行。

总结
小合并和大合并都是为了优化HBase的性能和管理,通过减少文件数量、清理无效数据来提升查询速度和存储效率。小合并更加频繁,注重日
常维护;大合并则更为深入,关注长期的数据整理和空间回收,需要更谨慎地计划执行时机以减少对系统的影响。

HBase和关系型数据库(传统数据库)的区别(优点)?

HBase与关系型数据库(传统数据库)在多个方面存在显著的区别和各自的优势。以下是两者的主要区别和优点:

1、数据模型与存储方式
1) HBase:
数据模型简单,采用列存储方式。
数据存储为未经解释的字符串,支持动态列和列族的设计。
优点:列存储可以降低I/O开销,支持大量并发用户查询,因为仅需要处理与查询相关的列,而不需要处理整行数据。
2) 关系型数据库:
基于关系模型,采用行存储方式。
数据表结构固定,每行包含固定数量的列。
优点:数据结构清晰,易于理解和维护。

2、数据访问与查询
1) HBase:
通过行键和列族快速访问数据。
只有一个索引——行键,查询需要通过行键或行键扫描来完成。
优点:在海量数据存储和实时查询的场景下表现优异,如日志分析、实时监控等。
2) 关系型数据库:
通过SQL查询语句访问数据。
可以针对不同的列构建复杂的多个索引,以提高数据访问性能。
优点:提供了丰富的查询功能和对象(如视图、存储过程、触发器等),方便用户操作数据。

3、数据一致性与扩展性
1) HBase:
采用最终一致性模型,数据的复制和同步需要一定的时间。
具有良好的水平扩展性,可以轻松地扩展到数百台甚至数千台服务器。
优点:适用于大数据和实时分析场景,可以处理大量并发用户查询。
2) 关系型数据库:
通常采用强一致性模型。
需要通过垂直扩展(增加更强大的硬件)来处理更多数据。
优点:在事务处理和复杂查询的场景下表现稳定,如金融系统、人力资源管理等。

4、其他方面
1) HBase:
提供了灵活的列族和列的数据模型,支持动态添加列。
存储空间占用较大,因为需要维护大量的索引和元数据。
适用于海量数据存储和实时查询的场景。
2) 关系型数据库:
提供了丰富的完整性(实体完整性、参照完整性和用户定义的完整性),降低了数据冗余和不一致的概率。
安全性较高,通过权限分配确保数据的安全。
适用于事务处理和复杂查询的场景。

综上所述,HBase和关系型数据库在数据模型、数据访问、一致性、扩展性和适用场景等方面存在显著的区别。用户可以根据自身的需求和场
景选择合适的数据库技术。

HBase数据结构

HBase是一个分布式、列式存储的NoSQL数据库,其数据结构设计独特,以适应大规模数据存储和快速查询的需求。以下是HBase数据结构的核心组成部分:

1、表(Table): HBase中的数据存储在表中,类似于关系型数据库中的表概念。但HBase的表是稀疏的、多维度的,并且设计为面向列族
的存储。
2、行(Row): 每个表由一系列的行组成,每一行由一个唯一的RowKey(行键)标识。RowKey是访问数据的主要方式,也是数据在表中物
理排序的依据。
3、列族(Column Family): 每一行包含一个或多个列族。列族是列的集合,它们共享相同的存储和访问属性。列族在创建表时定义,并
且不可更改。列族的名称是用户定义的字符串,例如 "Info" 或 "Stats"。
4、列限定符(Column Qualifier): 在列族内,每一列都有一个列限定符,它与列族名结合定义了具体的一列。列限定符可以看作是列
名,它们可以动态添加,不需要在创建表时预先定义。
5、时间戳(Timestamp): HBase中的每个单元格(Cell)都包含一个时间戳,用以标记数据的版本。这允许HBase存储同一行、列族、
列限定符下的多个版本的数据,支持数据的多版本并发控制。
6、单元格(Cell): 单元格是最基本的数据存储单元,由{RowKey, Column Family, Column Qualifier, Timestamp}四元组唯
一确定。每个单元格存储一个值(Value)。
7、命名空间(Namespace): HBase支持命名空间的概念,用于逻辑上的表分组。默认有两个命名空间:hbase(用于内部系统表)和
default(用户默认存放表的地方),用户也可以自定义命名空间。
8、Region: 为了实现水平扩展,HBase将表按RowKey的范围划分成多个区域(Region)。每个Region维护着一个表的部分行范围,并且
可以在运行时自动分裂和重新分配到不同的Region服务器(RegionServer)上,以平衡负载。
9、HFile: HFile是HBase底层存储数据的实际文件格式,包含了已经持久化到HDFS上的数据。每个Region由多个HFile组成,这些文件
包含了经过压缩和编码的实际数据。

通过上述结构,HBase能够在大规模数据集上提供高吞吐量的读写操作,尤其适合于需要快速随机访问和大规模数据处理的应用场景。

HBase为什么随机查询很快?

HBase随机查询之所以很快,主要归因于以下几个关键方面:

1、列式存储结构:
HBase采用列式存储的方式,与传统的行式存储不同。列式存储将数据按照列进行组织,同一列的数据存储在一起。
这种存储方式使得在查询时,只需要读取感兴趣的列,而不需要读取整行的数据。因此,可以大大减少查询所需的数据量,提高查询速度。
2、分布式存储:
HBase是一种分布式的数据库,数据按照Region分割存储在多台服务器上。
查询时可以同时从多台服务器中读取数据,充分利用了集群的资源,大大提高了查询的并发性能。
3、基于索引的查询:
HBase支持对行键(rowkey)的索引,可以通过检索行键来快速定位数据。
索引的使用避免了全表扫描和遍历的过程,从而显著提高了查询速度。
4、数据本地化存储:
HBase允许在Region服务器上进行查询操作,从而避免了将数据传输到客户端的开销。
这种数据本地化存储的方式能够大幅度提高查询性能。
5、多级缓存机制:
HBase采用多级缓存机制。当RegionServer接收到查询请求时,首先会检查本地内存中是否有所需数据。
如果有,则直接返回结果,无需从磁盘读取。如果没有,则从磁盘中读取,并将读取到的数据存储到缓存中,以便后续查询。
6、数据分区存储(Region):
HBase通过rowkey将数据划分为多个Region,并存储在不同的Region Server上。
通过rowkey可以快速定位到数据所在的Region,进一步提高了查询效率。
7、存储格式和索引:
HBase使用HFile作为数据存储格式,该格式支持数据的分块存储和索引分块,进一步提高了查询效率。
同时,HBase还支持布隆过滤器(bloom filter)等数据结构,用于快速判断某一行是否存在,进一步加速了数据的查询过程。

综上所述,HBase通过列式存储、分布式存储、基于索引的查询、数据本地化存储、多级缓存机制、数据分区存储以及优化的存储格式和索引
等多种技术和机制,实现了快速的随机查询性能。这些特点使得HBase在处理海量数据和实时查询等场景时表现出色。

HBase的LSM结构

HBase采用了一种称为LSM(Log-Structured Merge Tree,日志结构合并树)的数据存储结构来优化写入性能并管理大量数据。LSM结
构主要包括以下几个关键组件和步骤:

1、MemStore:
MemStore作为列族级别的写缓存存在于每个RegionServer的内存中。当数据被写入HBase时,首先会被存储到MemStore。
MemStore中的数据按照RowKey排序,并在达到一定大小限制后转变为Immutable MemStore。
写操作继续由新的MemStore处理,而Immutable MemStore准备被刷写到磁盘。
2、Flush:
当MemStore达到预设的阈值(如大小限制或时间间隔),会触发Flush操作。
Flush将Immutable MemStore中的数据写入磁盘,生成一个新的HFile。这个过程可以视为LSM树中C0层(内存中的数据结构)刷写到C1
层(磁盘上的SSTable)的过程。
3、SSTable (Sorted String Table):
SSTable是HFile的逻辑表示,它是磁盘上有序、不可变的键值对集合。
每次Flush操作都会生成一个新的SSTable文件,这些文件在磁盘上按RowKey排序并存储实际的数据。
4、Log (Write Ahead Log / HLog):
在数据写入MemStore之前,会先记录到Write Ahead Log(简称WAL,也称为HLog)中,以确保数据的持久化和容错能力。
如果在写入过程中发生故障,可以通过日志恢复数据。
5、Compaction:
随着时间推移,不断有新的SSTable生成,为了保持查询效率和管理磁盘空间,需要进行Compaction操作。
小合并(Minor Compaction)会合并少量SSTable,减少文件数量但不清理删除标记的数据。
大合并(Major Compaction)则会合并一个Region下的所有或大部分SSTable,同时删除被标记为删除或过期的数据,这一步骤会显著
减少文件数量并释放空间,但可能消耗较多资源。

LSM结构通过这种分层的数据存储和定期的合并策略,在保证高写入吞吐量的同时,也维护了数据查询的效率。它通过牺牲一定程度上的读取
效率(相对于读优化的数据结构如B-Tree)来换取更高的写入速度,特别适用于读写比例失衡、写多读少的场景。

HBase的Get和Scan的区别和联系?

HBase中的Get和Scan操作在功能和用途上有所区别,但也有一些联系。以下是关于它们之间区别和联系的详细解释:

区别

1、操作目标:
Get操作:用于获取指定行键(RowKey)的数据。它精确到单个行键,并返回该行键对应的所有列数据(或指定列族和列的数据)。
Scan操作:用于扫描表中的一系列行键,并返回符合指定条件的多行数据。它可以设置起始行键和结束行键的范围来扫描一定范围内的行键,并返回这些行键对应的数据。
2、数据返回量:
Get操作:返回单个行键的数据,数据量相对较小。
Scan操作:可能返回多个符合条件的行键数据,数据量相对较大,需要进行一定的过滤和处理。
3、精确性:
Get操作:具有更高的精确性,只返回指定行键的数据。
Scan操作:可能返回多个符合条件的行键数据,精确性相对较低。
4、使用场景:
Get操作:适合用于读取单个行键的数据,例如根据特定ID查询用户信息等。
Scan操作:适合用于读取一定范围内的行键数据,例如按时间范围查询日志、按条件筛选大量数据等。
5、性能:
Get操作:因为只针对单个行键,所以性能通常较高。
Scan操作:由于可能涉及多个行键和大量数据,性能可能受到一定影响,但可以通过设置缓存大小和批处理大小等参数进行优化。

联系

1、都是读取操作:Get和Scan都是HBase中用于读取数据的操作,它们都是客户端与HBase进行交互的方式。
2、基于行键:无论是Get还是Scan操作,都需要基于行键(RowKey)来进行数据的定位和查询。行键在HBase中扮演着非常重要的角色,
它是数据在HBase中的唯一标识。
3、可配置性:Get和Scan操作都支持一定的配置选项,例如指定要查询的列族、列限定符、时间戳范围等。这些配置选项可以根据具体的查
询需求进行灵活设置。
4、结果处理:无论是Get还是Scan操作,返回的结果都需要进行一定的处理。对于Get操作,返回的是单个行的数据;对于Scan操作,返回
的是一个ResultScanner对象,需要遍历该对象来获取多行数据。

总结来说,HBase中的Get和Scan操作在功能和使用场景上有所区别,但都是基于行键的读取操作。它们各自具有不同的特点和适用场景,
可以根据具体的需求选择合适的操作方式。

HBase数据的存储结构(底层存储结构)

HBase的底层存储结构设计围绕几个核心组件展开,旨在实现高效的数据存储和访问,这些组件协同工作,构成了HBase独特的LSM(Log-
Structured Merge Tree)存储模型。以下是HBase底层存储结构的关键组成部分:

1、MemStore:
MemStore是位于每个RegionServer内存中的缓冲区,用于暂存新写入的数据。数据按列族组织,并且在内存中维持有序。当MemStore达
到预设大小限制时,其内容会被刷写(Flush)到磁盘上。
2、HFile:
数据从MemStore刷写到磁盘时,会形成HFile。HFile是一种基于HDFS的存储格式,它是持久化、已排序的键值对集合,包含了实际存储
在HBase中的数据。HFile是不可变的,这意味着一旦创建,就不会再修改,而是通过Compaction过程来整合和优化。
3、Write Ahead Log (WAL):
在数据写入MemStore之前,HBase会先将其记录到Write Ahead Log(WAL)中,以确保数据的持久性和容错能力。即使在发生故障的情
况下,也可以通过重放WAL来恢复丢失的数据。
4、StoreFile:
刷写到磁盘的MemStore数据会转换为StoreFile,它是HFile的一个实例,属于特定的列族。每个列族在Region中都有自己的Store,包
含一个或多个StoreFile。
5、Compaction:
为了管理不断增长的HFile数量和提升查询效率,HBase会定期执行Compaction操作。Compaction包括Minor Compaction(合并少量
StoreFile)和Major Compaction(合并所有或大多数StoreFile,同时清理删除标记的数据)。这有助于减少文件数量,提高查询性
能,并回收存储空间。
6、Region:
HBase表被水平分割成多个Region,每个Region负责存储一定RowKey范围内的数据。随着数据的增长,Region会自动分裂以保持其大小
在管理范围内。每个Region由一个RegionServer托管。
7、HDFS:
最终,所有的HFile都存储在Hadoop Distributed File System (HDFS)上,HDFS提供了高度可靠的分布式存储基础,保证了数据的
高可用性和容错性。

综上所述,HBase的底层存储结构是一个复杂的层次化系统,结合了内存与磁盘存储、日志记录、数据分片(Region)、以及高效的文件合
并策略,旨在实现大规模数据集上的快速写入和高效读取。

HBase数据compact流程?

HBase的数据compact流程是为了优化存储和查询性能而设计的,主要包括以下几个步骤:

1、触发条件:
Memstore Flush:当Memstore中的数据达到一定的阈值后,会触发flush操作将数据写入到storefile(HFile)中。在flush前后,
HBase会判断是否需要进行compaction操作。
定期检查线程:HBase有一个后台线程会周期性检查是否需要进行compaction操作。这个周期由
hbase.server.thread.wakefrequency、hbase.server.compactchecker.interval.multiplier等参数配置。
手动触发:用户也可以通过HBase Shell或HBase API手动触发compaction操作,特别是在需要物理删除已删除的数据和过期的数据时。
2、HFile文件选取策略:
在确定了需要进行compaction后,HBase会基于一定的策略选择需要合并的HFile文件。这些策略包括RatioBasedCompactionPolicy
等,它们会考虑HFile的大小、新旧程度等因素。
例如,RatioBasedCompactionPolicy会检查当前文件大小是否小于比它更新的所有文件大小总和的某个比例(由
hbase.hstore.compaction.ratio参数配置),或者候选文件数是否达到某个最小值(由hbase.store.compaction.min参数配置)。
3、线程池处理:
HBase针对小合并(minor compaction)和大合并(major compaction)等操作,会有不同的线程池进行处理。这些线程池的大小可
以通过配置参数进行调整,如hbase.regionserver.thread.compaction.small和
hbase.regionserver.thread.compaction.large。
4、执行compaction操作:
在选择了合适的HFile文件后,HBase会开始执行compaction操作。这个过程包括读取待合并HFile文件的数据(K,V),进行归并排序,
然后写入到一个新的临时文件中。
在这个过程中,HBase会清理ttl过期、版本超限定、标记删除的数据。
compaction完成后,HBase会将新的HFile文件替换旧的HFile文件,并更新相关的元数据。
5、日志记录和同步:
HBase会将compaction的输入文件路径和输出路径封装成KV写入到HLog日志中,并打上compaction标记。然后强制执行sync操作,确保
日志的持久化。
6、清理旧文件:
compaction完成后,HBase会删除对应的Store数据目录下的旧HFile文件,释放磁盘空间。
7、性能影响:
compaction操作会对读请求造成一定的毛刺,因为在compaction过程中需要读取和写入数据。同时,当HFile文件较多时,compaction
操作可能会对写请求造成阻塞或限制写请求的速度。但是,这些性能影响是暂时的,通过compaction操作可以优化后续的查询性能。

引用:https://www.nowcoder.com/discuss/353159520220291072

通义千问、文心一言


网站公告

今日签到

点亮在社区的每一天
去签到