HDFS读写机制深度解析:分布式存储的核心奥秘 - 指南

news/2025/9/23 13:23:53/文章来源:https://www.cnblogs.com/wzzkaifa/p/19107023

在这里插入图片描述

目录

  • HDFS读写机制深度解析:分布式存储的核心奥秘
    • 摘要
    • 1. HDFS架构概览
      • 1.1 核心组件解析
      • 1.2 数据块管理机制
    • 2. HDFS写入机制深度剖析
      • 2.1 写入流程概述
      • 2.2 副本放置策略
    • 3. HDFS读取机制详解
      • 3.1 读取流程实现
      • 3.2 读取性能优化
    • 4. 容错机制与数据一致性
      • 4.1 故障检测与恢复
      • 4.2 性能对比分析
    • 5. 性能优化最佳实践
      • 5.1 配置优化
      • 5.2 应用层优化
    • 6. 监控与运维
      • 6.1 关键指标监控
      • 6.2 运维自动化
    • 总结
    • 参考链接
    • 关键词标签

HDFS读写机制深度解析:分布式存储的核心奥秘

你好,我是 励志成为糕手 !
在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨
每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河;
️ 每一个算法都是我绘制的星图,指引着数据流动的最短路径;
每一次调试都是星际对话,用耐心和智慧解开宇宙的谜题。
准备好开始我们的星际编码之旅了吗?

摘要

作为一名在大数据领域摸爬滚打的技术人,我深深被HDFS(Hadoop Distributed File System)的设计哲学所震撼。HDFS作为Hadoop生态系统的核心组件,承载着海量数据存储的重任,其读写机制的精妙设计堪称分布式系统的典范之作。

在我的实践中,我发现许多开发者对HDFS的理解往往停留在表面,认为它只是一个简单的分布式文件系统。然而,当我深入研究其内部机制时,才真正领悟到其设计的精妙之处。HDFS通过NameNode和DataNode的协同工作,实现了高可靠性、高吞吐量的数据存储服务,其读写流程的每一个环节都体现了分布式系统设计的智慧。

从架构层面来看,HDFS采用主从架构模式,NameNode作为元数据管理中心,负责维护文件系统的命名空间和文件块的位置信息;DataNode则作为数据存储节点,负责实际的数据块存储和读写操作。这种设计不仅保证了系统的可扩展性,还通过数据副本机制确保了数据的高可用性。

在写入机制方面,HDFS采用了流水线复制策略,客户端将数据写入第一个DataNode后,该节点会自动将数据复制到下一个节点,形成一条数据流水线。这种设计既保证了写入性能,又确保了数据的可靠性。而在读取机制中,HDFS通过就近原则选择最优的DataNode进行数据读取,最大化了网络带宽的利用效率。

1. HDFS架构概览

1.1 核心组件解析

HDFS采用主从架构设计,主要包含以下核心组件:

// HDFS核心组件示例
public class HDFSArchitecture
{
// NameNode:元数据管理节点
private NameNode nameNode;
// DataNode:数据存储节点集合
private List<
DataNode> dataNodes;
// Secondary NameNode:辅助NameNode
private SecondaryNameNode secondaryNameNode;
public HDFSArchitecture() {
this.nameNode = new NameNode();
this.dataNodes = new ArrayList<
>();
this.secondaryNameNode = new SecondaryNameNode();
}
// 初始化HDFS集群
public void initializeCluster() {
nameNode.format();
// 格式化NameNode
startDataNodes();
// 启动DataNode集群
establishHeartbeat();
// 建立心跳机制
}
}

关键点解析:

  • NameNode负责维护文件系统树和文件块映射关系
  • DataNode集合提供分布式存储能力
  • Secondary NameNode定期合并编辑日志,减轻NameNode负担
HDFS集群架构
DataNode集群
NameNode
元数据管理
HDFS客户端
读写请求
DataNode-1
数据存储
DataNode-2
数据存储
DataNode-3
数据存储
Secondary NameNode
辅助节点

图1:HDFS集群架构图 - 展示核心组件及其关系

1.2 数据块管理机制

HDFS将大文件切分为固定大小的数据块(默认128MB),每个数据块在集群中存储多个副本:

