最新要闻
- 网传云南一公园有多人用针扎小象,园方回应:已反馈了该情况,有关部门在协助调查
- 1199元起 雷蛇天狼星V2专业版游戏音箱发布:背投式RGB|当前最新
- 多芬广告呼吁女性游戏角色不必性感 宣传女性身材自信 引玩家众怒|世界热头条
- openai为chatgpt人工智能推出ios应用
- 兑现“十年合约”:微软正式开启与NVIDIA合作
- 菜鸟CEO万霖发全员信:开启新创业征程 建设全球领先数智物流集团-天天热门
- 一机搞定全屋清洁!石头智能洗地机A10 Ultra图赏
- 日本4月份贸易赤字4324亿日元 信息
- 速讯:30多万买豪华行政车 新一代凯迪拉克CT6内饰官图:超帅9k曲面屏上车
- 《王者荣耀》520亚瑟新皮肤太过250:开局一条狗 玩家直呼要买
- 马克思主义理论专业大学排名(马克思主义专业大学排名及分数线)_世界最新
- ChatGPT正式登陆iOS!但苹果却禁止员工使用-当前快报
- 科普:相机镜头的“放大倍率”是什么?
- 真我GT Neo5 SE“圣白幻影”配色亮相:颜值质感拉满|全球热推荐
- 观速讯丨南微医学:5月18日融资买入1167.84万元,融资融券余额2.55亿元
- 华为凌霄子母路由Q6E开启预售:499元 每个房间都Wi-Fi满格
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日资讯:技术干货|如何利用 ChunJun 实现数据离线同步?
ChunJun 是⼀款稳定、易⽤、⾼效、批流⼀体的数据集成框架,基于计算引擎 Flink 实现多种异构数据源之间的数据同步与计算。ChunJun 可以把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从⽽为企业提供全⾯的数据共享,目前已在上千家公司部署且稳定运⾏。
在之前,我们曾经为大家介绍过如何利用 ChunJun 实现数据实时同步(点击看正文),本篇将为大家介绍姊妹篇,如何利⽤ ChunJun 实现数据的离线同步。
ChunJun 离线同步案例
离线同步是 ChunJun 的⼀个重要特性,下⾯以最通⽤的 mysql -> hive 的同步任务来介绍离线同步。
(资料图片仅供参考)
配置环境
找⼀个空⽬录,接下来要配置 Flink 和 ChunJun 的环境,下⾯以 /root/chunjun_demo/ 为例⼦。
● 配置 Flink
下载 Flink
wget "http://archive.apache.org/dist/flink/flink-1.12.7/flink-1.12.7-bin-scala_2.12.tgz"tar -zxvf chunjun-dist.tar.gz
● 配置 ChunJun
#下载 chunjun, 内部依赖 flink 1.12.7wget https://github.com/DTStack/chunjun/releases/download/v1.12.8/chunjun-dist-1.12-SNAPSHOT.tar.gz#新创建⼀个⽬录mkdir chunjun && cd chunjun#解压到指定⽬录tar -zxvf chunjun-dist-1.12-SNAPSHOT.tar.gz
解压好的 ChunJun 有如下⽬录:binchunjun-distchunjun-exampleslib
● 配置环境变量
#配置 Flink 环境变量echo "FLINK_HOME=/root/chunjun_demo/flink-1.12.7" >> /etc/profile.d/sh.local#配置 Chunjun 的环境变量echo "CHUNJUN_DIST=/root/chunjun_demo/chunjun/chunjun-dist" >> /etc/profile.d/sh.local#刷新换新变量. /etc/profile.d/sh.local
● 在 Yarn 上⾯启动 Flink Session
#启动 Flink Sessionbash $FLINK_HOME/bin/yarn-session.sh -t $CHUNJUN_DIST -d
输出如下:
echo "stop" | $FLINK_HOME/bin/yarn-session.sh -id application_1683599622970_0270If this should not be possible, then you can also kill Flink via YARN"s web interface or via:yarn application -kill application_1683599622970_0270
下⾯提交任务会⽤到 Flink Session 这个 Yarn Application Id (application_1683599622970_0270)。
● 其他配置
如果⽤ parquet 格式,需要把 flink-parquet_2.12-1.12.7.jar 放⼊到 flink/lib 下⾯, 在上⾯的例⼦中,需要放到 $FLINK_HOME/lib ⾥⾯。
提交任务
● 在 MySQL 准备数据
-- 创建⼀个名为ecommerce_db的数据库,⽤于存储电商⽹站的数据CREATE DATABASE IF NOT EXISTS chunjun;USE chunjun;-- 创建⼀个名为orders的表,⽤于存储订单信息CREATE TABLE IF NOT EXISTS orders ( id INT AUTO_INCREMENT PRIMARY KEY, -- ⾃增主键 order_id VARCHAR(50) NOT NULL, -- 订单编号,不能为空 user_id INT NOT NULL, -- ⽤户ID,不能为空 product_id INT NOT NULL, -- 产品ID,不能为空 quantity INT NOT NULL, -- 订购数量,不能为空 order_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP-- 订单⽇期,默认值为当前时间戳,不能为空);-- 插⼊⼀些测试数据到orders表INSERT INTO orders (order_id, user_id, product_id, quantity)VALUES ("ORD123", 1, 101, 2), ("ORD124", 2, 102, 1), ("ORD125", 3, 103, 3), ("ORD126", 1, 104, 1), ("ORD127", 2, 105, 5); select * from chunjun.orders;
如果没有 MySQL 的话,可以⽤ docker 快速创建⼀个。
docker pull mysql:8.0.12docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.12
● 创建 Hive 表
CREATE DATABASE IF NOT EXISTS chunjun;USE chunjun;-- 创建⼀个名为orders的表,⽤于存储订单信息CREATE TABLE IF NOT EXISTS chunjun.orders ( id INT, order_id VARCHAR(50), user_id INT, product_id INT, quantity INT, order_date TIMESTAMP) STORED AS PARQUET;
-- 查看 hive 表,底层的 HDFS ⽂件位置,下⾯的 SQL 结果⾥⾯ Location 字段,就是 HDFS ⽂件的位置。desc formatted chunjun.orders;-- Location: hdfs://ns1/dtInsight/hive/warehouse/chunjun.db/orders-- ⼀会配置同步任务的时候会⽤到 hdfs://ns1/dtInsight/hive/warehouse/chunjun.db/orders
● 在当前⽬录( /root/chunjun_demo/ ) 配置⼀个任务 mysql_hdfs.json
vim mysql_hdfs.json 输⼊如下内容:
{"job": {"content": [ {"reader": {"parameter": {"connection": [ {"schema": "chunjun","jdbcUrl": [ "jdbc:mysql://172.16.85.200:3306/chunjun" ],"table": [ "orders" ] } ],"username": "root","password": "123456","column": [ { "name": "id", "type": "INT" }, { "name": "order_id", "type": "VARCHAR" }, { "name": "user_id", "type": "INT" }, { "name": "product_id", "type": "INT" }, { "name": "quantity", "type": "INT" }, { "name": "order_date", "type": "TIMESTAMP" } ] },"name": "mysqlreader" },"writer": {"parameter": {"path": "hdfs://ns1/dtInsight/hive/warehouse/chunjun.db/orders","defaultFS": "hdfs://ns1","hadoopConfig": {"dfs.nameservices": "ns1","dfs.ha.namenodes.ns1": "nn1,nn2","dfs.namenode.rpc-address.ns1.nn1": "172.16.85.194:9000","dfs.namenode.rpc-address.ns1.nn2": "172.16.85.200:9000","dfs.client.failover.proxy.provider.ns1":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" },"column": [ { "name": "id", "type": "INT" }, { "name": "order_id", "type": "VARCHAR" }, { "name": "user_id", "type": "INT" }, { "name": "product_id", "type": "INT" }, { "name": "quantity", "type": "INT" }, { "name": "order_date", "type": "TIMESTAMP" } ],"writeMode": "overwrite","encoding": "utf-8","fileType": "parquet","fullColumnName": [ "id", "order_id", "user_id", "product_id", "quantity", "order_date"],"fullColumnType": [ "INT", "VARCHAR", "INT", "INT", "INT", "TIMESTAMP" ] },"name": "hdfswriter" } } ],"setting": {"errorLimit": {"record": 0 },"speed": {"bytes": 0,"channel": 1 } } }}
因为我们要将 MySQL 同步到 Hive ⾥⾯,但是如果直接同步 Hive 的话,内部会⽤ jdbc,⽽ jdbc 的效率不⾼,因此我们可以直接把数据同步到 Hive 底层的 HDFS 上⾯,所以 writer ⽤到了 hdfswriter。脚本解析如下:
{"job": {"content": [ {"reader": {"parameter": {"connectionComment": "数据库链接, 数据库, 表, 账号, 密码","connection": [ {"schema": "chunjun","jdbcUrl": [ "jdbc:mysql://172.16.85.200:3306/chunjun" ],"table": [ "orders" ] } ],"username": "root","password": "123456","columnComment": "要同步的列选择, 可以选择部分列","column": [ { "name": "id", "type": "INT" }, { "name": "order_id", "type": "VARCHAR" }, { "name": "user_id", "type": "INT" }, { "name": "product_id", "type": "INT" }, { "name": "quantity", "type": "INT" }, { "name": "order_date", "type": "TIMESTAMP" } ] },"nameComment" : "source 是 mysql","name": "mysqlreader" },"writer": {"parameter": {"pathComment": "HDFS 上⾯的路径, 通过 hive 语句的 desc formatted 查看","path": "hdfs://ns1/dtInsight/hive/warehouse/chunjun.db/orders","defaultFS": "hdfs://ns1","hadoopConfigComment": "是 hdfs ⾼可⽤最基本的配置, 在 Hadoop 配置⽂件 hdfs-site.xml 可以找到","hadoopConfig": {"dfs.nameservices": "ns1","dfs.ha.namenodes.ns1": "nn1,nn2","dfs.namenode.rpc-address.ns1.nn1": "172.16.85.194:9000","dfs.namenode.rpc-address.ns1.nn2": "172.16.85.200:9000","dfs.client.failover.proxy.provider.ns1":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" },"columnComment": "要同步的列选择, 可以选择部分列","column": [ { "name": "id", "type": "INT" }, { "name": "order_id", "type": "VARCHAR" }, { "name": "user_id", "type": "INT" }, { "name": "product_id", "type": "INT" }, { "name": "quantity", "type": "INT" }, { "name": "order_date", "type": "TIMESTAMP" } ],"writeModeComment": "覆盖写⼊到 hdfs 上⾯的⽂件, 可选 overwrite, append(默认模式)","writeMode": "overwrite","encoding": "utf-8","fileTypeComment": "可选 orc, parquet, text","fileType": "parquet","fullColumnNameComment": "全部字段,有时候 column ⾥⾯同步部分字段,但是⼜需要有全部字段的格式,例如 fileType : text ","fullColumnName": [ "id", "order_id", "user_id", "product_id", "quantity", "order_date"], "fullColumnTypeComment": "全部字段的类型","fullColumnType": [ "INT", "VARCHAR", "INT", "INT", "INT", "TIMESTAMP" ] },"nameComment" : "sink 是 hdfs","name": "hdfswriter" } } ],"setting": {"errorLimit": {"record": 0 },"speed": {"bytes": 0,"channel": 1 } } }}
● 提交任务
bash chunjun/bin/chunjun-yarn-session.sh -job mysql_hdfs.json -confProp{\"yarn.application.id\":\"application_1683599622970_0270\"}
● 查看任务
任务同步完成, 可以看⼀下 HDFS 上⾯的数据。
查看⼀下 Hive 表的数据。
注意, 如果是分区的 Hive 表,需要⼿动刷新⼀下 Hive 的元数据, 使⽤ MSCK 命令。(MSCK 是 Hive 中的⼀个命令,⽤于检查表中的分区,并将其添加到 Hive 元数据中)
MSCK REPAIR TABLE my_table;
ChunJun 离线同步原理解析
HDFS 文件同步原理
· 对于⽂件系统,同步的时候会先把⽂件写⼊到 path + [filename] ⽬录⾥⾯的 .data 的⽂件⾥⾯,如果任务失败,那么 .data ⾥⾯的⽂件不会⽣效。
· 在 TaskManager 上⾯所有 task 任务结束的时候,会在 JobManager 执⾏ FinalizeOnMaster 的 finalizeGlobal ⽅法, 最终会调⽤到 moveAllTmpDataFileToDir , 把 .data ⾥⾯的⽂件移除到 .data 的上⼀层。
public interface FinalizeOnMaster {
/**The method is invoked on the master (JobManager) after all (parallel) instances of an OutputFormat finished.Params:parallelism – The parallelism with which the format or functions was run.Throws:IOException – The finalization may throw exceptions, which may cause the job to abort.*/void finalizeGlobal(int parallelism) throws IOException; }
// 在 JobManager 执⾏@Overrideprotected void moveAllTmpDataFileToDir() {if (fs == null) {openSource(); }String currentFilePath = "";try {Path dir = new Path(outputFilePath);Path tmpDir = new Path(tmpPath);FileStatus[] dataFiles = fs.listStatus(tmpDir);for (FileStatus dataFile : dataFiles) {currentFilePath = dataFile.getPath().getName();fs.rename(dataFile.getPath(), dir);LOG.info("move temp file:{} to dir:{}", dataFile.getPath(), dir); }fs.delete(tmpDir, true); } catch (IOException e) {throw new ChunJunRuntimeException(String.format("can"t move file:[%s] to dir:[%s]", currentFilePath, outputFilePath),e); }}
增量同步
增量同步主要针对某些只有 Insert 操作的表,随着业务增⻓,表内数据越来越多。如果每次都同步整表的话,消耗的时间和资源会⽐较多。因此需要⼀个增量同步的功能,每次只读取增加部分的数据。
● 实现原理
其实现原理实际上就是配合增量键在查询的 sql 语句中拼接过滤条件,⽐如 where id > ? ,将之前已经读取过的数据过滤出去。
增量同步是针对于两个及以上的同步作业来说的。对于初次执⾏增量同步的作业⽽⾔,实际上是整表同步,不同于其他作业的在于增量同步作业会在作业执⾏完成后记录⼀个 endLocation 指标,并将这个指标上传到 prometheus 以供后续使⽤。
除第⼀次作业外,后续的所有增量同步作业都会取上⼀次作业的 endLocation 做为本次作业的过滤依据(startLocation)。⽐如第⼀次作业执⾏完后,endLocation 为10,那么下⼀个作业就会构建出例如 SELECT id,name,age from table where id > 10 的 SQL 语句,达到增量读取的⽬的。
● 使用限制
· 只有 RDB 的 Reader 插件可以使⽤
· 通过构建SQL过滤语句实现,因此只能⽤于RDB插件
· 增量同步只关⼼读,不关⼼写,因此只与Reader插件有关
· 增量字段只能为数值类型和时间类型
· 指标需要上传到 prometheus,⽽ prometheus 不⽀持字符串类型,因此只⽀持数据类型和时间类型,时间类型会转换成时间戳后上传
· 增量键的值可以重复,但必须递增
· 由于使⽤ ">" 的缘故,要求字段必须递增
断点续传
断点续传是为了在离线同步的时候,针对⻓时间同步任务如超过1天,如果在同步过程中由于某些原因导致任务失败,从头再来的话成本⾮常⼤,因此需要⼀个断点续传的功能从任务失败的地⽅继续。
● 实现原理
· 基于 Flink 的 checkpoint,在 checkpoint 的时候 会存储 source 端最后⼀条数据的某个字段值,sink 端插件执⾏事务提交。
· 在任务失败,后续通过 checkpoint 重新运⾏时,source 端在⽣成 select 语句的时候将 state ⾥的值作为条件拼接进⾏数据的过滤,达到从上次失败位点进⾏恢复。
· jdbcInputFormat 在拼接读取 SQL 时,如果从 checkpoint 恢复的 state 不为空且 restoreColumn 不为空,则此时会将 checkpoint ⾥的 state 作为起点开始读取数据。
● 适用场景
通过上述原理我们可以知道 source 端必须是 RDB 类型插件,因为是通过 select 语句拼接 where 条件进⾏数据过滤达到断点续传的,同时断点续传需要指定⼀个字段作为过滤条件,且此字段要求是递增的。
· 任务需要开启 checkpoint
· reader 为 RDB 的插件均⽀持且 writer ⽀持事务的插件(如 rdb filesystem 等),如果下游是幂等性则 writer 插件也不需要⽀持事务
· 作为断点续传的字段在源表⾥的数据是递增的,因为过滤条件是 >
《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm
《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szbky
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:30537511,项目地址:https://github.com/DTStack
关键词:
-
双检锁(DCL)实现懒汉单例模式_全球讯息
publicclassSingleton{privatevolatilestaticSingletonobj;publicSingleton(){}publicgetSingleton(){if(singleton==null){synchronized(Singlet
来源: 每日资讯:技术干货|如何利用 ChunJun 实现数据离线同步?
快看:腾讯云的devops自动化部署代替jenkins
双检锁(DCL)实现懒汉单例模式_全球讯息
网传云南一公园有多人用针扎小象,园方回应:已反馈了该情况,有关部门在协助调查
1199元起 雷蛇天狼星V2专业版游戏音箱发布:背投式RGB|当前最新
多芬广告呼吁女性游戏角色不必性感 宣传女性身材自信 引玩家众怒|世界热头条
openai为chatgpt人工智能推出ios应用
兑现“十年合约”:微软正式开启与NVIDIA合作
菜鸟CEO万霖发全员信:开启新创业征程 建设全球领先数智物流集团-天天热门
一机搞定全屋清洁!石头智能洗地机A10 Ultra图赏
日本4月份贸易赤字4324亿日元 信息
JS函数中的属性-全球简讯
【天天速看料】ET介绍——事件机制EventSystem
聊聊Sentinel的熔断降级
速讯:30多万买豪华行政车 新一代凯迪拉克CT6内饰官图:超帅9k曲面屏上车
《王者荣耀》520亚瑟新皮肤太过250:开局一条狗 玩家直呼要买
马克思主义理论专业大学排名(马克思主义专业大学排名及分数线)_世界最新
ChatGPT正式登陆iOS!但苹果却禁止员工使用-当前快报
科普:相机镜头的“放大倍率”是什么?
真我GT Neo5 SE“圣白幻影”配色亮相:颜值质感拉满|全球热推荐
项目管理快速入门
实时:聊聊Mybatis集成Spring的原理
SSM整合使用 天天信息
观速讯丨南微医学:5月18日融资买入1167.84万元,融资融券余额2.55亿元
华为凌霄子母路由Q6E开启预售:499元 每个房间都Wi-Fi满格
电动车价格战还打不打?电池级碳酸锂翻倍式触底反弹 重返30万元/吨 当前聚焦
网传云南一公园多人用针扎小象引围观 官方回应:网友呼吁不要再看动物表演
好消息!罗马后卫切利克赛后表示:我很好,伤势并不严重
JMeter性能测试工具快速入门教程
【读财报】4月猪价微降 上市猪企销量、收入环比变动较小
手机PC秒变16TB!华为家庭存储新款发布:再不怕断电了|焦点热议
当前热点-7.2万元 大疆发布Matrice 350 RTK旗舰无人机:升级20公里图传
算力达国际主流!飞腾国产服务器CPU腾云S2500被国家博物馆收藏 聚焦
接下来三十年还会继续快速贬值吗?-热点在线
学系统集成项目管理工程师(中项)系列22c_信息化知识(下)_环球即时看
重磅!ChatGPT正式发布App iOS客户端可下载
环球聚焦:Epic大特卖开启!7.5折套娃优惠券来了 超多大作打骨折
莒南县应急管理局全面部署五一期间应急值守工作
每日精选:ET介绍——C#更好的协程
全球快看:01-module/分频器/激励写法
全球动态:DDR2 学习笔记(一)
全球今日报丨女子帮摔倒老人反被指认为肇事者:本人正能量回应获网友点赞
今年夏天逃不掉高温了:全球平均气温正在波动上升 全球今头条
今亮点!员工回怼加班遭光速开除!公司回应:矛盾来源并不是加不加班
环球热门:跟苹果不一样!说到生产力 华为才是真正懂中国人的
全球今日讯!《猫和老鼠》才是永远的神!凭什么能碾压AI作画?
冲击欧联冠军!穆里尼奥第六次进入欧战决赛,前五次全胜
全球今头条!盂县气象局发布雷暴大风蓝色预警【Ⅳ级/一般】【2023-05-19】
天天热消息:人寿学平险保障范围_人寿学平险报销范围
斗鱼第一季度总净营收为14.831亿元 同期相比下滑17.4%
《王者荣耀》游戏官方推出女装品牌 限量的五款连衣裙均未售罄
美国蒙大拿州签署法案封禁TikTok 将于2024年1月份执行
Xbox或将推出全新商业模式 提供游戏片段试玩或带广告的免费游玩
因原材料与运输成本上涨 可口可乐或将上演“涨价大戏”
我国科研人员成功研制量子计算超低温温度传感器 支持实时温度监测
因存在影响游戏竞技公平的缺陷 英雄联盟官方公布部分英雄禁用公告
谷歌将加入全新AI生成代码功能 由“文生代码”模型Codey提供支持
谷歌将联合东京大学与芝加哥大学共同研究量子计算机 预计投入超千万资金
世界首例泰坦尼克号3D全景扫描图像完成 只为探索沉船新发现
Knight突然开团,对位Faker出杀人书,JDG完美表现,28分钟击溃T1 天天热推荐
当前信息:下个月你工资卡里或将多一笔钱!领取高温津贴
号称保值的iPhone手机今年疯狂掉价!花5000多还不如买安卓|世界热点
Springboot集成Netty实现TCP通讯_天天速看料
【聚看点】誉的拼音和组词怎么写_誉的拼音
698元!华为儿童手表5发布:无网离线也能定位
数毛社Steam Deck测评:新三A大作性能表现开始吃紧
一次装修十年无忧!华为全屋智能4.0发布:业界首款空间穿越屏|全球热消息
每日聚焦:4K旗舰领衔!Vidda连发三款投影仪:画质、亮度直接拉满 3199元起
81岁老妪拒绝医美|今日报
海通恒信(01905):“21恒信G2”回售登记期为5月23日至25日
【世界独家】阿里巴巴核心业务:云智能部门将成为独立上市公司
热点!车企们 请别拿人命开玩笑
华为十大新品价格汇总:MateBook X Pro笔记本顶配1.4万元-天天即时
三大专业升级 华为MateBook 16s 2023来了:重度生产力标杆之作
业界首款支持高血糖!华为WATCH 4 Pro蔚蓝地球图赏 当前快看
全球热文:win7屏幕保护设置在哪里 win7屏幕保护设置
ET介绍——强大的基于.dotnet7+Unity3d的双端C#开源游戏框架-全球报资讯
热推荐:Java设计模式-外观模式
python包管理工具:Conda和pip比较
债市日报:5月18日
每日快讯!凯华推出“黑莓冰淇淋”轴体:加长轴心敲击更清脆
全球速读:北斗导航年产值超5000亿元!12nm芯片重大突破
摩托“骑士”双手离把耍酷还发抖音炫技 被“顺网线”找到_今亮点
安卓用户正在加速逃离:为何买苹果手机的人越来越多了?
1499元起 努比亚N5发布:6nm国产芯 今日报
煜邦电力: 关于回复上海证券交易所《关于北京煜邦电力技术股份有限公司向不特定对象发行可转换公司债券的审核中心意见落实函》的公告
热文:【一步步开发AI运动小程序】一、准备工作
python标准模块介绍 -Base64: Base64, Base85等数据编码|全球时讯
学系统集成项目管理工程师(中项)系列22b_信息化知识(中)
express框架的基本使用 环球新资讯
幺妹带你慢慢耍歌词完整版_请问老师们有谁知道幺妹带你慢慢耍歌词曲谱 这首歌确实不错好听
拒绝录用有文身员工 老板回应被威胁:看不惯年轻人必教育到底
滚动:《塞尔达传说:王国之泪》掉帧严重:任天堂Switch性能不够用了
排面!理想L7成卢森堡大使馆官方用车:“这是中国最棒的车”_关注
环球今日讯!预制半成品、来“料”加工、网上销售 普陀警方捣毁一伪造、买卖身份证件黑色产业链
论文、专利、文献检索及图像数据工具总结 时讯
工控老曹说——TSN标准化如何赋能多领域以太网新发展
焦点讯息:2023最佳python编辑器和IDE
git 常用指令-当前聚焦
今日精选:万家基金尹诚庸离任6只基金