当前位置: 首页 > news >正文

大数据面试题之HBase(3)

HBase的预分区

HBase的热点问题

HBase的memstore冲刷条件

HBase的MVCC

HBase的大合并与小合并,大合并是如何做的?为什么要大合并

既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase

HBase和Phoenix的区别

HBase支持SQL操作吗

HBase适合读多写少还是写多读少

HBase表设计

Region分配

HBase的Region切分


HBase的预分区

HBase的预分区(Pre-Splitting)是一种优化手段,用于在创建表时提前规划好表的分区结构,以减少数据写入过程中自动分区(Region Split)所带来的资源消耗和性能影响。预分区特别适用于预期会有大量数据写入的新表,通过预设分区,可以使得数据分布更加均匀,提升写入和查询性能。

1、预分区的目的:
 1) 减少Region Split:自动Region分裂过程会消耗CPU、I/O等资源,预分区可以减少分裂操作的发生频率,从而减轻系统负担。
 2) 优化数据分布:通过预分区,可以根据业务需求和数据分布特性,手动定义初始的Region分布,使得数据在一开始就较为均衡地分布在不同Region上。
 3) 提升性能:减少分裂操作可以降低对HBase集群的性能冲击,尤其是在数据批量导入或高写入速率场景下,预分区能显著提升写入速度和整体服务稳定性。
2、如何进行预分区:
 1) 确定分区数:首先,根据预期数据量和数据分布特性估算所需的Region数量。
 2) 指定分区点:选择合适的RowKey范围作为预分区的边界。这些边界值(Split Keys)应能均匀地将数据分割开,确保数据写入时能均衡分布。
 3) 创建表时指定预分区:在使用HBase shell或编程API创建表时,通过SPLITS参数指定预分区的边界值。例如,在HBase shell中,命令可能是这样的:
 create 'my_table', 'cf', SPLITS => ['key1', 'key2', ..., 'keyN']
 这里,'key1'至'keyN'是预定义的RowKey值,用于分割表。
 4) 调整配置:有时,为了配合预分区策略,可能还需要调整HBase的相关配置,比如hbase.hregion.max.filesize,该配置决定了单个Region的最大文件大小,超过此大小时会触发分裂。

注意事项:
预分区是一种静态配置,对于数据增长模式难以预测或数据分布随时间变化的情况,可能需要定期评估和调整预分区策略。
预分区策略应当基于对数据特性的深入了解,包括数据量、访问模式、RowKey设计等因素。
过度预分区可能会导致Region数量过多,增加维护成本和查找时间,因此需要合理规划。

HBase的热点问题

HBase的热点问题通常指在某些特定区域或RegionServer上过度集中的读写操作,导致这些区域或服务器成为性能瓶颈,甚至引发单点故障。热点问题可能导致资源利用不均,降低HBase集群的整体性能和可用性。以下是关于HBase热点问题的详细分析:

一、产生原因
1) 没有提前创建分区:当HBase表创建时,如果没有提前进行预分区,默认情况下只有一个Region,所有的RowKey都写入到这个Region中,导致该Region所在的RegionServer承受过大的压力。
2) RowKey设计不合理:如果RowKey的设计使得大量的数据写入到同一个Region中,或者使得某个Region的读写请求远超过其他Region,就会形成热点问题。例如,如果RowKey按照时间戳递增生成,并且查询也主要基于时间范围,那么最新的数据就会集中写入到同
一个Region中。

二、解决方案
1) 预分区(Pre-splitting):在创建HBase表时,根据数据的访问模式和查询需求,提前将表进行分区。通过指定Region的起始和结束RowKey,将数据分散到不同的RegionServer上,从而避免热点问题。
2) 合理设计RowKey:RowKey的设计应该使得数据在分布式存储中能够均匀分布。可以通过在RowKey中引入随机前缀、散列函数等方式来实现。例如,可以将时间戳反转、添加用户ID等作为RowKey的一部分,以减少数据倾斜。
3) 批量写入和读取:使用HBase的批量写入和读取接口,可以减少网络传输和I/O开销,提高性能。在写入数据时,可以将多个写入操作合并为一个批量写入操作;在读取数据时,可以将多个读取操作合并为一个批量读取操作。
4) 压缩和缓存:使用HBase的数据压缩功能可以减少数据在存储和传输过程中的大小,降低I/O开销。同时,通过合理配置HBase的缓存参数,将热点数据和频繁访问的数据缓存在内存中,可以减少磁盘读取的开销。
5) 使用Bloom Filter和Block Cache等技术:Bloom Filter可以减少不必要的磁盘读取操作,提高查询效率;Block Cache可以将数据块缓存在内存中,提高数据访问速度。

HBase的memstore冲刷条件

HBase的MemStore冲刷(Flush)是将内存中的数据写入磁盘的过程,以确保数据的持久化并控制内存使用。MemStore冲刷主要受以下条件触发:

1、MemStore大小限制:
当某个MemStore的大小达到配置的阈值 hbase.hregion.memstore.flush.size(默认值通常是128MB),该MemStore将会被刷写到
磁盘。这表示只要MemStore中存储的数据量达到了这个设定值,就会触发刷写操作。
2、RegionServer内存使用率:
当RegionServer中所有MemStore的总大小达到堆内存的一定比例(默认情况下,当达到 
hbase.regionserver.global.memstore.upperLimit 的值,默认为0.40,即40%),HBase会开始阻塞写操作,并按照各个Region的MemStore大小(从大到小)顺序进行刷写,直到总MemStore大小降到 hbase.regionserver.global.memstore.lowerLimit(默认值0.95,即95%)以下。这一过程是为了防止内存溢出,确保系统的稳定运行。
3、手动触发:
管理员可以通过命令行工具或API手动触发MemStore的刷写,这在需要立即释放内存或进行维护操作时非常有用。
4、定期刷写:
虽然不是标准配置中的直接条件,但在某些应用场景中,可能会设置定时任务以周期性地触发MemStore的刷写,以满足特定的维护或性能需求。
5、系统负载或资源压力:
在一些实现或配置中,如果系统检测到资源紧张(如CPU、I/O带宽等),可能会触发刷写操作以减轻系统压力,尽管这不是HBase直接规定的标准刷写条件。