public class BlockManager
{
private static final long DEFAULT_BLOCK_SIZE = 128 * 1024 * 1024;
// 128MB
private static final int DEFAULT_REPLICATION = 3;
// 默认副本数
// 数据块信息
public static class BlockInfo
{
private long blockId;
private long blockSize;
private List<
DataNodeInfo> replicas;
private long timestamp;
public BlockInfo(long blockId, long blockSize) {
this.blockId = blockId;
this.blockSize = blockSize;
this.replicas = new ArrayList<
>();
this.timestamp = System.currentTimeMillis();
}
}
// 副本放置策略
public List<
DataNodeInfo> selectDataNodes(int replicationFactor) {
List<
DataNodeInfo> selectedNodes = new ArrayList<
>();
// 第一个副本:选择本地机架的节点
DataNodeInfo firstReplica = selectLocalRackNode();
selectedNodes.add(firstReplica);
// 第二个副本:选择不同机架的节点
DataNodeInfo secondReplica = selectDifferentRackNode(firstReplica);
selectedNodes.add(secondReplica);
// 第三个副本:选择第二个副本同机架的不同节点
DataNodeInfo thirdReplica = selectSameRackDifferentNode(secondReplica);
selectedNodes.add(thirdReplica);
return selectedNodes;
}
}

关键设计思想:

  • 大文件切分为固定块大小,便于并行处理
  • 多副本机制确保数据可靠性
  • 机架感知的副本放置策略优化网络传输

2. HDFS写入机制深度剖析

2.1 写入流程概述

HDFS的写入过程采用流水线复制机制,确保数据的高效写入和可靠存储:

public class HDFSWriteProcess
{
private NameNode nameNode;
private List<
DataNode> dataNodes;
// 文件写入主流程
public void writeFile(String fileName, byte[] data) throws IOException {
// 1. 向NameNode请求创建文件
FileStatus fileStatus = nameNode.create(fileName);
// 2. 将数据切分为数据块
List<
DataBlock> blocks = splitDataIntoBlocks(data);
// 3. 为每个数据块分配DataNode
for (DataBlock block : blocks) {
List<
DataNode> targetNodes = nameNode.allocateDataNodes(3);
// 4. 建立数据流水线
DataPipeline pipeline = createPipeline(targetNodes);
// 5. 写入数据块
writeBlockToPipeline(block, pipeline);
// 6. 确认写入完成
confirmBlockWrite(block.getBlockId());
}
// 7. 关闭文件
nameNode.completeFile(fileName);
}
// 创建数据流水线
private DataPipeline createPipeline(List<
DataNode> nodes) {
DataPipeline pipeline = new DataPipeline();
// 建立节点间的连接
for (int i = 0; i < nodes.size() - 1; i++) {
DataNode current = nodes.get(i);
DataNode next = nodes.get(i + 1);
current.connectToNext(next);
}
return pipeline;
}
// 流水线写入数据
private void writeBlockToPipeline(DataBlock block, DataPipeline pipeline) {
try {
// 将数据包发送到第一个DataNode
DataNode firstNode = pipeline.getFirstNode();
firstNode.writePacket(block.getData());
// 等待所有节点确认写入
pipeline.waitForAcknowledgment();
} catch (IOException e) {
// 处理写入失败,重新选择DataNode
handleWriteFailure(block, pipeline);
}
}
}

流水线写入的优势:

  • 并行写入多个副本,提高写入效率
  • 网络带宽利用最优化
  • 故障节点自动剔除,保证写入成功
HDFS客户端NameNodeDataNode1DataNode2DataNode31. 请求创建文件2. 返回文件句柄3. 请求数据块位置4. 返回DataNode列表5. 建立数据流水线6. 连接下游节点7. 连接下游节点8. 发送数据包9. 转发数据包10. 转发数据包11. 确认写入12. 确认写入13. 确认写入14. 完成文件写入HDFS客户端NameNodeDataNode1DataNode2DataNode3

图2:HDFS写入流程时序图 - 展示完整的数据写入交互过程

2.2 副本放置策略

HDFS采用机架感知的副本放置策略,平衡数据可靠性和网络效率:

副本序号放置策略目的
第1个副本客户端本地节点或随机节点最小化写入延迟
第2个副本不同机架的随机节点提高容错能力
第3个副本第2个副本同机架的不同节点平衡可靠性和网络开销

3. HDFS读取机制详解

3.1 读取流程实现

