尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Hadoop与Spark的信贷风控系统源码解析
简介基于Hadoop与Spark的金融信贷风险控制系统源码面向大数据开发者和金融风控工程师针对海量信贷记录、征信数据与实时申请流并存时的风险量化难题提供一套可运行的工程化参考。压缩包共69个文件大小约72KB其中Java与Scala源码承担数据接入、模型训练和风险评估逻辑XML与properties用于配置Spark/Hadoop运行环境SQL脚本预置建库建表语句另有H5可视化界面便于结果展示。项目按credit-risk-control、data-source-spark-streaming等模块组织覆盖HDFS存储、MapReduce/Spark批处理、Spark Streaming实时计算并集成逻辑回归、随机森林等违约预测算法。源码内含数据库脚本与项目说明文档目录结构清晰便于按数据接入、实时计算、风险展示三条链路快速定位代码。已有1219人学习下载适合具备一定大数据基础、希望在信贷风控场景落地Hadoop与Spark的开发者作为源码研读、二次开发或课程设计的起点。1. 信贷风控上大数据这套源码到底在解决什么金融信贷风控的场景里最尴尬的不是模型不够准而是数据根本喂不进去。传统的单机数据库在百万级客户、上亿笔交易面前一次特征宽表拼接就要跑几个小时稍微一查就是全表扫描业务方要的实时拒绝决策完全给不到。基于Hadoop、Spark的大数据金融信贷风险控系统正是把征信数据、交易流水、还款记录这些散落的数据源统一收进HDFS用Spark做批量清洗和特征工程最终产出风险评分和预警名单。这套源码适合两类人一类是正在做金融大数据课程的毕业生想找一个能落地的项目练手另一类是小贷公司或银行风控团队的开发想直接参考数据分区、权限隔离和评分模型的结构。它解决的核心问题就是让海量信贷数据在分布式环境下跑得动并且让风控规则和模型结果能回溯、可审计。2. 信贷风控系统架构与数据流从原始数据到风险评分的四层链路2.1 为什么选HadoopSpark而不是单机或Flink信贷风控的数据链路有鲜明的批次特征每日凌晨跑批计算逾期标签、月度更新征信特征、季度重训模型。这种场景下Hadoop加Spark是成本最低的可靠组合。HDFS负责海量文件的可靠存储和容错Spark负责把复杂的特征工程和模型训练从单机的内存限制中解放出来。相比Flink这种流式计算引擎Spark的批处理在信贷场景里够用且调优经验更成熟——毕竟你要处理的是T1的数据而不是秒级的反欺诈实时拦截。单机方案在数据量超过千万级时基本不可用尤其是做多表join、窗口函数分组排序的时候OOM和磁盘IO瓶颈会直接拖垮整个跑批。另一个现实原因是生态。Hadoop生态里的Hive、Sqoop、HBase、Zookeeper都和Spark有成熟的整合方案源码里要实现的权限控制、数据脱敏、血缘追踪都能在Hadoop体系里找到对应的组件或配置项。而Flink尽管也在发展但相对Spark在SQL支持和离线调度上还是稍弱尤其对于习惯了编写Spark DataFrame代码的团队迁移成本更高。这套源码的架构决策本质上是在告诉你只要业务没有强实时需求Hadoop加Spark就是当前最稳妥的大数据风控底座。2.2 源码里的数据管道采集、清洗、特征、评分四层设计打开源码包你会看到典型的四层目录结构data_ingest、data_clean、feature_engine、risk_model。这种分层不是拍脑袋每层对应一个可独立调度和排查的环节。采集层负责从业务库拉取数据常见做法是用Sqoop把MySQL里的客户表、交易表增量导入HDFS按日期分区落地成Parquet或ORC格式。清洗层处理缺失值、重复记录、异常交易比如把身份证号不一致的客户做归一化把单笔金额超过均值5个标准差的记录打上异常标记。特征层是核心会把几十张原始表拼接成一张客户特征宽表字段包括近30天交易频次、近90天逾期次数、负债收入比这些风控常用变量。评分层用Spark MLlib跑逻辑回归或随机森林输出每个客户的违约概率再映射成1到100的评分。每一层之间通过Hive表名和日期分区解耦跑批失败时只需要重跑对应分区不用全量重建。源码里还设计了数据质量校验的步骤比如检查特征表是否有全空列、记录数是否跌破阈值这在大数据风控里至关重要——脏数据永远不是模型能解决的。2.3 核心表设计客户、交易、逾期标签、特征宽表在信贷风控系统里表设计直接决定跑批效率和权限边界。源码中至少会有四张核心表表名分区字段存储格式主要字段dim_customerdateParquet客户ID、身份证、年龄、地域、信用额度fact_transactiondateParquet客户ID、交易时间、金额、渠道、商户类别label_overduemonthParquet客户ID、逾期天数、逾期金额、当前状态feature_widedateORC客户ID、特征字段组、标签、评分dim_customer是维度表fact_transaction是事实表label_overdue是模型要预测的目标列也就是未来30天是否逾期。feature_wide是把前三张表join后经过特征衍生生成的宽表里面字段可能上百个这时候列式存储的优势就出来了——查询只需要读取用到的列IO开销大幅下降。特别要注意权限设计。信贷数据敏感不是所有人都能看客户身份证号。常见方案是在Hive层面做列级权限控制比如用户组A只能访问feature_wide里非脱敏字段用户组B能访问全部字段。可以借助Apache Ranger或Ranger的替代方案比如在HiveServer2层面做自定义拦截器也可以简化成视图方式——给不同角色创建不同视图视图里过滤掉身份证、手机号等敏感列。这是大数据行、列权限设计的落地形态源码里一般会提供权限初始化脚本。3. 本地复现这套系统伪分布式环境与Spark集群搭建的最小路径3.1 Hadoop伪分布式搭建与Zookeeper整合最小配置步骤拿到源码后第一步不是在IDE里到处找main方法而是先把Hadoop跑起来。本地开发最常见的做法是搭伪分布式模式一个节点上同时跑NameNode、DataNode和ResourceManager够你调试代码和跑通流程。如果你觉得伪分布式太玩具可以搜“hadoop和zookeeper整合实战”但本地起步我建议还是从伪分布式开始省内存也省时间。我常用的Hadoop版本是2.x或3.xJDK配1.8解压后需要改五个配置文件。以下是一份最小可用的core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/hadoop/data/tmp/value /property /configuration这里把文件系统指向本机9000端口临时目录单独设避免和默认的/tmp冲突导致重启丢数据。hdfs-site.xml需要设置副本数伪分布式下副本数必须改为1否则会一直显示副本缺失configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/home/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/home/hadoop/data/datanode/value /property /configurationNameNode和DataNode的目录分开格式化时不会误清数据。然后配置yarn-site.xml把调度器和资源管理的地址指向本机否则Spark跑在YARN上时会找不到ResourceManagerconfiguration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property /configuration配置好后执行hdfs namenode -format首次格式化目录然后启动服务。伪分布式下我一般直接用sbin/start-dfs.sh和sbin/start-yarn.sh然后用jps确认NameNode、DataNode、ResourceManager和NodeManager四个进程都在。这一步是最容易翻车的常见问题就是/tmp权限、端口被占用、Java版本不兼容。3.2 Spark集群部署与内存参数让作业不OOM源码里的Spark任务通常要跑在YARN上所以单机安装好Spark后主要配置spark-env.sh里的JVM参数和spark-defaults.conf里的executor配置。金融信贷数据特征动辄几百个字段特征宽表的内存占用非常夸张这里我直接把经验参数贴出来spark.masteryarn spark.driver.memory2g spark.driver.cores1 spark.executor.memory4g spark.executor.cores2 spark.executor.instances4 spark.memory.offHeap.enabledtrue spark.memory.offHeap.size2g spark.serializerorg.apache.spark.serializer.KryoSerializer spark.kryoserializer.buffer.max1g spark.sql.shuffle.partitions200driver内存2G够用因为driver不存大数据executor内存4G是为了给shuffle留空间。开堆外内存可以用来缓存广播变量和RDD数据但注意总量别超过物理内存。Kryo序列化能减少内存占用但需要注册类否则会有序列化异常。spark.sql.shuffle.partitions默认200如果你的数据量不大可以降到80否则每个分区任务太碎调度开销反而大。如果你要搭的是完全分布式集群可以采用常见的三节点主从结构一个master节点、两个worker节点。Spark的spark-env.sh里配置SPARK_MASTER_HOST和SPARK_WORKER_CORES、SPARK_WORKER_MEMORY然后在worker节点上启动start-slave.sh。集群部署策略上我建议先把Hadoop的DataNode和Spark的Worker放在同一批物理机上实现数据本地性——这样Spark读取HDFS数据时不需要跨网络拉取跑批速度能快30%以上。3.3 导入源码并跑通第一个信贷评分作业拿到源码后不要直接打包提交先看懂入口脚本。我一般会在项目根目录找一个bin/run_model.sh之类的脚本里面写着主类、依赖jar包和参数。例如常见的启动命令spark-submit \ --class com.risk.engine.OverdueTrain \ --master yarn \ --deploy-mode client \ --executor-memory 4g \ --num-executors 4 \ risk-model-1.0.0.jar \ --input hdfs://localhost:9000/user/risk/feature_wide \ --output hdfs://localhost:9000/user/risk/model参数里--input是特征宽表路径--output是模型输出路径。第一次跑之前要先准备好数据源码里通常会带一个dataset目录或生成脚本。如果没有数据我建议自己写一个小脚本造100万行模拟交易数据字段尽量仿真不然核心逻辑根本验证不了。跑的时候盯住YARN日志。第一次跑大概率会报错找不到依赖包、HDFS路径权限不足、或是Spark版本冲突。常见做法是把所有依赖打进一个jar或者用--jars指定外部包。伪分布式下HDFS默认端口9000要确保源码里的路径前缀和你实际fs.defaultFS一致否则会报FileNotFoundException。跑通后在输出路径下能看到模型文件和评分结果一堆part-xxxxx文件。这时候基本平台就能动了下一步才是深入看代码。4. 核心代码拆解Spark SQL做特征宽表与模型评分4.1 用Spark SQL做宽表拼接与特征衍生风控特征宽表的核心SQL就是多表left join加GroupBy聚合。源码里通常会有一段类似这样的Spark SQL逻辑spark.sql( SELECT c.customer_id, c.age, c.gender, c.credit_limit, COALESCE(tx.txn_cnt_30d, 0) AS txn_cnt_30d, COALESCE(tx.txn_amt_sum_30d, 0) AS txn_amt_sum_30d, COALESCE(od.overdue_days_max, 0) AS overdue_days_max, CASE WHEN od.overdue_days_max 30 THEN 1 ELSE 0 END AS is_bad FROM dim_customer c LEFT JOIN ( SELECT customer_id, COUNT(*) AS txn_cnt_30d, SUM(amt) AS txn_amt_sum_30d FROM fact_transaction WHERE trans_date 2024-06-01 GROUP BY customer_id ) tx ON c.customer_id tx.customer_id LEFT JOIN ( SELECT customer_id, MAX(overdue_days) AS overdue_days_max FROM label_overdue GROUP BY customer_id ) od ON c.customer_id od.customer_id WHERE c.dt 2024-06-30 ).createOrReplaceTempView(feature_wide)这段SQL把客户基本信息、30天交易聚合、历史逾期最大值拼成宽表。注意COALESCE处理空值避免因为部分客户没有交易记录导致聚合结果为null。聚合子查询放在LEFT JOIN里先缩小数据集再做关联比直接join全表快很多。WHERE c.dt限定分区只扫描当天快照避免全表扫描。实际跑的时候如果客户量几千万这种join会产生大量shuffle。我一般会在join前先给fact_transaction按客户ID做repartition或者直接写成bucketBy分桶表让相同客户ID的数据落在同一个分区减少shuffle量。源码里如果没做这一步你会发现跑批时间随数据量线性暴涨这就是需要优化的信号。4.2 风险评分模型逻辑回归的Spark实现与参数信贷风控模型不可能直接拿黑盒算法上线逻辑回归因为可解释性强、性能稳定是源码里评分模块的首选。Spark MLlib的逻辑回归实现大致长这样import org.apache.spark.ml.classification.LogisticRegression import org.apache.spark.ml.feature.VectorAssembler val assembler new VectorAssembler() .setInputCols(Array(feature1, feature2, feature3, ...)) .setOutputCol(features) val lr new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) .setElasticNetParam(0.1) .setLabelCol(is_bad) .setFeaturesCol(features) val pipeline new Pipeline().setStages(Array(assembler, lr)) val model pipeline.fit(trainDF)VectorAssembler把多个特征列合成一个向量逻辑回归训练时用RegParam做L2正则防止过拟合。ElasticNetParam0.1表示在L1和L2之间偏向L2适合特征多但相关性强的场景。训练时要用带标定的训练集is_bad就是前面SQL里计算出的逾期标签。训练完成后模型会输出系数和截距你需要把这些值保存下来用于之后每日评分。源码中一般会有一个score方法加载模型后对新批次的特征表做预测val predictions model.transform(featureDF) predictions.select(customer_id, probability, prediction) .write.mode(overwrite).parquet(hdfs://localhost:9000/user/risk/score_result)预测结果里probability是违约概率可以进一步映射成评分。注意prediction是二分类的0或1生产上不要直接用要取概率值再设阈值。4.3 结果落库与报表Hive分区表与Sqoop导出评分结果通常在HDFS上以Parquet文件存在业务系统要查的话需要导回关系型数据库。常见做法先用Spark SQL把结果写入Hive分区表INSERT OVERWRITE TABLE risk.score_result PARTITION(dt2024-07-01) SELECT customer_id, score, round(probability, 4), 2024-07-01 AS stat_date FROM temp_score_resultHive分区表的好处是按日期快速过滤后续报表只要读特定分区。然后通过Sqoop把分区数据导出到MySQLsqoop export \ --connect jdbc:mysql://localhost:3306/risk \ --username root --password 123456 \ --table score_result \ --export-dir /user/hive/warehouse/risk.db/score_result/dt2024-07-01 \ --input-fields-terminated-by \001Sqoop导出时要注意字段分隔符必须和Hive表的存储格式对应这里\001是Hive默认的字段分隔符。另外主键冲突问题用--update-key customer_id否则有重复数据会插入失败。这项操作是跑批的最后一步一旦导出成功业务方就能在报表平台看到今天的风险名单了。5. 避坑HadoopSpark信贷场景的5个血泪问题5.1 小文件过多导致NameNode内存告警现象每天跑批后HDFS目录下多了几万个part文件NameNode的堆内存居高不下集群响应变慢。原因Spark写入时分区数太多或者Hive表没做合并每次insert overwrite都会生成和task数量相等的文件。解决在写入前用coalesce或repartition(8)控制输出分区数或者在Hive层面设置合并参数。伪分布式下我一般强制写成单个分区文件比如df.coalesce(1).write.parquet(...)。生产集群可以开Hive的hive.merge.mapfilestrue让Map-only任务结束时自动合并小文件。血泪经验是每次跑批后都要检查一下文件个数超过1000个就该触发合并机制了。5.2 Spark内存溢出堆外、序列化和并行度现象跑特征宽表join时频繁报OutOfMemoryError: Java heap space或者直接挂在shuffle阶段。原因特征列太多导致每行数据体积大shuffle时内存缓冲区溢出或者executor内存设太小广播变量没走堆外。解决第一开Kryo序列化整体内存占用能降40%。第二把spark.memory.offHeap.size调大让缓存数据走堆外。第三检查spark.sql.autoBroadcastJoinThreshold如果小表在10G以内让Spark走broadcast join彻底避免shuffle。另外把spark.sql.shuffle.partitions从200调到400每个分区数据量更小不容易压爆单个executor。我遇到过一次一个50G的宽表join因为并行度不够直接OOM加了100个executor并调大offHeap就过了。5.3 数据倾斜在join客户表时翻车现象同一个key比如某个重要客户的数据量巨大导致单个task运行时间异常长其他task都跑完了它还在跑甚至直接OOM。原因客户维度有些头部客户交易量是普通客户的几百倍group by或join时一个分区承载了全部倾斜key。解决常见做法是给倾斜key加随机前缀再拆分。比如对客户ID做哈希后加一个10以内的随机后缀让数据分布到更多分区跑完再按结果聚合。我在SQL里一般先找出top100的客户ID把这些客户手动均匀打散到多个reduce任务里。还有一种简单办法是广播维度表如果维度表不大用小表广播就不会有倾斜问题。注意不要对所有key做随机化否则正常客户也被拆散了导致聚合逻辑复杂。5.4 伪分布式下跑源码的权限与端口坑现象第一次跑spark-submit报AccessControlException: Permission denied或者连接localhost:9000被拒。原因HDFS默认权限检查开启当前用户对/user/risk目录没有写权限再有就是防火墙没放行或core-site.xml里端口没配对。解决本地调试直接修改hdfs-site.xml关闭权限检查property namedfs.permissions.enabled/name valuefalse/value /property这样省心但只限开发环境。端口问题就排查netstat -tlnp看9000端口有没有监听如果没有说明NameNode没起来去logs目录看safe mode报错通常是目录权限不对chown -R hadoop:hadoop /home/hadoop/data再格式化即可。另外伪分布式的hostname要写localhost不要写node1这种集群名否则会出现Unrecognized host。5.5 distcp迁移数据时参数设错导致限流现象从生产集群拷贝数据到测试集群用hadoop distcp跑一半卡住网络流量飙满后续其他作业排队失败。原因distcp默认并发数太高没限制带宽和任务数把机架间的链路打满了。解决distcp参数要显式设置并发数。我常用hadoop distcp -Dfs.file.impl.disable.cachetrue \ -Dmapreduce.map.memory.mb2048 \ -Dmapreduce.reduce.memory.mb2048 \ -m 10 \ -bandwidth 100 \ hdfs://prodnamenode:8020/user/risk /user/risk_backup-m设置map数控制并行度-bandwidth限制每路传输的MB/s。迁移大目录前先跑一小批测试比如只复制一个分区确认速度和路径对了再全量跑。另外注意distcp默认覆盖语义目标目录已存在会合并而不是覆盖残留旧文件可能导致数据异常一般先清空目标分区。6. 进阶验证与调优把源码改造成生产可用的三板斧6.1 用Hive分区和分桶替代裸表源码里如果特征宽表是普通Parquet文件迟早会被慢查询拖死。我会把宽表改造成Hive分桶表按客户ID分桶桶数为32或64这样后续查询和join时能直接走bucket-local减少shuffle。建表语句类似CREATE TABLE feature_wide_bucket ( customer_id string, txn_cnt_30d bigint, txn_amt_sum_30d double, overdue_days_max int, is_bad int ) PARTITIONED BY (dt string) CLUSTERED BY (customer_id) INTO 32 BUCKETS STORED AS ORC;写入时用INSERT OVERWRITE TABLE ... SELECT ...Spark会自动按bucket分配数据。验证方法很简单查看执行计划看join时有没有BucketPrune有就说明路由到了。这一步对千万级以上客户数据效果非常明显能减少一半以上的运行时间。6.2 增加血缘与权限校验信贷系统过审计时监管要看你每一步数据怎么来的、谁动过模型。源码里如果没有做血缘记录我建议在跑批脚本的入口和出口各打印一段JSON日志记录输入路径、作业ID、时间戳、输出路径。更严格的做法是把这些元数据写进Hive表比如risk_job_log表每次跑批insert一行。权限方面如果不想上Ranger可以用Hive的REVOKE和GRANT命令控制访问GRANT SELECT ON TABLE feature_wide TO USER risk_analyst; REVOKE SELECT (id_card) ON TABLE feature_wide FROM USER risk_analyst;但Hive的列级权限从3.0才开始支持老版本只能靠直接建脱敏视图。我自己维护过一套视图方案为分析师建feature_wide_analyst视图把身份证、手机号字段替换成掩码所有查询走视图底层表只对管理员开放。这样既满足权限要求又不用引入额外组件。6.3 模型上线前的回测与阈值校准评分模型不是训练完就能直接上线的要做时间序列回测。我把特征宽表按日期切成训练期和回测期比如用2024年1月到5月的数据训练用6月的数据预测7月是否逾期。回测时要计算KS值和AUC看模型在时间外样本上的衰减程度。阈值校准上不能简单用默认0.5而要结合业务的通过率和坏账率预期。比如要保持坏账率低于2%就去查概率分布的分位数把0.7设为拒绝线。具体操作可以从预测结果中取概率列做分位统计SELECT percentile_approx(probability, 0.9) AS p90, percentile_approx(probability, 0.95) AS p95 FROM predicted_result WHERE dt2024-07-01如果90分位的概率是0.65那就意味着只有10%的客户概率在0.65以上你可以根据这个比例调整阈值。这一步直接关系到风控效果也是源码里最容易缺的部分。最后说一个我自己的教训刚接触这套系统时我拿到源码第一件事就是改模型参数结果环境没搭好、数据没造全模型AUC只有0.5相当于瞎猜。后来老老实实从伪分布式起步把Hadoop配置、Spark内存、数据管道每一步都跑通再回头改特征和参数才把AUC提到0.82。所以别急着炫模型先把地基打稳。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Fabric 2.0 生产级部署:TLS拓扑、链码生命周期与Docker网络协同

