版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hadoop数据收集与入库系统Flume与SqoopHadoop数据收集与入库系统Flume与Sqoop1主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍2背景介绍Hadoop提供了一个中央化的存储系统:有利于进行集中式的数据分析与数据共享Hadoop对存储格式没有要求:用户访问日志;产品信息网页数据等如何将数据存入Hadoop:数据分散在各个离散的设备上数据保存在传统的存储设备和系统中背景介绍Hadoop提供了一个中央化的存储系统:3常见的两种数据来源分散的数据源:机器产生的数据;用户访问日志;用户购买日志;传统系统中的数据:传统关系型数据库:MySQL、Oracle等;磁盘阵列;磁带.常见的两种数据来源分散的数据源:4Hadoop收集和入库基本要求分布式数据源多样化数据源分散可靠性保证不丢数据允许丢部分数据可扩展数据源可能会不断增加通过并行提高性能Hadoop收集和入库基本要求分布式5常见的Hadoop收集与入库系统数据收集FlumeKafkaScribe传统数据库与Hadoop同步Sqoop常见的Hadoop收集与入库系统数据收集6主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍7Hadoop数据收集系统—FlumeFlume
OGOG:“OriginalGeneration”0.9.x或cdh3以及更早版本由agent、collector、master等组件构成Flume
NGNG:“Next/NewGeneration”1.x或cdh4以及之后的版本由Agent、Client等组件构成为什么要推出NG版本精简代码架构简化Hadoop数据收集系统—FlumeFlumeOG8Flume
OG基本架构FlumeOG基本架构9Flume
OG基本架构FlumeOG基本架构10Agent用于采集数据数据流产生的地方通常由source和sink两部分组成Source用于获取数据,可从文本文件,syslog,HTTP等获取数据;Sink将Source获得的数据进一步传输给后面的Collector。Flume自带了很多source和sink实现syslogTcp(5140)|
agentSink("localhost",35853)tail("/etc/services")|
agentSink("localhost",35853)Agent用于采集数据11Collector汇总多个Agent结果将汇总结果导入后端存储系统,比如HDFS,HBaseFlume自带了很多collector实现collectorSource(35853)|
consoleCollectorSource(35853)
|collectorSink("file:///tmp/flume/collected",
"syslog");collectorSource(35853)|collectorSink("hdfs://namenode/user/flume/
","syslog");Collector汇总多个Agent结果12Agent与Collector对应关系Agent与Collector对应关系13Agent与Collector对应关系可手动指定,也可自动匹配自动匹配的情况下,master会平衡collector之间的负载。Agent与Collector对应关系可手动指定,也可自动匹14问题:为什么引入Collector?对Agent数据进行汇总,避免产生过多小文件;避免多个agent连接对Hadoop造成过大压力
;中间件,屏蔽agent和hadoop间的异构性。问题:为什么引入Collector?对Agent数据进行汇总15Master管理协调
agent
和collector的配置信息;Flume集群的控制器;跟踪数据流的最后确认信息,并通知agent;通常需配置多个master以防止单点故障;借助zookeeper管理管理多Master。Master管理协调agent和collector的配置16容错机制容错机制17三种可靠性级别agentE2ESink[("machine"[,port])]agent收到确认消息才认为数据发送成功,否则重试.agentDFOSink[("machine"[,port])]当agent发现在collector操作失败的时候,agent写入到本地硬盘上,当collctor恢复后,再重新发送数据。agentBESink[("machine"[,port])]效率最好,agent不写入到本地任何数据,如果在collector
发现处理失败,直接删除消息。三种可靠性级别agentE2ESink[("machine"18构建基于Flume的数据收集系统Agent和Collector均可以动态配置可通过命令行或Web界面配置命令行配置在已经启动的master节点上,依次输入”flume
shell””connectlocalhost
”如执行exec
config
a1‘tailDir(“/data/logfile”)’
‘agentSink’Web界面选中节点,填写source、sink等信息构建基于Flume的数据收集系统Agent和Collecto19常用架构举例—拓扑1agentA:tail(“/ngnix/logs”)|agentSink("collector",35853);agentB:tail(“/ngnix/logs”)|agentSink("collector",35853);agentC:tail(“/ngnix/logs”)|agentSink("collector",35853);agentD:tail(“/ngnix/logs”)|agentSink("collector",35853);agentE:tail(“/ngnix/logs”)|agentSink("collector",35853);agentF:tail(“/ngnix/logs”)|agentSink("collector",35853);collector:collectorSource(35853)
|collectorSink("hdfs://namenode/flume/","srcdata");常用架构举例—拓扑1agentA:tail(“/ngni20常用架构举例—拓扑2agentA:src|
agentE2ESink("collectorA",35853);agentB:src|agentE2ESink("collectorA",35853);agentC:src|agentE2ESink("collectorB",35853);agentD:src|agentE2ESink("collectorB",35853);agentE:src|agentE2ESink("collectorC",35853);agentF:src|
agentE2ESink("collectorC",35853);collectorA:collectorSource(35853)|
collectorSink("hdfs://...","src");collectorB:collectorSource(35853)|collectorSink("hdfs://...","src");collectorC:collectorSource(35853)|
collectorSink("hdfs://...","src");常用架构举例—拓扑2agentA:src|agent21常用架构举例—拓扑3agentA:src|agentE2EChain("collectorA:35853","collectorB:35853");agentB:src|agentE2EChain("collectorA:35853","collectorC:35853");agentC:src|agentE2EChain("collectorB:35853","collectorA:35853");agentD:src|agentE2EChain("collectorB:35853","collectorC:35853");agentE:src|agentE2EChain("collectorC:35853","collectorA:35853");agentF:src|agentE2EChain("collectorC:35853","collectorB:35853");collectorA:collectorSource(35853)|collectorSink("hdfs://...","src");collectorB:collectorSource(35853)|collectorSink("hdfs://...","src");collectorC:collectorSource(35853)|
collectorSink("hdfs://...","src");常用架构举例—拓扑3agentA:src|agent22主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍23Sqoop是什么Sqoop:SQL-to-Hadoop连接
传统关系型数据库
和
Hadoop
的桥梁把关系型数据库的数据导入到
Hadoop
系统
(
如
HDFSHBase
和
Hive)
中;把数据从
Hadoop
系统里抽取并导出到关系型数据库里。利用MapReduce加快数据传输速度批处理方式进行数据传输Sqoop是什么Sqoop:SQL-to-Hadoop24Sqoop优势高效、可控地利用资源任务并行度,超时时间等数据类型映射与转换可自动进行,用户也可自定义支持多种数据库MySQLOraclePostgreSQLSqoop优势高效、可控地利用资源25Sqoop1架构Sqoop1架构26Sqoop2架构Sqoop2架构27Sqoop
import将数据从关系型数据库导入Hadoop中步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop。Sqoopimport将数据从关系型数据库导入Hadoop28Sqoop
import使用sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--table
cities--connnect:
指定JDBC
URL--username/password:mysql数据库的用户名--table:要读取的数据库表bin/hadoopfs-cat
cities/part-m-*1,USA,PaloAlto2,Czech
Republic,Brno3,USA,SunnyvaleSqoopimport使用sqoopimport\29Sqoop
import示例sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--target-dir
/etl/input/citiessqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--where"country=
'USA'"Sqoopimport示例sqoopimport\30Sqoop
import示例sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--as-sequencefilesqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--num-mappers
10Sqoopimport示例sqoopimport\31Sqoop
import—导入多个表sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--query'SELECTnormcities.id,\countries.country,\normcities.city
\FROMnormcities
\JOINcountriesUSING(country_id)\WHERE$CONDITIONS'
\--split-byid
\--target-dir
citiesSqoopimport—导入多个表sqoopimport32Sqoop
import增量导入sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits\--incrementalappend
\--check-columnid
\--last-value
1Sqoopimport增量导入sqoopimport\33Sqoop
import增量导入(一)sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits\--incrementalappend
\--check-columnid
\--last-value
1适用于数据每次被追加到数据库中,而已有数据不变的情况;仅导入id这一列值大于1的记录。Sqoopimport增量导入(一)sqoopimpor34Sqoop
import增量导入(二)sqoopjob
\--createvisits
\--import
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits
\--incrementalappend
\--check-columnid
\--last-value
0运行sqoop作业:sqoop
job--exec
visits每次成功运行后,sqoop将最后一条记录的id值保存到metastore中,供下次使用。Sqoopimport增量导入(二)sqoopjob\35Sqoop
import增量导入(三)sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits
\--incrementallastmodified
\--check-columnlast_update_date
\--last-value“2013-05-22
01:01:01”数据库中有一列last_update_date,记录了上次修改时间;Sqoop仅将某时刻后的数据导入Hadoop。Sqoopimport增量导入(三)sqoopimpor36Sqoop
Export将数据从Hadoop导入关系型数据库导中步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;步骤2:并行导入数据:将Hadoop上文件划分成若干个split;每个split由一个Map
Task进行数据导入。SqoopExport将数据从Hadoop导入关系型数据库37Sqoop
Export使用方法sqoopexport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--export-dir
cities--connnect:
指定JDBC
URL--username/password:mysql数据库的用户名--table:要导入的数据库表export-dir:数据在HDFS上存放目录SqoopExport使用方法sqoopexport\38Sqoop
Export—保证原子性sqoopexport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--staging-table
staging_citiesSqoopExport—保证原子性sqoopexport39Sqoop
Export—更新已有数据sqoopexport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--update-keyidsqoopexport\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--update-keyid
\--update-mode
allowinsertSqoopExport—更新已有数据sqoopexpor40Sqoop
Export—选择性插入sqoopexport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--columns
country,citySqoopExport—选择性插入sqoopexport41Sqoop与其他系统结合Sqoop可以与Oozie、Hive、Hbase等系统结合;用户需要在sqoop-env.sh中增加HBASE_HOME、HIVE_HOME等环境变量。Sqoop与其他系统结合Sqoop可以与Oozie、Hive42Sqoop与Hive结合sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--hive-importSqoop与Hive结合sqoopimport\43Sqoop与HBase结合sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--hbase-tablecities
\--column-family
worldSqoop与HBase结合sqoopimport\44Hadoop数据收集与入库系统Flume与SqoopHadoop数据收集与入库系统Flume与Sqoop45主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍46背景介绍Hadoop提供了一个中央化的存储系统:有利于进行集中式的数据分析与数据共享Hadoop对存储格式没有要求:用户访问日志;产品信息网页数据等如何将数据存入Hadoop:数据分散在各个离散的设备上数据保存在传统的存储设备和系统中背景介绍Hadoop提供了一个中央化的存储系统:47常见的两种数据来源分散的数据源:机器产生的数据;用户访问日志;用户购买日志;传统系统中的数据:传统关系型数据库:MySQL、Oracle等;磁盘阵列;磁带.常见的两种数据来源分散的数据源:48Hadoop收集和入库基本要求分布式数据源多样化数据源分散可靠性保证不丢数据允许丢部分数据可扩展数据源可能会不断增加通过并行提高性能Hadoop收集和入库基本要求分布式49常见的Hadoop收集与入库系统数据收集FlumeKafkaScribe传统数据库与Hadoop同步Sqoop常见的Hadoop收集与入库系统数据收集50主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍51Hadoop数据收集系统—FlumeFlume
OGOG:“OriginalGeneration”0.9.x或cdh3以及更早版本由agent、collector、master等组件构成Flume
NGNG:“Next/NewGeneration”1.x或cdh4以及之后的版本由Agent、Client等组件构成为什么要推出NG版本精简代码架构简化Hadoop数据收集系统—FlumeFlumeOG52Flume
OG基本架构FlumeOG基本架构53Flume
OG基本架构FlumeOG基本架构54Agent用于采集数据数据流产生的地方通常由source和sink两部分组成Source用于获取数据,可从文本文件,syslog,HTTP等获取数据;Sink将Source获得的数据进一步传输给后面的Collector。Flume自带了很多source和sink实现syslogTcp(5140)|
agentSink("localhost",35853)tail("/etc/services")|
agentSink("localhost",35853)Agent用于采集数据55Collector汇总多个Agent结果将汇总结果导入后端存储系统,比如HDFS,HBaseFlume自带了很多collector实现collectorSource(35853)|
consoleCollectorSource(35853)
|collectorSink("file:///tmp/flume/collected",
"syslog");collectorSource(35853)|collectorSink("hdfs://namenode/user/flume/
","syslog");Collector汇总多个Agent结果56Agent与Collector对应关系Agent与Collector对应关系57Agent与Collector对应关系可手动指定,也可自动匹配自动匹配的情况下,master会平衡collector之间的负载。Agent与Collector对应关系可手动指定,也可自动匹58问题:为什么引入Collector?对Agent数据进行汇总,避免产生过多小文件;避免多个agent连接对Hadoop造成过大压力
;中间件,屏蔽agent和hadoop间的异构性。问题:为什么引入Collector?对Agent数据进行汇总59Master管理协调
agent
和collector的配置信息;Flume集群的控制器;跟踪数据流的最后确认信息,并通知agent;通常需配置多个master以防止单点故障;借助zookeeper管理管理多Master。Master管理协调agent和collector的配置60容错机制容错机制61三种可靠性级别agentE2ESink[("machine"[,port])]agent收到确认消息才认为数据发送成功,否则重试.agentDFOSink[("machine"[,port])]当agent发现在collector操作失败的时候,agent写入到本地硬盘上,当collctor恢复后,再重新发送数据。agentBESink[("machine"[,port])]效率最好,agent不写入到本地任何数据,如果在collector
发现处理失败,直接删除消息。三种可靠性级别agentE2ESink[("machine"62构建基于Flume的数据收集系统Agent和Collector均可以动态配置可通过命令行或Web界面配置命令行配置在已经启动的master节点上,依次输入”flume
shell””connectlocalhost
”如执行exec
config
a1‘tailDir(“/data/logfile”)’
‘agentSink’Web界面选中节点,填写source、sink等信息构建基于Flume的数据收集系统Agent和Collecto63常用架构举例—拓扑1agentA:tail(“/ngnix/logs”)|agentSink("collector",35853);agentB:tail(“/ngnix/logs”)|agentSink("collector",35853);agentC:tail(“/ngnix/logs”)|agentSink("collector",35853);agentD:tail(“/ngnix/logs”)|agentSink("collector",35853);agentE:tail(“/ngnix/logs”)|agentSink("collector",35853);agentF:tail(“/ngnix/logs”)|agentSink("collector",35853);collector:collectorSource(35853)
|collectorSink("hdfs://namenode/flume/","srcdata");常用架构举例—拓扑1agentA:tail(“/ngni64常用架构举例—拓扑2agentA:src|
agentE2ESink("collectorA",35853);agentB:src|agentE2ESink("collectorA",35853);agentC:src|agentE2ESink("collectorB",35853);agentD:src|agentE2ESink("collectorB",35853);agentE:src|agentE2ESink("collectorC",35853);agentF:src|
agentE2ESink("collectorC",35853);collectorA:collectorSource(35853)|
collectorSink("hdfs://...","src");collectorB:collectorSource(35853)|collectorSink("hdfs://...","src");collectorC:collectorSource(35853)|
collectorSink("hdfs://...","src");常用架构举例—拓扑2agentA:src|agent65常用架构举例—拓扑3agentA:src|agentE2EChain("collectorA:35853","collectorB:35853");agentB:src|agentE2EChain("collectorA:35853","collectorC:35853");agentC:src|agentE2EChain("collectorB:35853","collectorA:35853");agentD:src|agentE2EChain("collectorB:35853","collectorC:35853");agentE:src|agentE2EChain("collectorC:35853","collectorA:35853");agentF:src|agentE2EChain("collectorC:35853","collectorB:35853");collectorA:collectorSource(35853)|collectorSink("hdfs://...","src");collectorB:collectorSource(35853)|collectorSink("hdfs://...","src");collectorC:collectorSource(35853)|
collectorSink("hdfs://...","src");常用架构举例—拓扑3agentA:src|agent66主要内容背景介绍Hadoop数据收集系统传统数据库与Hadoop间数据同步总结主要内容背景介绍67Sqoop是什么Sqoop:SQL-to-Hadoop连接
传统关系型数据库
和
Hadoop
的桥梁把关系型数据库的数据导入到
Hadoop
系统
(
如
HDFSHBase
和
Hive)
中;把数据从
Hadoop
系统里抽取并导出到关系型数据库里。利用MapReduce加快数据传输速度批处理方式进行数据传输Sqoop是什么Sqoop:SQL-to-Hadoop68Sqoop优势高效、可控地利用资源任务并行度,超时时间等数据类型映射与转换可自动进行,用户也可自定义支持多种数据库MySQLOraclePostgreSQLSqoop优势高效、可控地利用资源69Sqoop1架构Sqoop1架构70Sqoop2架构Sqoop2架构71Sqoop
import将数据从关系型数据库导入Hadoop中步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop。Sqoopimport将数据从关系型数据库导入Hadoop72Sqoop
import使用sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--table
cities--connnect:
指定JDBC
URL--username/password:mysql数据库的用户名--table:要读取的数据库表bin/hadoopfs-cat
cities/part-m-*1,USA,PaloAlto2,Czech
Republic,Brno3,USA,SunnyvaleSqoopimport使用sqoopimport\73Sqoop
import示例sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--target-dir
/etl/input/citiessqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities\--where"country=
'USA'"Sqoopimport示例sqoopimport\74Sqoop
import示例sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--as-sequencefilesqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablecities
\--num-mappers
10Sqoopimport示例sqoopimport\75Sqoop
import—导入多个表sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--query'SELECTnormcities.id,\countries.country,\normcities.city
\FROMnormcities
\JOINcountriesUSING(country_id)\WHERE$CONDITIONS'
\--split-byid
\--target-dir
citiesSqoopimport—导入多个表sqoopimport76Sqoop
import增量导入sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits\--incrementalappend
\--check-columnid
\--last-value
1Sqoopimport增量导入sqoopimport\77Sqoop
import增量导入(一)sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits\--incrementalappend
\--check-columnid
\--last-value
1适用于数据每次被追加到数据库中,而已有数据不变的情况;仅导入id这一列值大于1的记录。Sqoopimport增量导入(一)sqoopimpor78Sqoop
import增量导入(二)sqoopjob
\--createvisits
\--import
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits
\--incrementalappend
\--check-columnid
\--last-value
0运行sqoop作业:sqoop
job--exec
visits每次成功运行后,sqoop将最后一条记录的id值保存到metastore中,供下次使用。Sqoopimport增量导入(二)sqoopjob\79Sqoop
import增量导入(三)sqoopimport
\--connectjdbc:mysql:///sqoop
\--usernamesqoop
\--passwordsqoop
\--tablevisits
\--incrementallastmodified
\--check-columnlast_update_date
\--las
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农民大会活动策划方案(3篇)
- 团委元旦活动策划方案(3篇)
- 室外政府活动策划方案(3篇)
- 户外洗车活动方案策划(3篇)
- 月子预售活动方案策划(3篇)
- 花式投篮活动方案策划(3篇)
- 妊娠合并血液透析患者的容量管理文献回顾
- 妊娠合并贫血的血液保护技术进展
- 妊娠合并脐带异常的产后随访要点
- 伊丽莎白别墅营销方案(3篇)
- 北京市海淀区2024-2025学年七年级下学期期中地理试题(解析版)
- 河南省部分名校2024-2025学年高二下学期4月期中联考政治试题(解析版)
- 海运进口整体业务流程
- 印章使用管理培训
- 4-02-02-01 国家职业标准客运车辆驾驶员 (2025年版)
- 小学生保护身体隐私课件
- DB51-T 3251-2025 煤矿井下应急广播系统使用管理规范
- 会计研究方法论 第4版 课件全套 吴溪 第1-20章 导论- 中国会计学术研究成果的国际发表
- 智慧树知到《形势与政策(北京大学)》2025春期末答案
- DB22-T 389.4-2025 用水定额 第4部分:居民生活
- 曲妥珠单抗心脏毒性的管理
评论
0/150
提交评论