HDFS的读取过程通过就近原则和并行读取优化性能:

public class HDFSReadProcess
{
private NameNode nameNode;
private NetworkTopology networkTopology;
// 文件读取主流程
public byte[] readFile(String fileName) throws IOException {
// 1. 从NameNode获取文件元数据
FileMetadata metadata = nameNode.getFileMetadata(fileName);
List<
BlockLocation> blockLocations = metadata.getBlockLocations();
// 2. 并行读取所有数据块
List<
Future<
byte[]>> futures = new ArrayList<
>();
ExecutorService executor = Executors.newFixedThreadPool(10);
for (BlockLocation blockLocation : blockLocations) {
Future<
byte[]> future = executor.submit(() ->
{
return readBlock(blockLocation);
});
futures.add(future);
}
// 3. 合并数据块
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
for (Future<
byte[]> future : futures) {
byte[] blockData = future.get();
outputStream.write(blockData);
}
executor.shutdown();
return outputStream.toByteArray();
}
// 读取单个数据块
private byte[] readBlock(BlockLocation blockLocation) throws IOException {
// 选择最优DataNode
DataNode bestNode = selectBestDataNode(blockLocation.getDataNodes());
try {
// 从最优节点读取数据
return bestNode.readBlock(blockLocation.getBlockId());
} catch (IOException e) {
// 故障转移到其他副本
return readFromAlternativeNode(blockLocation, bestNode);
}
}
// 选择最优DataNode
private DataNode selectBestDataNode(List<
DataNode> candidates) {
DataNode clientNode = getCurrentClientNode();
// 优先级:本地节点 > 同机架节点 > 其他机架节点
for (DataNode node : candidates) {
if (node.equals(clientNode)) {
return node;
// 本地节点
}
}
for (DataNode node : candidates) {
if (networkTopology.isOnSameRack(clientNode, node)) {
return node;
// 同机架节点
}
}
return candidates.get(0);
// 其他机架节点
}
}

读取优化策略:

  • 就近原则选择DataNode,减少网络延迟
  • 并行读取多个数据块,提高吞吐量
  • 自动故障转移,保证读取成功

3.2 读取性能优化

public class ReadOptimization
{
private static final int BUFFER_SIZE = 64 * 1024;
// 64KB缓冲区
private LRUCache<
String, byte[]> blockCache;
// 块缓存
// 带缓存的块读取
public byte[] readBlockWithCache(String blockId) {
// 1. 检查缓存
byte[] cachedData = blockCache.get(blockId);
if (cachedData != null) {
return cachedData;
}
// 2. 从DataNode读取
byte[] blockData = readBlockFromDataNode(blockId);
// 3. 更新缓存
blockCache.put(blockId, blockData);
return blockData;
}
// 预读取机制
public void prefetchBlocks(List<
String> blockIds) {
ExecutorService prefetchExecutor = Executors.newFixedThreadPool(5);
for (String blockId : blockIds) {
prefetchExecutor.submit(() ->
{
if (!blockCache.containsKey(blockId)) {
byte[] data = readBlockFromDataNode(blockId);
blockCache.put(blockId, data);
}
});
}
}
}

4. 容错机制与数据一致性

4.1 故障检测与恢复

HDFS通过心跳机制和数据校验确保系统的高可用性:

public class FaultTolerance
{
private static final long HEARTBEAT_INTERVAL = 3000;
// 3秒心跳间隔
private static final long STALE_DATANODE_INTERVAL = 30000;
// 30秒判定为过期
// 心跳监控
public class HeartbeatMonitor
{
private Map<
String, Long> lastHeartbeatTime;
private ScheduledExecutorService scheduler;
public void startMonitoring() {
scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(this::checkDataNodeHealth,
0, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS);
}
private void checkDataNodeHealth() {
long currentTime = System.currentTimeMillis();
for (Map.Entry<
String, Long> entry : lastHeartbeatTime.entrySet()) {
String nodeId = entry.getKey();
long lastHeartbeat = entry.getValue();
if (currentTime - lastHeartbeat >
STALE_DATANODE_INTERVAL) {
handleStaleDataNode(nodeId);
}
}
}
private void handleStaleDataNode(String nodeId) {
// 1. 标记节点为不可用
markNodeAsUnavailable(nodeId);
// 2. 触发块复制
triggerBlockReplication(nodeId);
// 3. 更新块位置信息
updateBlockLocations(nodeId);
}
}
// 数据校验
public boolean verifyBlockIntegrity(String blockId, byte[] data) {
// 计算数据校验和
CRC32 crc = new CRC32();
crc.update(data);
long calculatedChecksum = crc.getValue();
// 获取存储的校验和
long storedChecksum = getStoredChecksum(blockId);
return calculatedChecksum == storedChecksum;
}
}