Fabric 2.0 生产级部署:TLS拓扑、链码生命周期与Docker网络协同

1. 这不是“装个软件”——Fabric 2.0 部署的本质是什么很多人点开“Hyperledger Fabric 2.0 部署教程”时,心里想的是:照着步骤敲几行命令,跑起来一个区块链网络就完事了。我试过三次——第一次在本地虚拟机上卡在 Docker Compose 启动 peer…

📅 2026/10/12 14:49:14
Truffle投票DApp毕设实战:从Ganache部署到MetaMask交互

Truffle投票DApp毕设实战:从Ganache部署到MetaMask交互

简介:这份资源是面向计算机、通信、人工智能、自动化等专业学生与开发者的区块链入门级毕设项目源码,以 Truffle 框架搭建投票 DApp,配合 Ganache 启动本地链、MetaMask 完成交互,帮助初学者快速理解智能合约编写、部署与前端调用…

📅 2026/10/12 14:49:14
数据挖掘十大算法Python源代码:复现、调参与实战

数据挖掘十大算法Python源代码:复现、调参与实战

简介:十大经典算法的Python实现,被浓缩为15个轻量文件。这份源码包面向数据挖掘初学者与进阶开发者,覆盖Apriori、C4.5、CART、EM、K-means、KNN、PageRank等核心算法,便于对照算法原理快速上手。压缩包容量仅14KB,内含…

📅 2026/10/12 14:49:14
MORE NEWS

更多资讯

📰

VSCode 插件工具链配置:把 Base URL 改到 TaoToken 的完整实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

DeepLabv3+实战:PyTorch从零构建可部署语义分割流水线

简介:本资源是一套基于PyTorch实现DeepLabv3图像分割算法的完整训练实践项目,面向计算机视觉初学者与进阶学习者,聚焦语义分割核心任务,覆盖VOC与Cityscapes两大主流数据集的模型训练、评估与可视化全流程。压缩包共55个文件&…

📰

手搓OpenClaw:SessionManager 会话管理模块拆解与 TaoToken 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

32位达梦数据库工具实战:老系统迁移与数据导入导出避坑指南

简介:32位达梦数据库工具包面向仍在使用32位操作系统的数据库管理员与开发者,提供连接、查询、迁移、备份恢复及日常运维的一整套实用工具,解决老旧环境下访问与管理达梦数据库的兼容性难题。压缩包共2290个文件,约280.48MB&#…

📰

离线安装Docker:docker.rpm.tar包解析与实战指南

简介:这份资源是面向 CentOS 系统运维与容器入门者的 Docker 离线安装包,针对内网或无外网环境下无法直接通过 yum 源安装 Docker 的场景,提供了一整套可本地部署的 RPM 依赖集合。压缩包共 16 个文件,以 9 个 rpm 安装包为主&…

📰

emp表加薪逻辑怎么写?TaoToken 辅助调试按基本薪水10%加薪且超5000取消的SQL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