分布式文件系统的新兴力量:揭秘Alluxio的元数据管理机制【文末送书】
文章目录
- 写在前面
- 01 分布式文件系统元数据的常见类型
- 1.1 文件(inode)元数据
- 1.2 数据块(block)元数据
- 1.3 Worker元数据
- 02 分布式文件系统元数据的存储模式
- 2.1 元数据存储在堆上(HEAP模式)
- 2.2 元数据存储在堆外(ROCKS模式)
- 2.3 堆外存储的内存和磁盘占用
- 2.4 对堆外存储的缓存加速和调优
- 2.5 在HEAP和ROCKS模式间切换
- 写作末尾
写在前面
当今,我们的世界已经进入一个数据时代。随着互联网、物联网、5G、大数据、人工智能、自动驾驶、元宇宙等信息技术的快速发展,人们在产生、收集、存储、治理和分析的数据的总量呈快速增长的趋势。形态多样、格式复杂、规模庞大、产生迅速的行业领域大规模数据驱动了底层新型基础支撑计算支撑技术的快速变革。通过过去10多年来工业界和学术界先行者的指引和实践,分布式并行计算和分布式数据存储的技术生态不断演进、丰富繁荣。其中,分布式数据存储管理在这个海量数据处理技术栈中处于基础地位,是众多行业大数据应用分析的基石。
分布式文件系统是从高性能计算到大数据计算时代一直广为应用的主流分布式数据存储管理系统。近些年随着云计算技术的持续发展,分布式对象存储存储、键值存储等技术的应用也开始大行其道。在这个背景下,很多分布式文件系统开始走上对数据存储进行统一高效管理的技术路线。其中,被用户知晓和普遍应该的一款系统是诞生于加州大学伯克利分校的AMPLab的Alluxio,它可以被看作一种统一化大数据虚拟文件系统,不同种类的分布式存储系统(文件系统、对象存储系统)都可以挂载到Alluxio目录中,对提供提供高效统一的访问模式和接口。元数据是一个存储系统中关于数据信息最为重要、正常访问最为频繁的一类关键信息。为了有效地管理来自底层不同分布式存储系统的大规模数据文件和对象,Alluxio需要提供一种高效可扩展的大规模元数据管理机制。
本文以开源版本的Alluxio 2.8为例,揭秘分布式文件系统中常见的大规模元数据管理机制。对Alluxio用户而言,用户通过文件元信息和Alluxio文件系统接口进行互动,通过数据块元信息来读写数据和缓存。文件和数据块元信息由Alluxio Master统一存储和管理。
01 分布式文件系统元数据的常见类型
Alluxio Master管理的元数据中,最重要的是文件元数据、数据块元数据、挂载点元数据和Alluxio Worker元数据几类。
1.1 文件(inode)元数据
Alluxio文件系统中的每一个文件或文件夹都由一个inode代表,这个inode存储着这个文件所有的属性和元信息,包括文件基本属性、权限信息、管理属性、时间戳、包含的数据块及每一个数据块的元数据等。“inode”这一概念来源于Unix类型的文件系统,在Linux和HDFS等文件系统中被广泛使用,一个inode代表着文件系统目录树上的一个节点。因为Alluxio管理着多个底层存储,所以Alluxio命名空间中的潜在文件数量实际上是所有底层存储中文件的总和。元数据服务作为Alluxio集群中最重要的服务,直接决定了系统的规模、性能和稳定性。值得一提的是,Alluxio文件系统中的inode不一定在底层存储中存在。例如,如果这个路径是用MUST_CACHE方式写入Alluxio,那么Alluxio并不会在底层存储中创建这个文件。此外,如果底层存储是一个对象存储,因为对象存储没有文件夹的概念,所以Alluxio中的文件夹并不会在底层存储中对应实际存在的对象。
总体来说,Alluxio Master对inode的管理可以抽象地分为以下几类:
-
使用一个InodeTree存储所有的inode信息及inode之间的树状结构(文件夹和文件之间的父子关系),Alluxio Master维护着文件系统的树状结构。
-
实现文件系统操作的接口并支持所有对文件的操作。Alluxio Master开放了一系列文件系统操作接口,并且对每一个操作提供了并发安全和持久化保证,通过这样的方式向上层应用提供了一个分布式文件系统。
-
通过Journal日志维护一个持久化的状态,保证每一个inode操作的持久性和原子性。Alluxio Master通过保证inode信息和每一个操作记录在Journal日志中,从而保障在任何情况下inode信息和更改都不会丢失。
-
Alluxio的InodeTree通过将锁粒度精细到每一个inode,支持inode级别的读写并发访问。对每一个inode通过锁进行并发控制,保证在并发读写中inode的线程安全。
1.2 数据块(block)元数据
如果inode对应一个文件,则它有0个(空文件)或多个数据块。对一个新建文件而言,所有数据块大小都由 alluxio.user.block.size.bytes.default 设置,只有最后一个数据块除外。只有1个数据块的文件也算作是最后一个数据块。数据块的元信息管理相对inode而言比较简单,因为数据块之间不具有树状的结构或者亲子关系。
Alluxio Master保存着数据块的元信息以及数据块缓存的当前位置,并对外提供了对这些信息的读写接口。Alluxio Master管理的数据块元数据可以简要地被看作两个键值存储:
(1)<BlockID, BlockMetadata>(2)<BlockID, List<BlockLocation>>
其中,BlockMetadata记录了数据块的长度。BlockLocation记录了这个数据块(缓存)存在的Alluxio Worker节点地址,和这个数据块在Alluxio Worker节点上的具体存储位置。
这两个不同的信息被分开存储主要是因为它们的生命周期不同。Block Metadata是不变的(Immutable)。Alluxio不支持对已经写完的数据块进行随机更改或追加。如果这个文件被重写,它会得到新的FileID(即InodeID)和新的BlockID,旧的数据块会被舍弃。相反,BlockLocation列表是会不断变化的,比如当这个数据块被加载进一个新的Alluxio Worker,或者被从某一个Alluxio Worker上驱逐之后,这个列表信息都会对应地改变。
MountTable
MountTable管理着所有Alluxio文件系统中的挂载点,提供了诸如挂载点的创建和更改操作。同时Alluxio文件路径和底层存储的文件路径也通过MountTable互相解析对应。
1.3 Worker元数据
Alluxio Master对Alluxio Worker元数据的管理包括了追踪当前有哪些正在工作的Alluxio Worker,并且不断更新Alluxio Worker上的缓存列表。Alluxio Master记录的信息主要包括:
(1)Alluxio Worker的地址、启动时间等不变信息。
(2)Alluxio Worker的空间使用情况,包括多层缓存中每层的使用量,随每次心跳更新。
(3)Alluxio Worker中被缓存的所有BlockID和将要从Alluxio Worker中移除的所有BlockID。这些信息随着每一次心跳和数据块操作(加载、驱逐等)而改变。
02 分布式文件系统元数据的存储模式
分布式文件系统的元数据存储通常包括堆上存储和堆外存储两种。其中,堆上存储访问高效,但是空间有限,而堆外存储空间大,但如果设计不当会造成性能损失。
2.1 元数据存储在堆上(HEAP模式)
以Alluxio为例,在HEAP模式下,所有元信息都以Java对象的形式存储在JVM的堆中。每一个文件在堆上的内存占用大约为2KB4KB。因此,当Alluxio文件系统中有大量的文件时,堆上元信息将会给JVM带来大量内存压力。不难算出,系统中有1亿文件时,JVM上仅仅是存储这些文件的元信息就会占用200GB400GB。加上Master JVM必须承担的大量RPC操作内存开销,这个JVM对内存的需求是普通服务器很难承受的。
此外,对大部分JVM版本而言,如此数据规模下的GC会变得非常难以管理。Alluxio Master JVM中的这些元信息都是长久存在的对象,尤其会给老年代的GC效率带来很大的影响。尽管有一些商业版JVM可以避免部分或大部分JVM带来的性能和管理问题,但是对大多数用户来说,JVM占用过多还是一个十分棘手的痛点,尤其是Alluxio Master 的JVM可能在未来随着业务扩展可能超出物理机内存的上限。
2.2 元数据存储在堆外(ROCKS模式)
针对HEAP模式难以扩展的问题,Alluxio优化了设计方向。Alluxio 在2.0版本中引入了ROCKS模式,将元信息存储挪到了JVM之外。在ROCKS模式下,Alluxio Master内嵌了一个RocksDB,将文件(和数据块)的元信息从之前的JVM堆上挪到了RocksDB中,而RocksDB的存储介质实际是硬盘而非内存。使用RocksDB存储元数据只需要配置元数据存储模式并指定RocksDB存储的路径:
alluxio.master.metastore=ROCKSalluxio.master.metastore.dir=${alluxio.work.dir}/metastore
Alluxio内嵌的RocksDB会使用 alluxio.master.metastore.dir 配置的路径作为自己的元数据存储。以下示例中,我们查看一个运行中的Alluxio集群的RocksDB存储,可以见到Alluxio在RocksDB中保存的Inode和Block元数据各有一个存储目录,并维护了由RocksDB管理的数据文件。RocksDB的存储目录结构在本书中不做赘述,读者可以查看RocksDB的官方文档。
$ ls -al -R metastore/metastore/:total 8drwxrwxr-x. 2 alluxio-user alluxio-group 4096 May 21 03:20 blocksdrwxrwxr-x. 2 alluxio-user alluxio-group 4096 May 21 03:33 inodesmetastore/blocks:total 4264-rw-r--r--. 1 alluxio-user alluxio-group 0 May 21 03:20 000005.log-rw-r--r--. 1 alluxio-user alluxio-group 16 May 21 03:20 CURRENT-rw-r--r--. 1 alluxio-user alluxio-group 36 May 21 03:20 IDENTITY-rw-r--r--. 1 alluxio-user alluxio-group 0 May 21 03:20 LOCK-rw-r--r--. 1 alluxio-user alluxio-group 52837 May 21 03:30 LOG-rw-r--r--. 1 alluxio-user alluxio-group 176 May 21 03:20 MANIFEST-000004-rw-r--r--. 1 alluxio-user alluxio-group 13467 May 21 03:20 OPTIONS-000009-rw-r--r--. 1 alluxio-user alluxio-group 13467 May 21 03:20 OPTIONS-000011metastore/inodes:total 4268-rw-r--r--. 1 alluxio-user alluxio-group 0 May 21 03:20 000005.log-rw-r--r--. 1 alluxio-user alluxio-group 1211 May 21 03:33 000012.sst-rw-r--r--. 1 alluxio-user alluxio-group 16 May 21 03:20 CURRENT-rw-r--r--. 1 alluxio-user alluxio-group 36 May 21 03:20 IDENTITY-rw-r--r--. 1 alluxio-user alluxio-group 0 May 21 03:20 LOCK-rw-r--r--. 1 alluxio-user alluxio-group 58083 May 21 03:33 LOG-rw-r--r--. 1 alluxio-user alluxio-group 247 May 21 03:33 MANIFEST-000004-rw-r--r--. 1 alluxio-user alluxio-group 13679 May 21 03:20 OPTIONS-000009-rw-r--r--. 1 alluxio-user alluxio-group 13679 May 21 03:20 OPTIONS-000011
2.3 堆外存储的内存和磁盘占用
在ROCKS模式下,元信息被存储在堆外的RocksDB中,这样会极大地降低元信息存储对Alluxio Master进程的内存压力。与HEAP模式相比,所有的元信息读写从内存速度降低到了硬盘速度,这将会很大程度上影响Alluxio Master的性能和吞吐量。因此Alluxio Master在内存中加入了一个缓存来加速对RocksDB的访问。换言之,在ROCKS模式下,元信息存储的内存占用变成了这部分缓存的内存占用。与HEAP模式下的内存占用估算类似,缓存中每一个文件的元信息存储占用同样的2KB~4KB。
缓存的大小由 alluxio.master.metastore.inode.cache.max.size 控制。这个配置项的值根据Alluxio版本可能有所不同。Alluxio Master会先写入缓存,当缓存达到一定使用量之后才开始写入RocksDB(磁盘)。RocksDB的磁盘占用情况如下:大约100万个文件的元信息占用约4GB的硬盘空间。值得注意的是,当Alluxio命名空间内文件数量未触发基于 alluxio.master.metastore.inode.cache.max.size 的驱逐时,所有文件元信息都在基于内存的缓存内,未写入RocksDB,此时这些文件的元信息磁盘占用接近于0。
2.4 对堆外存储的缓存加速和调优
当内存空间充足时,适当调大 alluxio.master.metastore.inode.cache.max.size 可以将更多文件元信息缓存在内存中来提升性能。同时需注意,Alluxio Master上的RPC操作也会消耗内存。即使没有进行中的RPC操作,Alluxio Master上仍然会有一些定期的文件扫描等内部管理逻辑会消耗内存。在估算Alluxio Master进程中内存时,需要一定要预留足够内存给这些操作,不要让元信息存储占用了所有的内存。这和在服务器上不能把100%的内存都分配给应用而不给操作系统预留内存空间的道理是一样的。元信息缓存的管理是基于水位机制的,用户配置一个高水位参数和一个低水位参数,比如以下是默认配置:
alluxio.master.metastore.inode.cache.high.water.mark.ratio=0.85alluxio.master.metastore.inode.cache.low.water.mark.ratio=0.8
在缓存使用达到 0.85 * alluxio.master.metastore.inode.cache.max.size时,缓存数据会开始驱逐,将缓存中的数据内容写入RocksDB存储。在缓存占用率降低到0.8时停止驱逐。
2.5 在HEAP和ROCKS模式间切换
使用HEAP模式和ROCKS模式下Journal日志的格式不同,因此从一种模式切换到另一种不能通过简单的更改配置并重启Alluxio Master进程来完成。元数据存储模式的切换可以通过从备份中启动集群完成,见4.5章节。
本文以Alluxio为例,简要介绍了分布式文件系统的元数据基本类型及其管理和优化方法,更多的数据访问优化细节可以进一步参考查阅Alluxio开源社区代码,也欢迎阅读最近机械工业出版社出版的技术书籍《分布式统一大数据虚拟文件系统——Alluxio原理、技术与实践》:
本书以广泛使用的Alluxio 2.8.0开源版本为基础编写,深入介绍Alluxio相关分布式统一大数据文件系统的技术原理与实践案例,主要内容包括系统入门与使用、内核组件设计实现原理,同时详细介绍了大型企业应用案例与实践,并附有Alluxio的开源社区开发者指南。本书为Alluxio开源社区用户、高校大数据系统课程师生以及潜在企业用户提供了较为完整的技术指南和实用教程,既可作为大数据专业方向的专业教材,也可作为大数据从业者和研究者的重要专业资料。
特别预告:
9月21日晚20:00,本书三位作者顾荣,刘嘉承,毛宝龙老师将为大家带来“Alluxio: 加速新一代大数据与AI变革”的精彩直播。欢迎关注视频号“IT阅读排行榜”订阅直播提醒。
写作末尾
🌻《分布式统一大数据虚拟文件系统——Alluxio原理、技术与实践》:免费包邮送出
🌴根据博客阅读量本次活动一共赠书若干本,评论区抽取若干位小伙伴免费送出
500-1000 赠书2本
1000-1500 赠书3本
1500-2000 赠书4本
2000+ 赠书5本
🌵参与方式:关注博主、点赞、收藏、评论区任意评论(不低于10个字,被折叠了无法参与抽奖,切记要点赞+收藏,否则抽奖无效,每个人最多评论三次)
🌼活动截止时间:2023-09-25 12:00:00
🍒开奖时间:2023-09-25 14:00:00
🍀中奖通知方式:私信通知
🍉兑奖方式:截图证明
相关文章:
分布式文件系统的新兴力量:揭秘Alluxio的元数据管理机制【文末送书】
文章目录 写在前面01 分布式文件系统元数据的常见类型1.1 文件(inode)元数据1.2 数据块(block)元数据1.3 Worker元数据 02 分布式文件系统元数据的存储模式2.1 元数据存储在堆上(HEAP模式)2.2 元数据存储在…...
ArcGIS标注的各种用法和示例
标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节,内容比较杂,想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】,在【标注】选项卡下勾选【标注此图层中的的要素】,在【文本字符串】栏中…...
修改ros中的控制器,便于仿真和驱动真实UR
UR机械臂学习(5-3):驱动ur机械臂实物——问题及解决_error: 鈥榰r_msgs::setpayloadrequest {aka struct ur__冰激凌啊的博客-程序员宝宝 - 程序员宝宝 (cxybb.com) 问题5 Action client not connected: scaled_pos_traj_controller/follow_j…...
网络广播模块2*30W 智能4G广播终端开发模块
SV-704UG 4G网络广播模块2*30W 智能4G广播终端开发模块 一、描述 SV-704UG网络音频模块是一款带2*30W功放输出的4G广播音频模块,采用高性能ARM处理器及专业Codec,能接收4G广播音频数据流,转换成音频模拟信号输出。带有一路line in输入&#…...
优思学院|什么是精益项目管理?
正确地使用精益思想和技术是可以减少项目中的浪费、提高客户满意度,并提高项目的利润率。 在现实世界中,项目经理的工作充满了挑战。他们不仅需要专注于产品和团队,还必须确保客户的满意度。同时,他们还必须与矩阵组织打交道&…...
【Android取证篇】华为设备跳出“允许USB调试“界面方法的不同方法
【Android取证篇】华为设备跳出"允许USB调试"界面方法的不同方法 华为设备在鸿蒙OS3系统之后,部分设备启用"允许USB调试"方式会有所变化,再次做个记录—【蘇小沐】 1.实验环境 系统版本Windows 11 专业工作站版22H2(2…...
在VSCode中移除不必要的扩展
在VSCode中移除不必要的扩展 在VSCode中安装扩展是编辑器缓慢且耗电的主要原因之一,因为添加的每个新扩展都会增加应用程序的内存和 CPU 使用率。 VSCode现在已经具备了非常多的功能,我们可以将一些重复工作的扩展移除掉。卸载这些现在可有可无的扩展将…...
算法刷题记录-树(LeetCode)
783. Minimum Distance Between BST Nodes 思路(DFS 中序遍历) 考虑中序遍历的性质即可 代码 class Solution { public:int min_diffnumeric_limits<int>::max();int prevnumeric_limits<int>::min()100000;int minDiffInBST(TreeNode* root) {inorderTraversa…...
Linux中安装MySQL_图解_2023新
1.卸载 为了避免不必要的错误发生,先将原有的文件包进行查询并卸载 // 查询 rpm -qa | grep mysql rpm -qa | grep mari// 卸载 rpm -e 文件名 --nodeps2.将安装包上传到指定文件夹中 这里采用的是Xftp 3.将安装包进行解压 tar -zxvf 文件名 -C 解压路径4.获取解压的全路…...
生产设备上的静电该如何处理?
在工厂生产车间里有很多机械设备,在生产运作过程中,难免会产生大量静电,静电会产生许多危害。 例如,1、会使电子设备故障、误操作而引起的电磁干扰。 2、电子元件或集成电路的静电击穿; 3、高压静电放电引起触电; 4、静电放电引起…...
山洪灾害预警方案(山洪预警解决方案的组成)
随着气候变化的不断加剧,山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害,我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案,并成功在某地区进行了部署。 案…...
数据库 MVCC 详解
目录 1. 什么是 MVCC? 2. MVCC 的好处? 3. 快照读?当前读分别是什么?怎么理解? 3.1 快照读 3.2 当前读 4. 数据库的四种隔离级别 5. MVCC 实现原理 5.1 隐藏字段 5.2 undo log(版本链) 5.3 readView 6. re…...
process.nextTick和vue的nextTick区别
事情的起因是代码里用了nextTick,然后提交代码的时候才发现,引入的是process的,然后改成了使用vue的nextTick发现效果不生效了,然后百度查了查两者的区别: process.nextTick是nodejs自带的,而在浏览器中执…...
小程序实现一个 倒计时组件
小程序实现一个 倒计时组件 需求背景 要做一个倒计时,可能是天级别,也可能是日级别,时级别,而且每个有效订单都要用,就做成组件了 效果图 需求分析 需要一个未来的时间戳,或者在服务度直接下发一个未来…...
【四万字】网络编程接口 Socket API 解读大全
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。…...
无涯教程-JavaScript - ISREF函数
描述 如果指定的值是参考,则ISREF函数返回逻辑值TRUE。否则返回FALSE。 语法 ISREF (value) 争论 Argument描述Required/OptionalvalueA reference to a cell.Required Notes 您可以在执行任何操作之前使用此功能测试单元格的内容。 适用性 Excel 2007,Excel 2010,Exce…...
Android:获取MAC < 安卓系统11 <= 获取UUID
1.核心代码 主要的UseMac.java import android.annotation.SuppressLint; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import an…...
线程的几种状态
目标: 1. 线程的几种状态的含义 2. 状态之间的切换条件 目录 新建(new)线程 可运行(Runnable)状态 运行(Running)状态 阻塞(Blocked)状态 等待(Waiting…...
kubernetes集群yaml文件与kubectl工具
k8s集群中对资源管理和资源对象编排部署都可以通过声明样式(yaml)文件来解决,也就是可以把需要对资源对象操作编辑到yaml格式文件中,我们把文件叫做资源清单文件,通过kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署…...
python基础语法(三)
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️🐿️🐿️C语言例题 🐣🐓🏀python 运…...
Haproxy集群与常见的Web集群调度器
文章目录 1. Web集群调度器概述1.1 Web集群调度器简介1.2 调度器类别1.2.1 常用软件类1.2.2 常用硬件类 2. Haproxy软件介绍2.1 Haproxy简介2.2 支持功能2.3 主要特性2.4 常用调度算法2.4.1 轮询:RR(Round Robin)2.4.2 最小连接数:…...
centos免密登录
centos免密登录 小白教程,一看就会,一做就成。 1.知道服务器密码的情况 ssh-keygen -t rsa #上面的命令后三次回车#然后把想要免密登录的服务器加进来 ssh-copy-id -i /root/.ssh/id_rsa.pub root192.168.10.115 #免密码登录被控的主机(ip是…...
学Python的漫画漫步进阶 -- 第十四步
学Python的漫画漫步进阶 -- 第十四步 十四、网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS 14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求 14.4 JSON数据14.4.1 JSON文档的结构14.4.2 JSON数据…...
OpenCV(四十二):Harris角点检测
1.Harris角点介绍 什么是角点? 角点指的是两条边的交点,图中红色圈起来的点就是角点。 Harris角点检测原理:首先定义一个矩形区域,然后将这个矩形区域放置在我的图像中,求取这个区域内所有的像素值之和,之…...
C++数据结构题:DS 顺序表--连续操作
建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为 1000 ) 该类具有以下成员函数: 构造函数:实现顺序表的初始化。 插入多个数据的 multiinsert(int i, int n, int item[]) 函数,实…...
DM@命题公式@主范式的性质和应用@数理逻辑解决数字电路全加器问题
文章目录 abstract主合取范式与主析取范式间的关系👺主范式存在及唯一性定理例 主范式的性质👺求公式的成真与成假赋值主析取范式直接得到主合取范式 判断公式的类型 n n n元命题公式的主析取范式(主合取范式)的个数判断两个命题公式是否等值 给出一个满…...
基于微信小程序+Springboot线上租房平台设计和实现【三端实现小程序+WEB响应式用户前端+后端管理】
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
Xilinx FPGA 7系列 GTX/GTH Transceivers (2)--IBERT
IBERT GTX IBERT核心提供了基础广泛的物理介质附件(PMA)评估7系列FPGA GTX收发器的演示平台。可参数化以使用不同GTX收发器和时钟拓扑,IBERT核心也可以定制使用不同的线速率、参考时钟速率和逻辑宽度。数据模式生成器和每个所需的GTX收发器都包含了检查程序,给出了几个不同…...
Python 文件介绍和正则表达式
文章目录 Python 文件和正则表达式文件打开文件读取文件直接读取 read():逐行读取采用 **for** 循环:采用 readlines(): 正则表达式匹配规则re 模块match 方法:search 方法group 方法split 方法编译:compile 方法 Pyth…...
ueditor百度富文本编辑器粘贴后html丢失class和style样式
问题 项目经理从123在线编辑上排版好的文章,粘贴到项目的编辑器上,样式完全乱了, 排版是这样的: 复制到ueditor后的格式: 这天差地别呀,于是打开代码模式,发现section的属性全没了 但是,sp…...
wordpress英文模板下载地址/网络营销是指
一.编程题 跳石板_牛客题霸_牛客网 (nowcoder.com) 1.题意: N 4,M 24 每次只能跳N的约数(不包含1和N本身) 4->6->8->12->18->24 2.准备一个数组stepNum[ M1 ] 数组中每一个元素代表:从起点到这一步…...
网站需要备案才能建设吗/长沙网站优化培训
chmod -R 777 wechatbaoan/ npm run build service nginx reload 第一步: 上传文件 第二步: npm install (配置文件) 第三步 npm run start 查看端口: netstat -apn | grep 8080 转载于:https://www.cnblogs.com/xiaox…...
个人电子商务网站建设/即时热榜
代码补全失效,编译器选项重设一下补全延迟。看清楚用if还是else if,比如if(a<b){ab} else if(ab){} 不用else意思完全不一样。for里套while注意for里i的自增。运行超时该clang;typedef long long ll;函数要改变实参加引用。排序题id直接写成string类型…...
网站开发合同 doc/网络服务商电话
排队论模型(一):基本概念、输入过程与服务时间的常用概率分布 排队论模型(二):生灭过程 、 M / M /s 等待制排队模型、多服务台模型 排队论模型(三):M / M / s/ s 损失…...
网站建设预算费用/51link友链
以10为底的log函数:形式为 double log10(double x)以e为底的log函数(即 ln)double log (double x)如何表达log 以a为底b的对数:用换底公式:可以表达为:log(a)/log(b)#include#includeusing namespace std;int main(){double a3.…...
哪个网站可以代做试题/网络营销推广方案有哪些
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!小猿会从最基…...