容错机制特点:

  • 实时心跳监控,快速发现故障节点
  • 自动数据复制,维持副本数量
  • 校验和机制,确保数据完整性
DataNode心跳检测
节点是否响应?
更新心跳时间
标记为过期节点
检查副本数量
副本数是否充足?
监控恢复状态
触发副本复制
选择源DataNode
选择目标DataNode
执行块复制
更新元数据
验证复制完成
继续监控

图3:HDFS故障恢复流程图 - 展示完整的容错处理机制

4.2 性能对比分析

不同存储方案的性能对比:

22%16%19%23%20%存储方案性能评分对比HDFS分布式存储传统关系数据库对象存储服务内存数据库SSD固态存储

图4:存储性能对比图 - HDFS vs 传统存储 vs 对象存储

5. 性能优化最佳实践

5.1 配置优化

关键配置参数对比:

参数名称默认值推荐值说明
dfs.blocksize128MB256MB大文件场景下提高效率
dfs.replication33-5根据可靠性需求调整
dfs.namenode.handler.count1020-50提高并发处理能力
dfs.datanode.max.transfer.threads40968192增加传输线程数

5.2 应用层优化

public class HDFSOptimization
{
// 批量操作优化
public void batchWrite(List<
FileData> files) {
// 使用MultipleOutputs进行批量写入
Configuration conf = new Configuration();
conf.setInt("dfs.blocksize", 256 * 1024 * 1024);
// 256MB块大小
try (FileSystem fs = FileSystem.get(conf)) {
for (FileData fileData : files) {
Path outputPath = new Path(fileData.getPath());
// 使用缓冲写入
try (BufferedOutputStream bos = new BufferedOutputStream(
fs.create(outputPath, true, 65536))) {
// 64KB缓冲区
bos.write(fileData.getData());
}
}
} catch (IOException e) {
handleWriteException(e);
}
}
// 并行读取优化
public Map<
String, byte[]>
parallelRead(List<
String> filePaths) {
Map<
String, byte[]> results = new ConcurrentHashMap<
>();
filePaths.parallelStream().forEach(path ->
{
try {
byte[] data = readFileOptimized(path);
results.put(path, data);
} catch (IOException e) {
logger.error("Failed to read file: " + path, e);
}
});
return results;
}
}

最佳实践原则

“在分布式系统中,没有银弹,只有权衡。HDFS的设计哲学告诉我们:通过合理的架构设计和优化策略,可以在可靠性、性能和成本之间找到最佳平衡点。”

6. 监控与运维

6.1 关键指标监控

public class HDFSMonitoring
{
// 关键性能指标
public class MetricsCollector
{
private MeterRegistry meterRegistry;
public void collectMetrics() {
// 1. 存储容量指标
Gauge.builder("hdfs.capacity.total")
.register(meterRegistry, this, m ->
getTotalCapacity());
Gauge.builder("hdfs.capacity.used")
.register(meterRegistry, this, m ->
getUsedCapacity());
// 2. 读写性能指标
Timer.builder("hdfs.read.latency")
.register(meterRegistry);
Timer.builder("hdfs.write.latency")
.register(meterRegistry);
// 3. 节点健康指标
Gauge.builder("hdfs.datanodes.live")
.register(meterRegistry, this, m ->
getLiveDataNodes());
Gauge.builder("hdfs.datanodes.dead")
.register(meterRegistry, this, m ->
getDeadDataNodes());
}
}
}

6.2 运维自动化

30%25%20%15%10%HDFS运维工作分布监控告警容量管理性能优化故障处理备份恢复

图5:HDFS运维工作分布饼图 - 展示各项运维工作的重要性占比

总结

回顾这次HDFS读写机制的深度探索之旅,我深深感受到分布式系统设计的精妙与复杂。作为一名技术探索者,我见证了HDFS如何通过巧妙的架构设计解决了大数据存储的核心挑战。