HBase的MVCC

HBase的MVCC(Multi-Version Concurrency Control,多版本并发控制)是用于解决读写一致性问题的一种机制,它允许在并发环境下进行高效的读写操作,同时保证数据的一致性。以下是关于HBase MVCC的详细解释:

1、MVCC的基本原理
 1) 多版本控制:MVCC通过保留数据的多个版本来解决并发读写时可能产生的冲突。每个事务在读取数据时,都会看到一个一致性的数据快照,这个快照基于该事务开始时的数据版本。
 2) 读写不阻塞:在MVCC机制下,读操作不会阻塞写操作,写操作也不会阻塞读操作。多个事务可以同时进行读写操作,提高了系统的并发性能。
2、HBase中MVCC的实现
 1) 版本控制:HBase使用毫秒级时间戳作为数据的版本标识。每次数据更新时,都会生成一个新的版本,并将旧版本保留下来。读操作可以根据需要读取指定版本的数据。
 2) 写操作流程:
HRegion级别的seqID自增加一,并且当前writeNo设为seqID + 1亿(这个大数的意义是防止别的写操作提交时把readNo提高了,导致当前writeNo成为一个可读状态的id,后面会将其设回正常的seqID)。
把当前的写操作的一个包含seqID的dummy对象WriteEntry加进队列。
对于实际写操作本身,先写memstore,再写WAL(Write-Ahead Logging,预写日志),如果中间失败则回滚,否则则当做成功继续执行。
写请求提交实际上就是把当前HRegion级别的readNo设为队列中已完成的写请求的seqID最大值,表示seqID以下的写请求都处理完了,可读。
 3) 读操作流程:
每个读操作开始都分配一个读序号,也称为读取点(readPoint)。
读取点的值是所有的写操作完成序号中的最大整数(所有的写操作完成序号<=读取点)。
对某个(row, column)的读取操作r来说,结果是满足写序号为“写序号<=读取点这个范围内”的最大整数的所有cell值的组合。
2、MVCC的优势
提高并发性能:通过多版本控制和读写不阻塞的特性,MVCC可以显著提高HBase的并发性能。
保证数据一致性:MVCC通过保留数据的多个版本来解决并发读写时可能产生的冲突,从而保证了数据的一致性。

注意事项
MVCC虽然可以提高并发性能和数据一致性,但也会增加存储空间的开销,因为需要保留数据的多个版本。因此,在使用MVCC时需要根据实际情况进行权衡。
HBase的MVCC实现是在HRegion级别的,因此不同Region之间的数据读写不会相互干扰。但需要注意的是,如果某个Region的数据量过大或读写请求过于集中,可能会导致该Region成为性能瓶颈。此时可以通过预分区、负载均衡等技术手段来优化性能。

HBase的大合并与小合并,大合并是如何做的?为什么要大合并

大合并(Major Compaction)如何进行:
1、触发时机:

  • 大合并可以手动触发,通过HBase Shell、Master UI界面或HBase API执行major_compact命令。
  • 也可以根据配置自动触发,但通常大合并的自动执行周期较长,比如一周一次,因为其资源消耗较大。
  • 在一些场景下,管理员可能会禁用自动大合并,仅在低负载时段通过脚本手动执行,以减少对集群的影响。

2、执行过程:

  • 大合并会将一个Region下的所有StoreFile(即属于同一列族的所有HFile)合并成一个或少数几个较大的StoreFile。
  • 在合并过程中,HBase会检查每个记录的版本和时间戳,删除那些被标记为删除或已过期的数据(即带有墓碑标记的记录),从而释放存储空间。
  • 合并后,旧的HFile将被废弃,新的、更紧凑的HFile将替代它们,减少了文件总数,提升了查询效率。

为什么需要大合并:
1、优化查询性能:

  • 大合并减少了存储在磁盘上的HFile数量,使得查询时需要打开和遍历的文件减少,从而加快查询速度。
  • 通过删除无效数据,确保查询返回的是最新或有效版本的数据,避免了读取到已删除或过期记录。

2、节省存储空间:

  • 删除不再需要的数据,如已标记删除的记录和过期的版本,能够有效回收存储空间。
  • 合并成更少、更大的文件减少了存储碎片,进一步提高了空间利用率。

3、维护数据一致性:

  • 确保数据的一致性,避免在多次小合并后,仍存在大量冗余或无效数据。

尽管大合并带来了许多好处,但它也是一把双刃剑,因为合并过程会占用大量的I/O资源和磁盘空间(临时空间),可能导致在合并期间集群的读写性能下降。因此,大合并的执行通常需要精心规划,以最小化对在线服务的影响。

既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase

虽然HBase确实依赖HDFS作为其底层存储系统,但HBase提供的功能远超出了单纯文件存储的范畴,它针对特定的应用场景和需求进行了专门设计,补充了HDFS在某些方面的能力不足。以下是HBase相比于直接使用HDFS的一些关键优势:

实时读写能力

HBase是一个列式存储的NoSQL数据库,设计目标之一是提供低延迟的随机读写访问。相比HDFS更适合批量处理和大规模数据分析,HBase能够支持实时数据查询和更新,适用于需要快速响应的在线应用。

数据模型

HBase提供了丰富的数据模型,包括列族(Column Families)、列限定符(Column Qualifiers)和时间戳(Timestamps),使得数据结构更加灵活,便于处理半结构化和非结构化的数据。而HDFS主要是面向大规模的文件存储,没有内置复杂的数据模型。

事务和一致性

HBase支持原子性操作和一定程度的事务处理能力,如行级事务,确保数据更新的一致性。虽然不如传统关系型数据库的ACID特性强大,但对于很多应用场景来说已经足够。

自动分区和扩展性

HBase通过Region自动分裂和负载均衡机制,能够水平扩展以应对数据量的增长。用户无需手动管理数据分布,HBase会根据数据量和负载情况自动调整。

索引和查询优化

HBase内部实现了多种优化机制,如Block Cache、Bloom Filters等,提高了查询效率。虽然HDFS可以存储大量数据,但它本身并不提供高效的索引机制来加速数据检索。

