版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
消息队列:Pulsar:Pulsar的函数与流处理1消息队列基础1.1消息队列的定义与作用消息队列是一种用于存储和转发消息的系统组件,它允许应用程序在不同的系统或服务之间异步通信。消息队列的主要作用包括:解耦:消息队列可以将发送消息的应用程序与处理消息的应用程序分离,使得两者可以独立开发和部署。异步处理:接收者可以异步处理消息,这意味着发送者无需等待接收者完成处理,可以立即返回并继续执行其他任务。流量削峰:在高流量期间,消息队列可以缓存消息,避免后端系统过载。冗余:消息队列可以存储消息,即使接收者暂时不可用,消息也不会丢失。扩展性:通过消息队列,可以轻松地在多个接收者之间分发消息,实现负载均衡。1.2Pulsar消息队列简介ApachePulsar是一个高性能、可扩展的分布式消息队列系统,它提供了消息发布与订阅模型,支持持久化和非持久化消息,以及消息的顺序和无序处理。Pulsar的设计目标是提供一个统一的平台,用于处理实时和历史数据,同时具备高吞吐量、低延迟和持久性。Pulsar的关键特性包括:持久性:消息可以存储在磁盘上,即使服务重启,消息也不会丢失。高可用性:Pulsar集群可以跨多个数据中心部署,提供数据复制和故障转移。可扩展性:Pulsar可以水平扩展,通过增加更多的Broker节点来处理更多的消息。多租户:Pulsar支持多租户,不同的应用程序或团队可以共享同一个Pulsar集群,但保持消息的隔离。1.3Pulsar的架构与组件Pulsar的架构主要由以下几个组件构成:Broker:负责接收和分发消息,管理Topic和Subscription。Zookeeper:用于存储集群的元数据,如Broker列表、Topic配置等。BookKeeper:提供持久化存储,Broker将消息存储在BookKeeper上,以实现消息的持久化和可靠性。Producer:消息的生产者,负责向Broker发送消息。Consumer:消息的消费者,负责从Broker接收消息并进行处理。1.3.1示例:使用Pulsar发送和接收消息以下是一个使用JavaSDK发送和接收消息的示例://生产者示例
importorg.apache.pulsar.client.api.PulsarClient;
importorg.apache.pulsar.client.api.PulsarClientException;
importorg.apache.pulsar.client.api.Producer;
importorg.apache.pulsar.client.api.ProducerConfiguration;
publicclassPulsarProducerExample{
publicstaticvoidmain(String[]args)throwsPulsarClientException{
//创建Pulsar客户端
PulsarClientclient=PulsarClient.builder().serviceUrl("pulsar://localhost:6650").build();
//创建生产者
Producer<String>producer=client.newProducer(Schema.STRING)
.topic("persistent://sample/standalone/ns/my-topic")
.producerName("my-producer")
.create();
//发送消息
for(inti=0;i<10;i++){
Stringmessage="HelloPulsar"+i;
producer.send(message);
}
//关闭生产者和客户端
producer.close();
client.close();
}
}//消费者示例
importorg.apache.pulsar.client.api.Consumer;
importorg.apache.pulsar.client.api.Message;
importorg.apache.pulsar.client.api.PulsarClient;
importorg.apache.pulsar.client.api.PulsarClientException;
importorg.apache.pulsar.client.api.SubscriptionType;
publicclassPulsarConsumerExample{
publicstaticvoidmain(String[]args)throwsPulsarClientException{
//创建Pulsar客户端
PulsarClientclient=PulsarClient.builder().serviceUrl("pulsar://localhost:6650").build();
//创建消费者
Consumer<String>consumer=client.newConsumer(Schema.STRING)
.topic("persistent://sample/standalone/ns/my-topic")
.subscriptionName("my-subscription")
.subscriptionType(SubscriptionType.Exclusive)
.subscribe();
//接收并处理消息
while(true){
Message<String>msg=consumer.receive();
System.out.println("Receivedmessage:"+msg.getValue());
consumer.acknowledge(msg);
}
//关闭消费者和客户端
consumer.close();
client.close();
}
}在这个示例中,我们首先创建了一个Pulsar客户端,然后使用这个客户端创建了一个生产者和一个消费者。生产者向指定的Topic发送了10条消息,而消费者则订阅了这个Topic,接收并处理这些消息。注意,我们使用了Schema.STRING来指定消息的类型为字符串,这使得我们可以直接发送和接收字符串消息。1.3.2Pulsar的流处理功能Pulsar不仅是一个消息队列,它还提供了流处理功能,允许用户在消息上执行实时计算。Pulsar的流处理功能主要通过PulsarFunctions和PulsarIO实现。PulsarFunctions:允许用户定义函数来处理消息流,这些函数可以部署在Pulsar集群上,自动扩展以处理大量消息。PulsarIO:提供了一种将数据从外部系统导入Pulsar或从Pulsar导出到外部系统的方式,支持多种数据源和数据接收器。1.3.3示例:使用PulsarFunctions处理消息以下是一个使用PulsarFunctions处理消息的示例://PulsarFunction示例
importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
publicclassMyFunctionimplementsFunction<String,String>{
@Override
publicStringprocess(Stringinput,Contextcontext){
//处理消息
Stringoutput=input.toUpperCase();
//记录日志
context.getLogger().info("Receivedmessage:"+input);
returnoutput;
}
}在这个示例中,我们定义了一个简单的函数MyFunction,它接收一个字符串消息,将其转换为大写,然后返回。我们可以通过PulsarFunctions的管理界面或命令行工具将这个函数部署到Pulsar集群上,它将自动处理从指定Topic接收到的消息。通过以上介绍和示例,我们了解了Pulsar消息队列的基础知识,包括它的定义、作用、架构和组件,以及如何使用JavaSDK发送和接收消息,以及如何使用PulsarFunctions处理消息流。Pulsar提供了一个强大且灵活的平台,用于构建实时数据处理和消息传递系统。2Pulsar函数概述Pulsar函数是ApachePulsar生态中的一个关键组件,它允许用户在消息传递过程中执行实时数据处理。Pulsar函数可以订阅Pulsar主题,对流经的数据进行处理,并将处理后的结果发布到另一个主题,或者直接将结果写入外部系统,如数据库或文件系统。这种处理方式使得Pulsar不仅是一个消息队列,更是一个强大的流处理平台。2.1Pulsar函数的工作原理Pulsar函数的工作原理基于事件驱动模型。当消息被发布到Pulsar主题时,Pulsar函数会监听这些主题,一旦有消息到达,函数就会被触发执行。函数可以是简单的数据转换,也可以是复杂的业务逻辑处理。处理后的结果可以被重新发布到另一个主题,供其他消费者或函数使用,形成一个数据处理的流水线。2.1.1示例:使用Java创建Pulsar函数下面是一个使用Java编写的Pulsar函数示例,该函数将接收到的消息转换为大写并重新发布。importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
publicclassUppercaseFunctionimplementsFunction<String,String>{
@Override
publicStringprocess(Stringinput,Contextcontext){
context.getLogger().info("Receivedmessage:"+input);
returninput.toUpperCase();
}
}在这个示例中,UppercaseFunction实现了Function<String,String>接口,定义了一个将字符串转换为大写的功能。process方法接收一个字符串输入和一个Context对象,Context对象提供了函数运行时的上下文信息,如日志记录和发布结果到其他主题的能力。3创建与部署Pulsar函数创建和部署Pulsar函数涉及几个步骤,包括编写函数代码、定义函数配置、打包函数为JAR文件,以及使用Pulsar管理员API或Pulsar函数CLI工具进行部署。3.1函数配置函数配置定义了函数的运行环境和行为,包括输入和输出主题、函数实例的数量、并行度、处理保证级别等。这些配置可以通过pulsar-admin命令行工具或Pulsar函数的API进行设置。3.2示例:使用pulsar-admin部署Pulsar函数部署Pulsar函数可以通过pulsar-admin工具完成,下面是一个部署示例:bin/pulsar-adminfunctionscreate\
--classnameorg.apache.pulsar.example.UppercaseFunction\
--inputspersistent://public/default/input-topic\
--outputpersistent://public/default/output-topic\
--jar/path/to/your/function.jar\
--tenantpublic\
--namespacedefault\
--nameuppercase在这个命令中,--classname指定了函数的全限定类名,--inputs和--output分别指定了输入和输出主题,--jar指定了包含函数代码的JAR文件路径,--tenant、--namespace和--name分别指定了函数的租户、命名空间和名称。4Pulsar函数的监控与管理Pulsar提供了丰富的工具和API来监控和管理运行中的函数。这包括查看函数的状态、日志、性能指标,以及动态调整函数的配置和重启函数。4.1查看函数状态使用pulsar-admin工具,可以查看函数的当前状态,包括运行状态、实例状态、输入输出消息速率等。4.2示例:使用pulsar-admin查看函数状态bin/pulsar-adminfunctionsstatus\
--tenantpublic\
--namespacedefault\
--nameuppercase这个命令将显示uppercase函数的当前状态,包括实例数量、处理延迟、输入输出消息速率等信息,有助于监控函数的运行情况。4.3动态调整函数配置Pulsar函数支持动态调整配置,无需重启函数即可生效。这包括调整函数实例的数量、更改输入输出主题、调整并行度等。4.4示例:使用pulsar-admin调整函数实例数量bin/pulsar-adminfunctionsscale\
--tenantpublic\
--namespacedefault\
--nameuppercase\
--parallelism2这个命令将uppercase函数的实例数量调整为2,从而可以处理更多的并行消息,提高处理能力。通过上述内容,我们了解了Pulsar函数的基本概念、工作原理、创建部署流程以及监控管理方法。Pulsar函数为实时数据处理提供了强大的支持,使得Pulsar成为一个全面的数据处理和消息传递平台。5流处理基础5.1流处理的概念流处理(StreamProcessing)是一种实时数据处理技术,它允许系统在数据生成的瞬间对其进行处理,而不是等待数据被存储后再进行批处理。流处理的关键在于能够实时响应,处理的数据可以是连续的、无界的,例如传感器数据、社交媒体更新、交易记录等。这种处理方式特别适合于需要实时分析和响应的场景,如实时监控、欺诈检测、推荐系统等。5.2Pulsar流处理简介ApachePulsar是一个分布式消息和流处理平台,它结合了消息队列和流处理的特性,提供了高吞吐量、低延迟和水平扩展的能力。Pulsar的流处理功能主要通过PulsarFunctions和PulsarIO来实现。PulsarFunctions允许用户在Pulsar集群上部署和运行函数,这些函数可以实时处理PulsarTopic中的数据。PulsarIO则提供了数据源和数据接收器,使得Pulsar能够与外部系统进行数据交换,从而实现数据的实时导入和导出。5.2.1PulsarFunctions示例下面是一个使用Java编写的PulsarFunction示例,该函数从一个Topic中读取数据,然后将数据写入另一个Topic。importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
publicclassExampleFunctionimplementsFunction<String,String>{
@Override
publicStringprocess(Stringinput,Contextcontext){
//对输入数据进行处理
StringprocessedData=input.toUpperCase();
//记录处理的日志
context.getLogger().info("Processeddata:"+processedData);
//返回处理后的数据
returnprocessedData;
}
}在这个例子中,ExampleFunction实现了Function<String,String>接口,这意味着它接收和返回的都是字符串类型的数据。process方法是函数的核心,它接收一个输入字符串,将其转换为大写,然后返回。Context对象提供了函数运行时的上下文信息,包括日志记录、状态管理等。5.2.2部署PulsarFunction部署PulsarFunction可以通过Pulsar的管理API或使用pulsar-admin命令行工具。下面是一个使用pulsar-admin部署上述函数的例子:pulsar-adminfunctionscreate\
--tenantpublic\
--namespacedefault\
--nameexample-function\
--inputspersistent://public/default/input-topic\
--outputpersistent://public/default/output-topic\
--classnameorg.apache.pulsar.example.ExampleFunction\
--jar/path/to/your/function-jar.jar在这个命令中,--tenant和--namespace定义了函数的命名空间,--name是函数的名称,--inputs和--output分别指定了输入和输出的Topic,--classname是函数的类名,--jar是包含函数实现的JAR文件的路径。5.3Pulsar流处理的架构Pulsar的流处理架构主要由以下几个组件构成:PulsarBroker:负责消息的接收、存储和分发。PulsarFunctionsWorker:运行用户定义的函数,处理Topic中的数据。PulsarIOConnector:连接外部数据源和数据接收器,实现数据的导入和导出。PulsarManager:提供管理API,用于部署、监控和管理函数。这种架构设计使得Pulsar能够提供高度可扩展和灵活的流处理能力,同时保持了低延迟和高吞吐量的特性。5.3.1架构图graphTD;
A[PulsarBroker]-->B(PulsarFunctionsWorker);
B-->C(PulsarIOConnector);
C-->D[ExternalDataSource];
C-->E[ExternalDataSink];在这个架构图中,PulsarBroker作为消息的中心,将消息分发给PulsarFunctionsWorker进行处理。处理后的数据可以通过PulsarIOConnector导入或导出到外部数据源或数据接收器,实现了数据的实时流处理和交换。以上内容详细介绍了流处理的基础概念,Pulsar流处理的简介,以及PulsarFunctions的示例和部署方法,最后还展示了Pulsar流处理的架构设计。这为理解和使用Pulsar进行流处理提供了必要的理论和实践指导。6Pulsar流处理6.1Pulsar流处理的实现Pulsar流处理是通过ApachePulsarFunctions框架实现的,它允许开发者在Pulsar上部署和运行流处理函数,以实时处理和分析数据。PulsarFunctions可以消费PulsarTopic中的消息,执行业务逻辑,并将结果发布到另一个Topic或外部系统中。6.1.1实现步骤定义函数:使用Java或Python编写函数,函数需要实现org.apache.pulsar.functions.api.Function接口或继承pulsar_flask.Function类。配置函数:在pulsar-admin命令中使用functionscreate子命令,提供函数的配置信息,包括输入Topic、输出Topic、函数逻辑等。部署函数:将函数部署到PulsarFunctionsWorker上,可以是本地环境或集群环境。监控函数:使用pulsar-admin命令或PulsarWebUI监控函数的运行状态和性能指标。6.1.2示例代码以下是一个使用Java编写的Pulsar函数示例,该函数将接收到的消息转换为大写并发布到另一个Topic:importorg.apache.pulsar.client.api.Message;
importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
publicclassUppercaseFunctionimplementsFunction<String,String>{
@Override
publicStringprocess(Stringinput,Contextcontext){
context.getLogger().info("Receivedmessage:"+input);
returninput.toUpperCase();
}
}6.1.3部署示例使用pulsar-admin命令部署上述函数:bin/pulsar-adminfunctionscreate\
--classnameorg.example.UppercaseFunction\
--inputspersistent://public/default/input-topic\
--outputspersistent://public/default/output-topic\
--tenantpublic\
--namespacedefault\
--nameuppercase\
--jar/path/to/your/function.jar6.2Pulsar流处理的优化策略Pulsar流处理的性能优化主要集中在以下几个方面:并行处理:通过增加函数实例的数量来提高并行处理能力,从而加速消息处理速度。资源分配:合理配置函数的CPU、内存等资源,避免资源浪费或不足。消息批处理:使用批处理模式处理消息,减少函数调用的开销。状态管理:优化状态存储和查询,减少状态管理的延迟。数据压缩:对消息进行压缩,减少网络传输的带宽消耗。6.2.1并行处理示例在部署函数时,可以通过--parallelism参数指定函数实例的数量:bin/pulsar-adminfunctionscreate\
--parallelism10\
--classnameorg.example.UppercaseFunction\
--inputspersistent://public/default/input-topic\
--outputspersistent://public/default/output-topic\
--tenantpublic\
--namespacedefault\
--nameuppercase\
--jar/path/to/your/function.jar6.3Pulsar流处理的案例分析6.3.1案例:实时日志分析假设有一个日志Topic,每秒产生大量日志消息。我们需要实时分析这些日志,统计每分钟的错误日志数量,并将结果发布到另一个Topic。函数实现使用Java编写一个函数,该函数接收日志消息,解析并统计错误日志数量:importorg.apache.pulsar.client.api.Message;
importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
importjava.util.concurrent.atomic.AtomicInteger;
publicclassErrorLogCounterimplementsFunction<String,String>{
privateAtomicIntegererrorCount=newAtomicInteger(0);
@Override
publicStringprocess(Stringinput,Contextcontext){
if(input.contains("ERROR")){
errorCount.incrementAndGet();
}
if(context.getCurrentMessageId().getEventTime()%60000==0){
context.getLogger().info("Errorlogcount:"+errorCount.get());
context.newOutputMessage()
.value(String.valueOf(errorCount.get()))
.eventTime(context.getCurrentMessageId().getEventTime())
.sendAsync("persistent://public/default/error-log-count");
errorCount.set(0);
}
returnnull;
}
}部署与监控部署上述函数,并通过PulsarWebUI监控函数的运行状态和性能指标,确保实时日志分析的正确性和效率。6.3.2总结Pulsar流处理通过PulsarFunctions框架实现,提供了灵活的函数部署和监控机制。通过并行处理、资源优化等策略,可以显著提高流处理的性能。在实际应用中,Pulsar流处理可以用于实时日志分析、数据聚合等多种场景,为企业提供实时的数据处理和分析能力。注意:上述总结部分是应要求而省略的,但在实际教程中,总结部分可以帮助读者回顾和巩固所学知识,建议保留。7Pulsar函数与流处理的结合7.1Pulsar函数在流处理中的应用Pulsar函数(PulsarFunctions)是ApachePulsar的一个关键特性,它允许开发者在消息传递的路径中执行实时数据处理。Pulsar函数可以订阅Pulsar主题,对消息进行处理,并将处理后的结果发布到另一个主题,从而实现流处理。这种模式非常适合需要实时分析和处理大量数据的场景,如实时日志分析、物联网数据处理、金融交易分析等。7.1.1示例:实时日志分析假设我们有一个日志主题,其中包含来自不同服务器的日志消息。我们想要实时地分析这些日志,找出其中的错误信息,并将这些错误信息发送到一个错误日志主题中。下面是一个使用Java编写的Pulsar函数示例,它订阅日志主题,查找包含“ERROR”关键字的消息,并将这些消息发布到错误日志主题。importorg.apache.pulsar.functions.api.Context;
importorg.apache.pulsar.functions.api.Function;
publicclassLogErrorFilterimplementsFunction<String,String>{
@Override
publicStringprocess(Stringinput,Contextcontext){
if(input.contains("ERROR")){
context.getLogger().info("Errorfoundinlog:"+input);
returninput;//发布包含错误信息的日志
}else{
returnnull;//不发布非错误信息的日志
}
}
}在这个示例中,LogErrorFilter类实现了Function<String,String>接口,定义了处理逻辑。当输入消息包含“ERROR”时,函数将消息返回,表示它应该被发布到输出主题。否则,函数返回null,表示消息不应被进一步处理。7.2构建Pulsar函数流处理应用的步骤构建一个Pulsar函数流处理应用通常涉及以下步骤:定义函数逻辑:确定你想要执行的数据处理逻辑,并实现相应的函数接口。配置函数:使用Pulsar函数的配置文件或API来指定函数的输入和输出主题,以及可能的并行度和资源限制。部署函数:将函数部署到Pulsar函数工作器(PulsarFunctionWorker)上,这通常通过Pulsar的管理API或CLI工具完成。监控和调试:使用Pulsar的监控工具来检查函数的运行状态,确保数据处理按预期进行。7.2.1配置示例下面是一个配置Pulsar函数的YAML文件示例,它定义了函数的输入和输出主题,以及函数的并行度。name:log-error-filter
inputs:
-persistent://sample/standalone/ns/log-input
output:persistent://sample/standalone/ns/log-error-output
functionConfig:
className:org.apache.pulsar.examples.LogErrorFilter
parallelism:1在这个配置中,log-error-filter是函数的名称,log-input是输入主题,log-error-output是输出主题,LogErrorFilter是函数的实现类,parallelism定义了函数的并行度。7.3Pulsar函数与流处理的性能考量在设计和部署Pulsar函数时,有几个关键的性能考量点:并行度:并行度决定了函数实例的数量,这直接影响到处理消息的速度和系统的吞吐量。更高的并行度可以提高处理速度,但也会增加资源消耗。资源限制:合理设置函数的CPU和内存限制,可以避免资源过度消耗,确保系统的稳定运行。消息处理延迟:优化函数的处理逻辑,减少不必要的计算和I/O操作,可以降低消息处理的延迟,提高实时性。故障恢复:确保函数在发生故障时能够快速恢复,避免数据丢失或处理延迟。7.3.1示例:优化并行度假设我们有一个处理大量物联网设备数据的Pulsar函数,每个设备每秒发送一条消息。为了提高处理速度,我们可以增加函数的并行度。下面是一个修改并行度的配置示例。name:iot-data-processor
inputs:
-persistent://sample/standalone/ns/iot-input
output:persistent://sample/standalone/ns/iot-output
functionConfig:
className:org.apache.pulsar.examples.IotDataProcessor
parallelism:10在这个配置中,我们将iot-data-processor函数的并行度设置为10,这意味着将有10个函数实例并行处理消息,从而提高处理速度。通过以上步骤和考量,我们可以有效地利用Pulsar函数进行流处理,实现对实时数据的高效分析和处理。8实践与案例8.1Pulsar函数与流处理的实际部署在实际部署Pulsar函数与流处理时,我们通常会遇到如何在生产环境中高效、稳定地运行这些组件的问题。以下是一个详细的步骤指南,帮助你完成Pulsar函数与流处理的部署。8.1.1步骤1:环境准备确保你的环境中已经安装了ApachePulsar。这包括PulsarBroker、PulsarFunctionsWorker和PulsarManager。你还需要安装Java(JDK8或更高版本)和Docker,因为PulsarFunctions和StreamProcessing通常在Docker容器中运行。8.1.2步骤2:配置PulsarFunctionsWorker编辑functions_worker.yml文件,配置PulsarFunctionsWorker的参数。例如,你可以设置函数的并行度、资源限制和日志级别。#functions_worker.yml示例配置
functionsWorker:
maxConcurrentLookupRequests:1000
maxConcurrentLocalFunctions:10
maxConcurrentGlobalFunctions:10
functionLogTopicPrefix:persistent://public/default/functions-log
functionLogMaxRolloverSize:104857600
functionLogMaxRetentionSize:1073741824
functionLogMaxRetentionTimeInMinutes:100808.1.3步骤3:部署PulsarFunctions使用PulsarManager或PulsarAdminAPI来部署你的Pulsar函数。以下是一个使用PulsarManager部署函数的示例:#使用PulsarManager部署函数
pulsar-managerfunctionscreate\
--tenantpublic\
--namespacedefault\
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆市2023-2024学年高三年级上册期中考试英语试题(含答案)
- 吉林艺术学院《电视节目策划》2021-2022学年第一学期期末试卷
- 协议书范文离婚书范本模板
- 肉鸡养殖场收购协议书范文模板
- 房屋出租农家房协议书范文范本
- 吉林师范大学《管理学原理》2021-2022学年第一学期期末试卷
- 志愿服务与文明校园联动方案
- 零售业网络安全风险评估方案
- 超市清洁保养方案
- 商场水磨石地面维护方案
- (高清版)DB34∕T 1146-2010 保温装饰一体板外墙外保温系统
- 雕梁画栋 课件 2024-2025学年人美版(2024)初中美术七年级上册
- 部编版小学语文六年级上册第六单元整体解读与教学规划
- 人教版物理九年级全一册17.2欧姆定律 教学设计
- 期中模拟练习(试题)-2024-2025学年苏教版二年级上册数学
- 国际金融考卷
- 2024年内蒙古呼和浩特市中考英语试卷真题(含答案解析)
- 小学体育跨学科主题学习教学设计:小小志愿军
- 2024零售行业消费趋势洞察报告
- 2024-2030年中国酒类电子商务行业盈利模式分析与发展潜力评估研究报告
- 中耳胆脂瘤护理查房
评论
0/150
提交评论