从技术架构层面来看,HDFS的主从架构模式为我们提供了分布式系统设计的经典范例。NameNode作为元数据管理中心,承担着整个文件系统的"大脑"职责,而DataNode集群则如同"肌肉",提供强大的存储能力。这种职责分离的设计不仅保证了系统的可扩展性,更为后续的优化和演进奠定了坚实基础。

在写入机制的研究中,我被流水线复制策略的设计理念深深震撼。这种机制不仅实现了数据的高效写入,更通过副本放置策略在数据可靠性和网络效率之间找到了完美平衡。每当我看到数据在节点间如流水般传递时,都能感受到分布式系统设计者的智慧结晶。

读取机制的就近原则体现了系统设计中"局部性原理"的重要性。通过网络拓扑感知和智能节点选择,HDFS最大化了数据访问效率,这种设计思想在现代分布式系统中仍然具有重要的指导意义。

容错机制的设计更是让我深刻理解了"故障是常态"这一分布式系统的基本假设。心跳监控、自动故障转移、数据校验等机制的有机结合,构建了一个自愈能力强大的存储系统。这种设计哲学告诉我们,优秀的系统不是不出故障,而是能够优雅地处理故障。

通过性能优化实践,我认识到理论与实践的结合是技术成长的关键。配置调优、应用层优化、监控运维等各个环节都需要深入理解系统原理,才能做出正确的技术决策。

参考链接

  1. Apache Hadoop官方文档
  2. HDFS架构设计论文
  3. Hadoop权威指南
  4. 分布式系统原理与范型
  5. 大数据技术栈深度解析

关键词标签

#HDFS#分布式存储#Hadoop生态#大数据架构#容错机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么样增加网站权重上海工商网官网登录

一、Pyinstaller简介 PyInstaller将Python应用程序冻结(打包)独立可执行文件中。它可以构建较小的可执行文件,它是完全多平台的,并且使用OS支持来加载动态库,从而确保完全兼容。 二、Pyinstaller安装 1、下载安装 首先安装“pip install pywin32” 其次“pip install …

python做网站挣钱如何知道网站开发语言

到软件园这边已经好几个月了&#xff0c;以前.Net的相关的一些东西都慢慢的没怎么接触了。而我去一直在关心相关的东西。以前订阅的一些东西还是很有用的&#xff0c;收集一些相关的资料&#xff0c;也了解一些相关的培训信息。值得欣慰的是&#xff0c;很多培训都是在软件园这…

现在c 做网站用什么焦作网站设计

前期准备(1)专业版Pycharm(社区版没有deployment功能)&#xff0c;学生&#xff0c;教师可申请免费专业版&#xff0c;详情可看我的博客。(2)可通过SSH连接Ubuntu服务器&#xff0c;并且服务器安装了Python解释器。部署本地Pycharm项目到Ubuntu服务器1.点击Tools - Deployment …

比较专业的建设网站的公司网站架构设计师面试技巧

目录 一、问题描述 二、解决方案 1、理论知识 &#xff08;1&#xff09;.iml 文件 &#xff08;2&#xff09;.idea文件 2、操作环境 3、操作步骤 &#xff08;1&#xff09;找到【Maven】工具按钮 &#xff08;2&#xff09;点图标&#xff0c;重复导入maven项目&am…

dw如何制作自己的网站源码屋官网

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

电话网站源码wordpress做站群

大模型日报 2024-06-16 大模型资讯 大模型产品 MARS5 TTS&#xff1a;开源高拟真语音合成 摘要: MARS5 TTS是一款开源语音合成模型&#xff0c;能以2-3秒音频为参考&#xff0c;在140多种语言中复制高难度场景&#xff0c;如体育解说、电影和动漫等。 AI工具首发平台&#xff1…

网站收录有什么用惠州网站优化建设

我做一个猜测&#xff0c;但如果你想要一个实际的握手发生&#xff0c;你必须让Android知道你的证书。如果你想只接受无论什么&#xff0c;然后使用这个伪代码来获得你需要与Apache HTTP客户端&#xff1a;SchemeRegistry schemeRegistry new SchemeRegistry ();schemeRegistr…

个人建什么网站好西地那非最佳起效时间