易用性接口

HBase提供了易于使用的API和Shell工具,使得数据的插入、查询、删除等操作更为便捷。同时,HBase还可以与Hadoop生态系统中的其他工具如MapReduce、Pig、Hive等集成,便于进行复杂的数据处理。

简而言之,HBase在HDFS的基础上构建了一层数据库抽象,旨在解决大数据场景下的实时读写、灵活数据模型、复杂查询等需求,它使得开发人员能够以更数据库化的方式操作数据,而不必直接处理底层文件存储的复杂性。

HBase和Phoenix的区别

HBase和Phoenix在功能、用途和架构上存在明显的区别。以下是关于两者区别的详细解释:

1. 定义与用途
HBase:
定义:HBase是基于Hadoop的分布式、面向列的开源数据库,主要用于海量数据的存储和处理。
用途:适用于持久化存储大量数据(TB、PB级别),对扩展伸缩性有要求,需要良好的随机读写性能,以及处理结构化和非结构化的数据。
局限性:不支持复杂的事务处理,不支持SQL查询(但可以通过Phoenix等中间件解决)。
Phoenix:
定义:Phoenix是构建在HBase之上的开源SQL层,允许用户使用标准的JDBC API来建表、插入数据和查询HBase中的数据。
用途:通过Phoenix,用户可以避免直接使用HBase的客户端API,从而简化开发过程。Phoenix支持SQL查询,包括JOIN操作,使得HBase数据更容易被查询和分析。
2. 数据存储与访问
HBase:
数据存储:数据存储在Hadoop的分布式文件系统HDFS中,通过Row Key进行分区,并将不同的Row Key存储在不同的Region中。
数据访问:使用HBase提供的API进行数据读写操作,支持基于列族和列名的多维度数据查询。
Phoenix:
数据存储:虽然数据存储在HBase中,但Phoenix将数据模型映射到关系型世界,使得用户可以使用SQL语言来查询HBase数据。
数据访问:通过标准的JDBC API进行数据访问,支持SQL查询,包括JOIN操作。
3. 架构与特性
HBase:
架构:采用分布式架构,将数据分散存储在多台机器上,以实现数据的无限扩展。采用Master-Slave架构,其中Master负责对数据进行管理和协调,而Slave负责存储和读写数据。
特性:高可扩展性、高可用性、高性能、分布式存储和查询等特点。
Phoenix:
架构:作为HBase的SQL层,Phoenix在HBase之上提供了一个SQL接口,使得用户可以使用SQL语言来查询HBase数据。
特性:支持SQL查询,包括JOIN操作;容易集成其他工具,如Spark、Hive、Pig等;将SQL查询编译为HBase扫描,以优化查询性能。
4. 使用方式与性能
HBase:
使用方式:需要使用HBase提供的API进行数据操作,对开发者有一定的学习成本。
性能:直接操作HBase数据,性能较高,但复杂查询可能需要额外的处理。
Phoenix:
使用方式:使用标准的JDBC API和SQL语言进行数据操作,降低了开发门槛。
性能:通过优化SQL查询和编译为HBase扫描,提高了查询性能,特别是对于复杂查询和JOIN操作。

综上所述,HBase和Phoenix在数据存储、访问方式、架构和特性等方面存在明显的区别。选择使用哪个取决于具体的应用场景和需求。如果需要高性能的数据存储和随机读写能力,可以选择HBase;如果需要支持SQL查询和简化开发过程,可以选择Phoenix。

HBase支持SQL操作吗

HBase本身并不直接支持标准的SQL操作。HBase是一个基于列族的NoSQL数据库,它使用HBase查询语言(HBaseQL)来与数据进行交互,这种查询语言专注于键值对操作,与SQL有显著区别。

然而,想要使用SQL语法操作HBase,可以借助以下几种方式:

1、Apache Phoenix:
Phoenix是一个构建在HBase之上的开源项目,它提供了一个JDBC驱动,允许用户使用SQL查询来操作HBase。Phoenix将SQL查询转换为HBase的原生API调用,支持包括DML(数据操作语言)和DDL(数据定义语言)在内的多种SQL操作,并且还支持二级索引等功能,大大增强了HBase的查询能力。
2、Hive和Impala:
可以通过将HBase表映射为Hive外部表来间接使用SQL查询HBase。Hive支持将HBase表作为数据源,利用HiveQL执行查询,但请注意,这种方式通常更适合批处理查询,因为其查询引擎基于MapReduce,可能不适合低延迟需求。Impala则提供了更接近实时的SQL查询能力,通过直接访问HDFS数据,能够提供比Hive更快的查询响应时间,但同样需要预先设置Hive外部表与HBase的映射。
3、阿里云Lindorm等云服务:
一些云服务提供商,如阿里云的Lindorm,提供了对HBase的增强版本,其中包含了直接使用SQL操作HBase表的功能。这些服务通过特定的SQL兼容层或列映射功能,使得用户能够以SQL方式与HBase数据进行交互。

综上所述,虽然HBase本身不直接支持SQL,但通过上述工具和方法,用户依然能够以SQL的形式来操作HBase数据,从而降低了学习曲线,提高了开发效率,特别是对于熟悉SQL的开发者而言。

HBase适合读多写少还是写多读少

HBase本身并没有明确地被设计为只适合读多写少或写多读少的场景,而是根据具体的应用需求和工作负载来决定的。然而,由于HBase是基于Hadoop的分布式、面向列的数据库,它在某些方面对读多写少的工作负载更为友好。

以下是为什么HBase在某些情况下可能更适合读多写少的工作负载的原因:

1、数据一致性:HBase提供的是最终一致性模型,而不是强一致性模型。这意味着写入操作可能不会立即对所有读取操作可见,因为数据在集群中需要一定的时间进行复制和同步。在读多写少的场景下,写入操作相对较少,因此这种延迟通常是可以接受的。
2、写操作的开销:在HBase中,写入操作通常需要涉及多个组件,如WAL(Write-Ahead Logging,预写日志)、MemStore和HDFS等。这些操作可能需要消耗更多的资源和时间,尤其是在高写入负载下。因此,在写多读少的场景下,写入操作的开销相对较小,不会对系统性能产生太大影响。
3、数据压缩和编码:HBase支持多种数据压缩和编码技术,这些技术可以在存储数据时减少数据的体积并提高读取性能。在读多写少的场景下,由于读取操作更加频繁,因此数据压缩和编码技术可以更加有效地提高读取性能。
4、缓存机制:HBase利用块缓存(BlockCache)来缓存热点数据,以提高读取性能。在读多写少的场景下,热点数据更容易被缓存并频繁访问,从而进一步提高读取性能。

然而,需要注意的是,HBase也支持高写入负载的场景。通过优化写入策略、调整配置参数和使用合适的写入工具(如BulkLoad),HBase可以处理大量的写入操作。此外,HBase还支持事务性写入(通过Phoenix等中间件),可以在一定程度上保证写入操作的一致性和可靠性。

因此,HBase是否适合读多写少或写多读少的场景取决于具体的应用需求和工作负载。在选择使用HBase时,应该根据应用的实际情况进行评估和测试,以确定最佳的配置和策略。

HBase表设计

HBase表设计是关键的一步,它直接影响到数据的存储效率、查询性能以及系统的可扩展性。以下是一些基本的设计原则和最佳实践:

1. 表格模型理解
行键(Row Key):是HBase表中最重要的设计元素,直接影响查询性能。理想的行键应该是唯一且能按时间或逻辑顺序排列,以利用HBase的排序特性。设计时考虑前缀扫描和范围扫描的需求。
列族(Column Family):每个列族中的数据存储在一起,拥有相同的存储和缓存策略。应谨慎选择列族,过多的列族会增加存储开销,因为每个列族都有独立的文件存储。一般不超过3-4个列族。
列限定符(Column Qualifier):列族内的具体列,设计时可以灵活多变,不需要预先定义。
2. 行键设计
时间反序:如果数据有时间属性,可以考虑将时间戳作为行键的一部分,并将其置于行键末尾,这样可以优化最近数据的查询。
散列:如果单个键值范围过大,可以使用散列函数缩短行键长度,但需权衡查询效率。
组合键:结合多个字段生成行键,如用户ID+时间戳,既能保证唯一性,又利于范围查询。
3. 列族设计
减少列族数量:尽量减少列族数量,因为每个列族的元数据都会在内存中缓存,列族过多会增加内存负担。
访问模式匹配:根据访问频率和数据特性划分列族,频繁一起读取的列应放在同一列族中,以便于缓存优化。
4. 版本控制
合理设置版本数量:通过VERSIONS属性控制每个单元格存储的版本数,根据业务需求设置,避免无限制增长导致的空间浪费。
5. 时间戳
利用时间戳:HBase自动为每个单元格记录时间戳,可以利用此特性进行数据的历史版本管理或数据更新。
6. 预分区
预分区:对于大量数据的表,预创建多个Region可以提高写入性能和数据分布的均匀性。
7. 数据压缩
启用压缩:根据数据类型选择合适的压缩算法,如Snappy、GZ等,可以在不牺牲太多性能的情况下减少存储空间。
8. 性能考量
避免全表扫描:尽可能设计数据模型以支持行键或部分行键查询,减少全表扫描操作。
缓存策略:合理配置Block Cache和MemStore,以提升热点数据的访问速度。
9. 扩展性和维护
设计可扩展的表结构:考虑到数据量的增长和查询模式的变化,表结构应具有一定的灵活性和扩展性。
监控和调优:定期审查表设计并根据实际运行情况进行调优,利用HBase提供的监控工具分析性能瓶颈。
综上,HBase表设计是一个综合考量性能、扩展性和业务需求的过程,需要在实践中不断调整和完善。

Region分配

在HBase中,Region的分配是一个动态过程,它涉及到表的创建、数据负载均衡以及Region服务器故障恢复等多种情况。以下是关于HBase Region分配的主要特点和过程的详细解释:

1. Region的定义与功能
定义:HBase中的数据表被分割为多个水平切片,每个切片被称为一个Region。
功能:Region是HBase中数据存储和管理的基本单元,每个Region存储特定范围的行键数据。
2. 初始Region分配
当用户创建一个新的HBase表时,系统会自动分配一些初始的Region。
初始Region的数量和范围由系统内置的预分配策略决定。
3. 负载均衡与Region重新分配
目的:为了实现数据的负载均衡,HBase会定期执行Region的重新分配。
过程:
监控各个RegionServer的负载情况,包括Region数量和数据大小。
如果某个RegionServer上的Region过多,HBase会尝试将一部分Region迁移到相对空闲的RegionServer上。
如果某个RegionServer上的Region过少,HBase会尝试从其他RegionServer上迁移一些Region过来以实现负载均衡。
负载均衡频率:这些负载均衡的操作是透明的,用户无需干预,HBase会定期(例如每五分钟)进行检查和调整。
4. 故障恢复与Region分配
当一个RegionServer出现故障时,HBase会进行相应的故障恢复操作。
故障恢复的主要目标是将故障的RegionServer上的Region重新分配到其他正常的RegionServer上。
HBase检测到故障的RegionServer。
将该RegionServer上的所有Region标记为不可用。
根据负载情况,在其他正常的RegionServer上重新分配这些Region。
客户端会被通知新的RegionServer位置,以便继续访问数据。
5. Region分配策略与配置
HBase提供了多种Region分配策略,例如ConstantSizeRegionSplitPolicy、IncreasingToUpperBoundRegionSplitPolicy、SteppingSplitPolicy等,这些策略决定了Region的分裂时机和方式。
用户可以通过调整HBase的配置参数来影响Region的分配和分裂行为,以优化系统的性能和稳定性。
6. 注意事项
Region的分配和分裂是HBase自动管理的,但在某些情况下,如数据倾斜或特定查询模式,可能需要手动干预或调整配置参数以达到最佳性能。
合理地设计表的行键和预分区策略,以及合理地配置Region的分裂阈值等参数,都可以对Region的分配和性能产生积极影响。

HBase的Region切分

HBase的Region切分是HBase分布式存储系统中的重要机制,它确保了数据的均衡分布和查询性能的优化。以下是关于HBase Region切分的详细解释:

1. Region切分的定义
Region是HBase中数据存储的基本单位,每个Region包含一定范围的行数据。随着数据的不断写入,当Region的大小超过一定阈值时,HBase会触发Region的切分操作,将一个大的Region拆分成两个或多个更小的Region。

2. Region切分的触发策略
HBase提供了多种Region切分的触发策略,这些策略决定了何时以及如何触发Region的切分。以下是几种常见的切分策略:

ConstantSizeRegionSplitPolicy:这是HBase早期版本的默认切分策略。当Region的大小超过一个固定的阈值(例如10GB)时,会触发切分操作。然而,这种策略没有考虑到不同表或不同Region之间的数据差异,可能导致在某些情况下切分不够合理。
IncreasingToUpperBoundRegionSplitPolicy:这是HBase后续版本中引入的切分策略,也是当前版本的默认策略。它根据RegionServer上Region的数量动态调整切分的阈值。当Region数量较少时,切分阈值也较低;随着Region数量的增加,切分阈值也逐渐增加,但不会超过一个设定的上限值。这种策略能够更好地适应不同数据量和工作负载的情况。
SteppingSplitPolicy:这是HBase 2.0版本引入的切分策略。它的切分阈值规则与IncreasingToUpperBoundRegionSplitPolicy类似,但更加简化。如果RegionServer上只有一个Region,则切分阈值为MemStore的刷写大小的两倍;否则,切分阈值为设定的最大Region文件大小。
3. Region切分的具体操作
当触发Region切分时,HBase会执行以下操作:

准备阶段:在内存中初始化两个子Region,生成对应的HRegionInfo对象,并创建一个transaction journal来记录切分的进展。
执行阶段:
更改ZooKeeper中Region的状态为SPLITTING。
HBase Master检测到状态变化后,修改内存中Region的状态,并在RIT(Region In Transition)模块中显示Region执行切分的状态信息。
在父Region的存储目录下创建临时文件夹.split,保存切分后的子Region信息。
关闭父Region的数据写入并触发flush操作,将内存中的数据持久化到磁盘。
在.split文件夹下创建两个子文件夹(daughter A和daughter B),并生成reference文件指向父Region中的对应文件。
将daughter A和daughter B拷贝到HBase的根目录下,形成两个新的Region。
父Region通知修改hbase.meta表后下线,不再提供服务。
开启daughter A和daughter B两个子Region,并通知修改hbase.meta表,正式对外提供服务。
回滚阶段:如果执行阶段出现异常,则执行回滚操作,清理相关的垃圾数据。
4. 注意事项
Region的切分是HBase自动管理的,但在某些特殊情况下,如数据倾斜或特定查询模式,可能需要手动干预或调整切分策略。
合理地设置切分策略的参数,如最大Region文件大小等,可以影响Region的切分行为和系统的性能。
频繁的Region切分可能会导致额外的I/O和CPU开销,因此需要权衡切分的频率和系统的性能需求。

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

通义千问、文心一言

相关文章:

大数据面试题之HBase(3)

HBase的预分区 HBase的热点问题 HBase的memstore冲刷条件 HBase的MVCC HBase的大合并与小合并&#xff0c;大合并是如何做的?为什么要大合并 既然HBase底层数据是存储在HDFS上&#xff0c;为什么不直接使用HDFS&#xff0c;而还要用HBase HBase和Phoenix的区别 HBase支…...

c#中赋值、浅拷贝和深拷贝

在 C# 编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是用于复制对象的两种不同方式&#xff0c;它们在处理对象时有着重要的区别和适用场景。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对…...

旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!

今天解决了天坑一个&#xff0c;大家可能有的人买的是st7789屏幕模块&#xff0c;240x240&#xff0c;1.3寸的 他标注的是老版&#xff0c;没有CS引脚&#xff0c;小崽子长这样&#xff1a; 这熊孩子用很多通用的驱动不吃&#xff0c;死活不显示&#xff0c;网上猛搜&#xff…...

激光粒度分析仪校准步骤详解:提升测量精度的秘诀

在材料科学、环境监测、医药研发等众多领域&#xff0c;激光粒度分析仪以其高精度、高效率的测量性能&#xff0c;成为了不可或缺的测试工具。然而&#xff0c;为了保持其测量结果的准确性和可靠性&#xff0c;定期校准是不可或缺的步骤。 接下来&#xff0c;佰德将为您详细介…...

独一无二的设计模式——单例模式(python实现)

1. 引言 大家好&#xff0c;今天我们来聊聊设计模式中的“独一无二”——单例模式。想象一下&#xff0c;我们在开发一个复杂的软件系统&#xff0c;需要一个全局唯一的配置管理器&#xff0c;或者一个统一的日志记录器&#xff1b;如果每次使用这些功能都要创建新的实例&…...

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债&#xff0c;全称是“可转化公司债券”&#xff0c;是上市公司为了融资&#xff0c;向社会公众所发行的一种债券&#xff0c;具有股票和债券的双重特点&#xff0c;投资者可以选择按照发行时约定的价格将债券转化成公司一般股票&#xff0c;也可作为债券持有到期后收取本…...

原型模式的实现

1. 引言 1.1 背景 在实际编程中,有时需要频繁创建多个相似但稍有不同的对象。如果采用传统的对象创建方式,容易造成代码冗余,对象重复初始化操作也可能带来大量的的资源消耗(如时间、内存等)。这样不仅降低了灵活性,导致难以适应状态的变化,还降低了代码的可扩展性。 …...

【第二套】华为 2024 年校招-硬件电源岗

1.为了避免 50Hz 的电⽹电压⼲扰放⼤器&#xff0c;应该⽤那种滤波器&#xff1a; A.带阻滤波器 B.带通滤波器 C.低通滤波器 D.⾼通滤波器 2.PID 中的 I 和 D 的作⽤分别是&#xff1f; A、消除静态误差和提⾼动态性能 B、消除静态误差和减⼩调节时间 C、提⾼动态性能和减⼩超调…...

Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议

一、项目要求 实现自定义私有协议&#xff0c;如&#xff1a;pc端产生数据&#xff1a;02 56 38 &#xff0c;“02”代表要发送数据的个数&#xff0c;“56”“38”需要写进RAM中。当按键信号到来时&#xff0c;将“56”“38”读出返回给PC端。 二、信号流向图 三、状态…...

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…...

粤港联动,北斗高质量国际化发展的重要机遇

今年是香港回归27周年&#xff0c;也是《粤港澳大湾区发展规划纲要》公布5周年&#xff0c;5年来各项政策、平台不断为粤港联动增添新动能。“十四五”时期的粤港澳大湾区&#xff0c;被国家赋予了更重大的使命&#xff0c;国家“十四五”《规划纲要》提出&#xff0c;以京津冀…...

Chrome导出cookie的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

视频文字转语音经验笔记

自媒体视频制作的一些小经验&#xff0c;分享给大家。 一、音频部分&#xff1a; 1、文字转语音阐述&#xff1a; 微软语音识别 云希-青年男&#xff0c; 0.5-0.8变速 。注&#xff1a;云泽-中年男&#xff08;不支持长音频录制&#xff09;&#xff0c; 适合郑重场合&#…...

视频融合共享平台LntonCVS统一视频接入平台智慧安防应用方案

安防视频监控平台LntonCVS是一款拥有强大拓展性和灵活部署能力的综合管理平台。它支持多种主流标准协议&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容各厂家的私有协议和SDK&#xff0c;如海康Ehome、海大宇等。LntonCVS不仅具备传统安防视频监控功能&…...

使用Python绘制动态螺旋线:旋转动画效果

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制螺旋线函数主循环 完整代码 引言 螺旋线是一个具有美学和数学魅力的图形。通过编程&#xff0c;我们可以轻松创建动态旋转的螺旋线动画。在这篇博客中&#xff0c;我们将使用Python和Pygame库来实现…...

Symfony实战手册:PHP框架的高级应用技巧

引言 Symfony是一个功能强大且广泛应用于PHP应用程序开发的框架&#xff0c;它提供了许多高级特性和工具&#xff0c;可以帮助开发人员更高效地构建和管理复杂的Web应用程序。以下是Symfony框架的几个关键方面及其高级应用技巧&#xff1a; 1. 路由和控制器 Symfony的路由组…...

TOGAF培训什么内容?参加TOGAF培训有什么好处?考试通过率多少?

TOGAF培训什么内容&#xff1f;参加TOGAF培训有什么好处&#xff1f;考试通过率多少&#xff1f; TOGAF培训哪些内容&#xff1f; 通过本课程&#xff0c;你将掌握TOGAF的理论和实践&#xff0c;理解企业架构的影响&#xff0c;能够评估、启动、设 计、执行新一轮企业和IT架构…...

keepalived HA nginx方案

安装 centos: yum -y install epel-release yum -y install nginx keepalivedkeepalived配置解析 /etc/keepalived/keepalived.conf ! Configuration File for keepalived # 全局变量 global_defs {router_id nginx_ha # 主从保持一致script_user root # 执行健康检查的…...

报错:pathspec ‘xxx‘ did not match any file(s) known to git

在 escode 中进行分支切换时报如下错误 PS > git checkout xxx error: pathspec xxx did not match any file(s) known to git远程分支已经在 gitlab 客户端手动创建&#xff0c;在 escode 中也使用了拉取之类的操作&#xff0c;但是切换分支时依然报错。 解决方案 查看分…...

sed 保持空间命令之 x 的执行逻辑

目录 1. 将模式空间和保持空间的内容互换并打印 2. 将保持空间的内容交换回模式空间 3. 使用保持空间保存状态信息 4. 交换模式空间与保持空间隔行匹配 sed 有两个内置的缓存空间&#xff1a; 模式空间&#xff1a;该空间是 sed 内置的一个缓冲区&#xff0c;是 sed 执行的…...

按位异或^

在 Python 中&#xff0c;a ^ b 表示按位异或运算符。按位异或运算符对整数的每一位进行运算&#xff0c;如果对应位上的两个二进制数字不同&#xff0c;则结果为 1&#xff0c;否则为 0。 示例 a 5 # 二进制: 0101 b 3 # 二进制: 0011result a ^ b print(result) # 输…...

《企业实战分享 · 常用运维中间件》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…...

PyCharm 2024.1简介

PyCharm 2024.1 是JetBrains公司发布的Python集成开发环境&#xff08;IDE&#xff09;的最新版本。作为一个深受开发者欢迎的工具&#xff0c;PyCharm以其强大的功能和高效的开发体验著称。以下是PyCharm 2024.1的主要特性和改进&#xff1a; 1. **性能提升**&#xff1a; …...

终身免费的Navicat数据库,不需要破解,官方支持

终身免费的Navicat数据库&#xff0c;不需要破解&#xff0c;官方支持 卸载了Navicat&#xff0c;很不爽上干货&#xff0c;Navicat免费版下载地址 卸载了Navicat&#xff0c;很不爽 公司不让用那些破解的数据库软件&#xff0c;之前一直使用Navicat。换了几款其他的数据库试了…...

Spring Boot中的模板引擎选择与配置

Spring Boot中的模板引擎选择与配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot中的模板引擎选择与配置。模板引擎是生成动态网页…...

4、音视频封装格式---FLV

FLV FLV是一种容器封装格式&#xff0c;是由Adobe公司发布和维护的&#xff0c;用于将视频编码流与音频编码流进行封装。对于任意一种封装格式&#xff0c;都有其头部区域与数据区域&#xff0c;在FLV中&#xff0c;称之为FLV Header与Body。 对于FLV Header&#xff0c;一个FL…...

vscode 前行复制到下一行

目录 Ctrl d 会把当前行复制到下一行 步骤1&#xff1a;打开键绑定设置 目录 Ctrl d 会把当前行复制到下一行 步骤1&#xff1a;打开键绑定设置 使用VS Code设置换行 Ctrl d 会把当前行复制到下一行 步骤1&#xff1a;打开键绑定设置 打开 VS Code。按 CtrlShiftP 打开命…...

什么是文档透明加密|好用的文档透明加密软件有哪些?

在当今日益数字化和信息化的时代&#xff0c;数据安全问题愈发受到企业和个人的关注。文档作为信息的重要载体&#xff0c;其安全性不言而喻。为了保障文档的机密性和完整性&#xff0c;文档透明加密技术应运而生。本文将对文档透明加密进行详细介绍&#xff0c;并探讨一些好用…...

XTDrone-固定翼无人机编队跟踪无人车-配置教程

配置使用ROS版本为Neotic 1 配置 1.1 加载固定翼无人机编队跟踪控制工程文件 cp -r ~/XTDrone/coordination/fixed_wing_formation_control ~/catkin_ws/src 1.2 加载一些用到的功能包 sudo apt-get install ros-noetic-serial #根据自己的ROS版本修改 sudo apt-get insta…...

实现高性能、可扩展的实时数据采集系统:go-zero的应用与实践

随着互联网技术的高速发展&#xff0c;数据采集也越来越受到重视&#xff0c;成为企业获取商业价值的重要手段。在实际应用中&#xff0c;我们往往面临着数据量大、并发高、系统响应速度要求高、压力测试等挑战。如何实现高性能、可扩展的实时数据采集系统&#xff1f;本文将介…...

AUTOSAR NvM模块(五)

NvMRbCallbackSignatureAR45 改变回调函数的参数类型。 TRUE&#xff1a;根据AR44及之后版本&#xff0c;回调函数使用NvM_<Multi;Init>BlockRequestType参数类型。详细的函数调用参数请参考回调参数。 FALSE&#xff1a;根据AR43及之前版本&#xff0c;回调函数使用S…...

输出feign调用详细日志

开发新增一个feign调用类&#xff0c;调用另一个微服务的接口&#xff0c;总是报调用失败&#xff0c;想输出下调用的详细日志看看怎么回事。 第一步&#xff1a;查看feign的输出级别。 这个在qlm_config包里&#xff1a; /*** feign 日志记录级别* NONE&#xff1a;无日志记录…...

mac编译r2frida问题解决

在编译 https://github.com/nowsecure/r2frida 时报错: {"category": "error","code": 7006,"file": {"path": "/Users/xxx/Documents/Library/r2frida/src/agent/lib/info/index.ts","line": 494,&qu…...

中介者模式在金融业务中的应用及其框架实现

引言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;它通过引入一个中介对象来封装对象之间的交互&#xff0c;从而使对象不需要显式地相互引用&#xff0c;从而降低了对象之间的耦合性。在金融业务中&#xff0c;中介者模式常用于实现复…...

javaSE期末练习题

文章目录 前言一、程序控制1.顺序结构问题描述解题思路题解 2.选择结构2.1 题1问题描述解题思路题解 2.1 题2问题描述解题思路题解 3.循环结构3.1 阶乘的求取问题描述解题思路题解 3.2 水仙花数问题描述解题思路题解 二、数组三、类与对象1.类与对象1.1圆类问题描述解题思路题解…...

Linux文件数据写入

结构体 fd fd也就是文件描述符&#xff0c;用于标识已经打开的文件、管道、socket等。是进程和内核的桥梁&#xff0c;允许进程执行各种文件操作 struct fd {struct file *file;unsigned int flags; };file Linux内核中表示打开文件的结构体&#xff0c;包含了文件操作所需…...

vue2 中如何使用 vuedraggable 库实现拖拽功能

1.通过 npm 或 yarn 安装 vuedraggable 库 npm install vuedraggableyarn add vuedraggable 2. 引入组件内部使用&#xff0c;以下代码是一个Demo&#xff0c;可直接复制粘贴演示 注意&#xff1a;因项目使用了 vant&#xff0c;需要安装 vant 才能正常运行 <template&g…...

0基础学C++ | 第13天 | 基础知识 | 类 | 对象

目录 前言 封装 封装的意义 struct 和 class 的区别 成员属性设置为私有 前言 众所周知&#xff0c; C是一个面向对象的编程语言&#xff08;面向对象的C语言的特点就是&#xff1a;封装、继、 多态&#xff09;&#xff0c;它与面向过程的C语言不通&#xff0c;对面向…...

Java | Leetcode Java题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; class Solution {int[][] dirs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public List<String> findWords(char[][] board, String[] words) {Trie trie new Trie();for (String word : words) {trie.insert(word);}Set<String> a…...

Flink面试题总结

一、简单介绍一下 Flink Apache Flink 是一个实时计算框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算 二、Flink集群有哪些角色&#xff1f;各自有什么作用&#xff1f;&#xff08;flink架构&#xff09; --JobManager&#xff1a; JobManag…...

人工智能与云计算

项目要求 一个简单的集群。您需要在此项目中创建计算机集群。这些机器是 docker 容器。集群管理器是一个 Python 程序。群集的状态将写入文件。 希望通过这个 Python 文件,首先它能够通过获取输入来得到要创建的集群中包含的容器数量,并与用户进行交互(用户可以执行此集群…...

9.(vue3.x+vite)修改el-input,el-data-picker样式

效果预览 二:相关代码 <template><div style="padding: 50px"><el-input placeholder="请输入模型名称" style="width: 260px" /><br /...

java反射和注解

反射 获取class对象的三种方法 ①&#xff1a;Class.forName("全类名"); ②&#xff1a;类名.class ③&#xff1a;对象.getclass(); 代码样例 package com.ithema;public class Main {public static void main(String[] args) throws ClassNotFoundException {//第…...

react_后台管理_项目

目录 1.运行项目 2. 项目结构 ①项目顶部导航栏 ②项目左侧导航栏 ③主页面-路由切换区 本项目使用的是 reacttsscss 技术栈。 1.运行项目 在当前页面顶部下载本项目&#xff0c;解压后使用编辑器打开&#xff0c;然后再终端输入命令&#xff1a; npm i 下载依赖后&am…...

【C语言】使用C语言编写并使用gcc编译动态链接库

【C语言】使用C 语言编写并使用 gcc 编译动态链接库 1.背景2.使用C编写代码3.使用gcc编译代码1.背景 在windows下开发很多程序接口被封装到动态链接库供其它开发者使用。 本博客使用C语言编写并使用gcc 编译 一个动态链接库文件FpdSys.dll; 然后使用C/C++/C#/Python去调用动态…...

使用supportFragmentManager管理多个fragment切换

android studio创建的项目就没有一个简单点的框架&#xff0c;生成的代码都是繁琐而复杂&#xff0c;并且不实用。 国内的页面一般都是TAB页面的比较多&#xff0c;老外更喜欢侧边菜单。 如果我们使用一个activity来创建程序&#xff0c;来用占位符管理多个fragment切换&…...

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...

独立开发者系列(17)——MYSQL的常见异常整理

虽然安装MYSQL到本地很简单&#xff0c;但是数据库报错还是经常出现&#xff0c;这个时候&#xff0c;需要我们进行逐步检查与修复。作为我们最常用的开发软件&#xff0c;无论切换php/go/python/node/java&#xff0c;数据库的身影都少不了&#xff0c;对于我们储存数据而言&a…...

【ajax实战02】数据管理网站—验证码登录

一&#xff1a;数据提交&#xff08;提交手机验证码&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集对象形式的表单数据后&#xff0c;一并提交给服务器。后得到返回值&#xff0c;进一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…...

人工智能在反无人机中的应用介绍

人工智能技术在无人机的发展中扮演着至关重要的角色&#xff0c;这一作用在反无人机技术领域同样显著。随着无人机技术的发展&#xff0c;飞行器具备了微小尺寸、高速机动性&#xff0c;以及可能采用的隐蔽或低空飞行轨迹等特性。这些特性使得传统的人工监视和控制手段面临着重…...

ABB PPC902AE1013BHE010751R0101控制器 处理器 模块

ABB PPC902AE1013BHE010751R0101 该模块是用于自动化和控制系统的高性能可编程控制器。它旨在与其他自动化和控制设备一起使用&#xff0c;以提供完整的系统解决方案 是一种数字输入/输出模块&#xff0c;提供了高水平的性能和可靠性。它专为苛刻的工业应用而设计&#xff0c…...

数据结构历年考研真题对应知识点(串的模式匹配)

目录 4.2串的模式匹配 4.2.2串的模式匹配算法——KMP算法 【KMP 匹配过程中指针变化的分析(2015)】 【KMP 匹配过程中比较次数的分析(2019)】 4.2串的模式匹配 4.2.2串的模式匹配算法——KMP算法 【KMP 匹配过程中指针变化的分析(2015)】 最终得到子串指针变化公式 jnex…...

PLL和CDR的内部结构及其区别

比较PLL和CDR的内部结构及其区别&#xff1a; 基本结构&#xff1a; PLL&#xff08;相位锁定环&#xff09;&#xff1a; 相位检测器环路滤波器压控振荡器&#xff08;VCO&#xff09;分频器&#xff08;可选&#xff0c;用于频率合成&#xff09; CDR&#xff08;时钟数据恢复…...

【简单讲解下Tauri】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

优化接口的几个常用方法

优化Java接口性能是确保应用程序高效、响应迅速且能够处理负载的重要步骤。以下是一些优化Java接口的方法&#xff0c;涵盖从设计模式、代码优化到使用牛刀小试工具的综合技巧。以下是我在工作中总结的几个方面&#xff1a; 设计模式和接口设计使用缓存优化数据库访问异步处理…...

mac 安装nvm的教程

在macOS上切换Node.js版本&#xff0c;可以使用nvm&#xff08;Node Version Manager&#xff09;。以下是安装nvm和切换Node.js版本的步骤&#xff1a; 安装nvm 下载方式 终端复制输入&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.…...

绿色生态发展底色如何落地“生”金?且看林下经济的“江西实践”

何为“林下经济”?林下经济是以林地资源为依托,以科技为支撑,充分利用林下土地资源和林荫空间,选择适合林下生长的微生物和动植物种类,进行合理种植、养殖,从而为农村经济提供新的增长点、为农民开辟增收致富新路子的新兴生态农业模式。江西省是全国首个“国家森林城市”…...

方程豹发力了,豹3的官方谍照曝光,竞争对手锁定哈弗猛龙

方程豹官方,近日发布了豹3的谍照,定位为中型SUV,预计豹3将于2024年底前上市。根据发布的谍照,可以看到共有三款车型,代表了不同的版本。前大灯和中网与之前的概念车相似,中网很可能采用封闭式设计,并带有粗犷的装饰条。车身侧面采用了平直的线条,整体造型紧凑而干练。细…...

NBA总决赛揭幕体育博彩业寄望篮球盛宴提振业绩

智通财经APP获悉,随着周四晚上NBA总决赛的揭幕,波士顿凯尔特人队正准备迎战达拉斯小牛队,争夺篮球界的最高荣誉。这场七场四胜制的较量不仅在球场上备受瞩目,更在体育博彩界引发了热潮。BetMGM的首席营收官马特普雷沃斯特表示:“NBA总决赛是年度体育赛事的重头戏,它吸引了…...

GfK中国联合上海市眼镜行业协会举办高层论坛:探索眼镜市场机遇共筑视觉健

中国与上海市眼镜行业协会联合主办的 “视界之窗:瞰见全球及中国眼镜市场未来”高层论坛5月16日在上海成功举行。本次论坛汇聚了上海市眼病防治中心视光中心、上海健康医学院医学技术学院等三十余家专业机构和协会专家,以及上海三联有限公司、上海依视路光学有限公司、卡尔蔡司…...

《TCP/IP网络编程》(第十二章)I/O复用(2)

下面是基于I/O复用的回声服务器端和客户端代码 Linux系统 服务器端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // POSIX标准定义的通用函数&#xff0c;如close() #include <arpa/inet.h> // 提…...

ffmpeg3.1.1版本连接ftp服务器失败

发现这个问题是在ffmpeg4之后修复的&#xff1a; 原因在于libavformat文件下的ftp.c文件&#xff1a; 修改方法&#xff1a;加入在TCP控制连接时加入应答代码202&#xff1a; static int ftp_features(FTPContext *s) {static const char *feat_command "FEAT\r\…...