H&#xff0e;264的码率控制算法采用了多种技术&#xff0c;其中包括自适应基本单元层(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、线性MAD模型、二次率失真模型等。并且采用了分层码率控制策略&#xff0c;共分为三层&#xff1a;GOP层、帧层和基本单元…

网站及推广本地wordpress很慢

二分查找函数 写一个二分查找函数 功能&#xff1a;在一个升序数组中查找指定的数值&#xff0c;找到了就返回下标&#xff0c;找不到就返回-1。 int bin_search(int arr[], int left, int right, int key) {int mid 0;while (left < right) {mid (right left) / 2;if…

debian13 无法正常从休眠中恢复

debian13 无法正常从休眠中恢复运行 sudo dmesg发现 [ 14.424201] PM: Image signature found, resuming [ 14.424212] PM: hibernation: resume from hibernation [ 14.424940] random: crng reseeded on syste…

【五行】根据天干、地支、生肖起姓名(9月出生的宝宝可参考)

鲁迅的《故乡》中有此词: 人民教育出版社 六年级上册 第17课《少年闰土》中有相关句子(第三自然段),句子如下: 我的父亲允许了;我也很高兴,因为我早听到闰土这名字,而且知道他和我仿佛年纪,闰月生的,五行缺土…

全差分放大器(FDA)电路设计计算问题及电压范围估算[原创www.cnblogs.com/helesheng]

本文讨论了全差分放大器用途,电路设计的基本原则,以及输入共模电压限制带来的使用问题。一、全差分放大器(FDA)的基本原理 从信号中去除或者向信号中加入共模信号需要用到减法器电路,如下图所示。这是个教科书上的…

大连建立网站公司网站建设首页需要哪些元素

ok了家人们&#xff0c;今天我们学习了面向对象中关键字的使用和抽象类&#xff0c;话不多说&#xff0c;我们一起看看吧&#xff0c;&#xff08;今天终于星期五了&#xff0c;芜湖&#xff01;&#xff01;&#xff01;&#xff09; 一&#xff0c;this和super关键字 1&…

原型图网站在线网站免费网站入口

越来越多的用户升级了win11系统使用&#xff0c;然而有些用户发现电脑更新到win11后不能上网了&#xff0c;这是怎么回事呢?而且奇怪的是&#xff0c;网络状态显示已连接&#xff0c;但就是无法上网&#xff0c;原本以为重置网络就能搞定&#xff0c;但结果相反。针对这一情况…

网站开发 工具最吸引人的广告图片

一道水题&#xff0c;居然改错改了一个多小时 题目的意思是其实就是找出一个单词&#xff0c;前半部是一个出现过的单词&#xff0c;后半部也是&#xff0c;记住&#xff0c;要严格满足这个条件 所以&#xff0c;其实也就是先查找一个单词的是否有前缀&#xff0c;再用这个单词…

什么星网站做调查问卷的wordpress cms

目的&#xff1a;学习笔记2.首先我们试着爬取下来一篇文章的评论&#xff0c;通过搜索发现在 response里面我们并没有匹配到评论&#xff0c;说明评论是动态加载的。3.此时我们清空请求&#xff0c;收起评论&#xff0c;再次打开评论 4.完成上面操作后&#xff0c;我们选择XHR&…

icon psd下载网站重庆建设工程信息网官网app

文章目录 引言01 Linux安装Docker1.安装yum-utils软件包2.安装docker3.启动docker4.设置docker自启动5.配置Docker使用systemd作为默认Cgroup驱动6.重启docker 02 docker部署Flink1.18版本1.拉取最新镜像2.检查镜像3.编写dockerFile文件4.执行dockerFile5.检查flink是否启动成功…

网站关键词推广方案wordpress tomcat

基于SpringBoot的“篮球竞赛预约平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 平台首页界面图 用户注册界面…

网站同步微博河北邢台有几个区县

淘宝商品描述API接口是淘宝开放平台提供的一种高效、便捷的新途径&#xff0c;旨在帮助开发者轻松获取淘宝商品的详细描述信息。通过这一接口&#xff0c;商家、开发者和用户都能获得商品标题、描述、属性、价格、图片等关键信息&#xff0c;从而满足各种业务需求。 在使用淘宝…

详细介绍:Java与Vue构建资产设备全周期管理系统,覆盖采购、入库、使用、维护至报废全流程,支持移动端实时操作与后台智能管理,提供完整源码便于二次开发

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …