




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大数据处理框架:Spark:Spark性能调优与故障排查1大数据处理框架:Spark性能调优与故障排查1.1Spark基础性能调优1.1.1理解Spark执行模型在Spark中,数据处理任务被划分为多个阶段,每个阶段由一系列任务组成。Spark的执行模型基于RDD(弹性分布式数据集)和DAG(有向无环图)调度。当一个Spark作业提交时,DAGScheduler首先将作业分解为多个Stage,然后TaskScheduler负责调度每个Stage中的Task在集群中的Executor上运行。示例:理解Stage和Task的划分假设我们有以下的Spark作业,它从一个数据集开始,进行一系列的转换操作:#导入Spark相关库
frompysparkimportSparkConf,SparkContext
#初始化SparkContext
conf=SparkConf().setAppName("StageAndTaskExample")
sc=SparkContext(conf=conf)
#读取数据
data=sc.textFile("hdfs://localhost:9000/data/input.txt")
#进行转换操作
result=data.map(lambdax:(x,1))\
.reduceByKey(lambdaa,b:a+b)\
.map(lambdax:(x[1],x[0]))\
.sortByKey()在这个例子中,map和reduceByKey操作会触发Stage的划分。map操作是窄依赖,不会导致数据的重新分布,而reduceByKey操作是宽依赖,会触发数据的Shuffle,从而形成一个新的Stage。sortByKey操作也会触发数据的重新分布,形成另一个Stage。1.1.2调整Executor和Task参数Executor和Task的配置对Spark的性能至关重要。Executor是Spark集群中运行Task的进程,而Task是执行在Executor上的具体计算单元。调整这些参数可以优化资源使用,提高处理速度。Executor参数spark.executor.memory:设置每个Executor的内存大小。spark.executor.cores:设置每个Executor的CPU核心数。spark.executor.instances:设置集群中Executor的总数。Task参数spark.sql.shuffle.partitions:设置Shuffle操作的分区数,影响Task的数量和数据分布。spark.default.parallelism:设置默认的并行度,影响Task的数量。示例:调整Executor和Task参数#设置Spark配置参数
conf=SparkConf()\\
.setAppName("ExecutorAndTaskTuning")\\
.set("spark.executor.memory","4g")\\
.set("spark.executor.cores","2")\\
.set("spark.executor.instances","5")\\
.set("spark.sql.shuffle.partitions","10")\\
.set("spark.default.parallelism","20")
#初始化SparkContext
sc=SparkContext(conf=conf)在这个例子中,我们设置了每个Executor的内存为4GB,每个Executor有2个CPU核心,集群中总共有5个Executor。同时,我们设置了Shuffle操作的分区数为10,以及默认的并行度为20,这将影响到Task的划分和执行。1.1.3优化数据Shuffle过程Shuffle是Spark中最耗时的操作之一,它涉及到数据的重新分布,可能导致大量的磁盘I/O和网络传输。优化Shuffle可以显著提高Spark作业的性能。减少Shuffle操作尽量使用map、filter、flatMap等窄依赖操作,避免使用groupByKey、reduceByKey等宽依赖操作,除非必要。使用coalesce或repartition来调整RDD的分区数,减少Shuffle的开销。示例:使用reduceByKey代替groupByKey#读取数据
data=sc.textFile("hdfs://localhost:9000/data/input.txt")
#使用reduceByKey代替groupByKey
result=data.map(lambdax:(x,1))\\
.reduceByKey(lambdaa,b:a+b)在这个例子中,我们使用reduceByKey操作来代替groupByKey,reduceByKey在Shuffle过程中会合并部分数据,减少网络传输的数据量,从而提高性能。调整Shuffle分区数通过设置spark.sql.shuffle.partitions参数,可以调整Shuffle操作的分区数,从而影响Task的数量和数据分布。示例:调整Shuffle分区数#设置Spark配置参数
conf=SparkConf()\\
.setAppName("ShufflePartitionTuning")\\
.set("spark.sql.shuffle.partitions","10")
#初始化SparkContext
sc=SparkContext(conf=conf)
#读取数据
data=sc.textFile("hdfs://localhost:9000/data/input.txt")
#执行reduceByKey操作
result=data.map(lambdax:(x,1))\\
.reduceByKey(lambdaa,b:a+b)在这个例子中,我们通过设置spark.sql.shuffle.partitions参数为10,调整了Shuffle操作的分区数,这将影响到数据的分布和处理速度。通过理解Spark的执行模型,合理调整Executor和Task参数,以及优化数据Shuffle过程,可以显著提高Spark作业的性能和效率。在实际应用中,需要根据具体的数据量和集群资源来调整这些参数,以达到最佳的性能表现。2高级性能调优技术2.1利用Spark缓存机制2.1.1原理Spark的缓存机制是其性能优化的关键特性之一。通过缓存,Spark可以将中间结果存储在内存中,避免了重复计算,特别是在迭代算法和多阶段处理中,这可以显著提高执行效率。缓存级别包括MEMORY_ONLY,MEMORY_ONLY_SER,MEMORY_AND_DISK,MEMORY_AND_DISK_SER,DISK_ONLY,DISK_ONLY_SER等,可以根据数据的大小和持久化需求选择合适的缓存策略。2.1.2示例假设我们有一个大型的DataFrame,需要多次使用,可以使用persist或cache方法来缓存它。#导入SparkSession
frompyspark.sqlimportSparkSession
#创建SparkSession
spark=SparkSession.builder.appName("SparkCacheExample").getOrCreate()
#读取数据
data=spark.read.format("csv").option("header","true").load("large_dataset.csv")
#缓存DataFrame
data.persist()
#执行多次操作
data.filter(data['column']>100).show()
data.groupBy('column').count().show()
#释放缓存
data.unpersist()2.1.3描述在上述示例中,data.persist()将DataFrame缓存到内存中,如果内存不足,Spark会自动将数据写入磁盘。unpersist()方法用于释放缓存,释放内存空间。2.2优化RDD和DataFrame操作2.2.1原理优化Spark中的RDD和DataFrame操作主要涉及减少数据的shuffle,优化数据的分区,以及合理使用broadcast变量。Shuffle操作是Spark中最耗时的部分,因为它涉及到大量的磁盘I/O和网络传输。通过调整partitionBy和repartition函数,可以控制数据的分布,减少shuffle。broadcast变量用于在多个Task中共享大变量,减少网络传输。2.2.2示例下面的示例展示了如何通过repartition和broadcast来优化DataFrame操作。#导入SparkSession和Broadcast
frompyspark.sqlimportSparkSession
frompyspark.sql.functionsimportcol
frompyspark.sql.functionsimportbroadcast
#创建SparkSession
spark=SparkSession.builder.appName("SparkOptimizationExample").getOrCreate()
#读取数据
data1=spark.read.format("csv").option("header","true").load("data1.csv")
data2=spark.read.format("csv").option("header","true").load("data2.csv")
#使用repartition来优化数据分布
data1=data1.repartition(100)
#使用broadcast变量来优化join操作
result=data1.join(broadcast(data2),data1['id']==data2['id'])
#显示结果
result.show()2.2.3描述在示例中,repartition(100)将data1重新分区为100个分区,这有助于平衡计算负载。broadcast(data2)将data2转换为广播变量,当data1和data2进行join操作时,可以显著减少网络传输,提高性能。2.3配置SparkSQL执行策略2.3.1原理SparkSQL的执行策略可以通过调整spark.sql.shuffle.partitions,spark.sql.autoBroadcastJoinThreshold等配置参数来优化。此外,使用DataFrame而非RDD,因为DataFrame提供了更丰富的优化策略,如Catalyst优化器。Catalyst优化器可以进行列剪裁,谓词下推,以及更智能的join和聚合操作优化。2.3.2示例下面的示例展示了如何通过调整配置参数来优化SparkSQL的执行策略。#导入SparkSession
frompyspark.sqlimportSparkSession
#创建SparkSession并设置配置参数
spark=SparkSession.builder\
.appName("SparkSQLOptimizationExample")\
.config("spark.sql.shuffle.partitions","100")\
.config("spark.sql.autoBroadcastJoinThreshold","-1")\
.getOrCreate()
#读取数据
data1=spark.read.format("csv").option("header","true").load("data1.csv")
data2=spark.read.format("csv").option("header","true").load("data2.csv")
#执行SQL查询
result=spark.sql("SELECT*FROMdata1JOINdata2ONdata1.id=data2.id")
#显示结果
result.show()2.3.3描述在示例中,spark.sql.shuffle.partitions被设置为100,这将影响所有shuffle操作的分区数,有助于平衡计算负载。spark.sql.autoBroadcastJoinThreshold被设置为-1,这意味着禁用自动广播join,用户需要显式使用broadcast变量来控制join操作的优化。通过使用SparkSession的sql方法,我们可以直接执行SQL查询,Catalyst优化器会自动应用优化策略。以上示例和原理详细介绍了Spark的高级性能调优技术,包括缓存机制的利用,RDD和DataFrame操作的优化,以及SparkSQL执行策略的配置。通过这些技术,可以显著提高Spark在大数据处理中的性能和效率。3Spark故障排查指南3.1日志和监控系统使用3.1.1日志系统Spark日志系统是故障排查的第一手资料来源。Spark支持多种日志级别,包括ERROR,WARN,INFO,DEBUG,TRACE。在生产环境中,通常配置为ERROR或WARN,以减少日志输出,但在故障排查时,可能需要调整到INFO或DEBUG级别以获取更详细的信息。配置日志级别在Spark的配置文件perties或perties中,可以设置日志级别。例如:#perties示例
log4j.rootCategory=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/ddHH:mm:ss}%p%c{1}:%m%n3.1.2监控系统Spark自带的监控系统提供了丰富的信息,包括任务进度、资源使用情况、执行时间等。这些信息可以通过SparkUI或者使用Spark的RESTAPI来访问。SparkUISparkUI是一个Web界面,可以通过浏览器访问。默认情况下,SparkUI的端口是4040。在SparkUI中,可以查看:ApplicationOverview:应用程序的总体信息,包括运行时间、任务总数、失败任务数等。Environment:应用程序的环境信息,包括Spark版本、配置参数等。Executors:执行器的详细信息,包括内存使用、磁盘使用、任务执行情况等。Jobs:所有任务的列表,包括任务的执行时间、阶段、任务详情等。Stages:所有阶段的列表,包括每个阶段的详细信息,如任务数、执行时间、失败任务数等。使用RESTAPI除了SparkUI,还可以通过RESTAPI来获取监控信息。例如,获取应用程序的概览信息:curlhttp://<master-ip>:4040/api/v1/applications/<app-id>3.2常见错误和异常处理3.2.1SparkShuffleErrorSparkShuffle是Spark中数据重分布的过程,通常发生在groupByKey,reduceByKey,join等操作中。如果Shuffle过程中出现错误,可能是由于网络问题、磁盘空间不足、内存溢出等原因。解决方案增加Shuffle文件的合并数:通过设置spark.shuffle.consolidateFiles参数为true,可以减少Shuffle文件的数量,从而减少磁盘I/O。增加Shuffle的分区数:通过设置spark.sql.shuffle.partitions参数,可以增加Shuffle的分区数,从而减少每个分区的数据量,提高Shuffle的效率。优化数据倾斜:通过repartition或coalesce操作,重新分布数据,避免数据倾斜。3.2.2OutOfMemoryError当Spark的Executor或Driver的内存不足以存储数据时,会抛出OutOfMemoryError。解决方案增加Executor或Driver的内存:通过设置spark.executor.memory和spark.driver.memory参数,增加内存分配。使用内存管理策略:通过设置spark.memory.fraction和spark.memory.storageFraction参数,调整内存的使用策略。优化数据处理:例如,使用persist或cache操作,将数据存储在内存中,避免重复计算;使用mapPartitions操作,减少数据的复制;使用collect或take操作,避免一次性加载大量数据。3.3性能瓶颈分析与解决3.3.1CPU瓶颈如果Spark任务的执行时间主要由CPU占用时间决定,那么可能存在CPU瓶颈。解决方案增加Executor的CPU核数:通过设置spark.executor.cores参数,增加CPU核数。优化算法和数据结构:例如,使用更高效的算法和数据结构,减少CPU的计算时间。3.3.2磁盘I/O瓶颈如果Spark任务的执行时间主要由磁盘I/O时间决定,那么可能存在磁盘I/O瓶颈。解决方案增加磁盘的读写速度:例如,使用SSD磁盘,提高磁盘的读写速度。优化数据存储:例如,使用Parquet或ORC等列式存储格式,减少磁盘I/O;使用persist或cache操作,将数据存储在内存中,避免重复读取数据。3.3.3网络I/O瓶颈如果Spark任务的执行时间主要由网络I/O时间决定,那么可能存在网络I/O瓶颈。解决方案优化网络配置:例如,设置work.timeout参数,增加网络超时时间;设置spark.shuffle.io.maxRetries参数,增加Shuffle过程中的重试次数。优化数据传输:例如,使用mapPartitions操作,减少数据的复制;使用broadcast操作,将小数据集广播到所有Executor,避免网络传输。3.3.4内存瓶颈如果Spark任务的执行时间主要由内存使用时间决定,那么可能存在内存瓶颈。解决方案增加Executor或Driver的内存:通过设置spark.executor.memory和spark.driver.memory参数,增加内存分配。优化数据处理:例如,使用persist或cache操作,将数据存储在内存中,避免重复计算;使用mapPartitions操作,减少数据的复制;使用collect或take操作,避免一次性加载大量数据。3.3.5示例:优化数据倾斜假设我们有一个数据集,其中包含用户ID和购买的商品ID。我们想要统计每个用户购买的商品数量,但是数据集中存在数据倾斜,即某些用户购买的商品数量远多于其他用户,导致某些分区的数据量过大,影响了任务的执行效率。frompyspark.sqlimportSparkSession
#创建SparkSession
spark=SparkSession.builder.appName("OptimizeDataSkew").getOrCreate()
#读取数据
data=spark.read.text("data.txt")
#数据预处理
data=data.withColumn("userID",data.value.substr(1,10)).withColumn("productID",data.value.substr(12,10))
#优化数据倾斜
data=data.repartition("userID")
#统计每个用户购买的商品数量
result=data.groupBy("userID").count()
#输出结果
result.show()在这个示例中,我们使用了repartition操作,根据用户ID重新分布数据,避免了数据倾斜。这样,每个分区的数据量大致相等,提高了任务的执行效率。3.3.6结论Spark的性能调优和故障排查是一个复杂的过程,需要根据具体的应用场景和问题,综合使用日志系统、监控系统、算法优化、资源调整等手段,才能有效地提高Spark的性能和稳定性。4Spark集群管理与优化4.1YARN和Mesos资源管理4.1.1YARN资源管理YARN(YetAnotherResourceNegotiator)是Hadoop生态系统中的一种资源管理器,它允许在集群上运行多个数据处理框架,包括Spark。在YARN模式下,Spark可以更高效地利用Hadoop集群的资源。YARN通过ResourceManager和NodeManager来管理集群资源,而ApplicationMaster则负责为Spark应用程序请求资源和协调任务。示例:使用YARN启动Spark应用程序#使用YARN作为资源管理器启动Spark应用程序
spark-submit--masteryarn--deploy-modecluster--classcom.example.SparkApp/path/to/app.jar/path/to/input/path/to/output在上述代码中,--masteryarn指定了使用YARN作为资源管理器,--deploy-modecluster表示Spark应用程序将在集群模式下运行,--classcom.example.SparkApp指定了应用程序的主类,/path/to/app.jar是应用程序的JAR文件路径,/path/to/input和/path/to/output分别是输入和输出数据的路径。4.1.2Mesos资源管理ApacheMesos是一个集群管理器,它提供了资源隔离和共享的机制,可以运行包括Spark在内的多种框架。Mesos通过Master和Agent来管理资源,其中Master负责资源的分配,而Agent则负责运行任务。示例:使用Mesos启动Spark应用程序#使用Mesos作为资源管理器启动Spark应用程序
spark-submit--mastermesos://master:5050--classcom.example.SparkApp/path/to/app.jar/path/to/input/path/to/output在上述代码中,--mastermesos://master:5050指定了使用Mesos作为资源管理器,master:5050是MesosMaster的地址,其他参数与YARN模式下的启动参数类似。4.2动态资源分配和调整Spark支持动态资源分配,这意味着在运行时,Spark可以根据任务的需求自动增加或减少资源。这有助于提高资源利用率和应用程序的性能。4.2.1动态资源分配原理动态资源分配通过Spark的spark.dynamicAllocation.enabled配置项来启用。当启用动态资源分配时,Spark会根据任务的执行情况动态调整Executor的数量。如果任务需要更多资源,Spark会自动启动更多Executor;如果资源过剩,Spark会自动停止部分Executor,释放资源。4.2.2示例:配置动态资源分配#Spark配置文件中的动态资源分配设置
spark.dynamicAllocation.enabledtrue
spark.dynamicAllocation.minExecutors2
spark.dynamicAllocation.maxExecutors10
spark.dynamicAllocation.cachedExecutorIdleTimeout300s在上述配置中:-spark.dynamicAllocation.enabledtrue启用了动态资源分配。-spark.dynamicAllocation.minExecutors2指定了最小的Executor数量。-spark.dynamicAllocation.maxExecutors10指定了最大的Executor数量。-spark.dynamicAllocation.cachedExecutorIdleTimeout300s指定了空闲的Executor在被回收前的等待时间。4.3集群监控与故障恢复4.3.1集群监控Spark提供了内置的监控工具,包括SparkUI和日志系统,用于监控应用程序的运行状态和性能。SparkUI是一个Web界面,可以查看应用程序的进度、任务执行情况、Executor状态等信息。示例:访问SparkUI在Spark应用程序运行时,可以通过访问http://<master-ip>:4040来查看SparkUI,其中<master-ip>是Spark集群Master的IP地址。4.3.2故障恢复Spark通过RDD的容错机制和检查点(Checkpoint)来实现故障恢复。当Executor或Task失败时,Spark可以从失败点重新计算,或者从最近的检查点恢复数据。示例:设置检查点#在Spark应用程序中设置检查点
frompysparkimportSparkContext
sc=SparkContext("local","CheckpointApp")
text_file=sc.textFile("hdfs://localhost:9000/user/hadoop/input.txt")
counts=text_file.flatMap(lambdaline:line.split(""))\
.map(lambdaword:(word,1))\
.reduceByKey(lambdaa,b:a+b)
counts.cache()#缓存数据
counts.checkpoint()#设置检查点在上述代码中,counts.cache()将数据缓存到内存中,counts.checkpoint()则将数据持久化到磁盘,以便在故障时恢复。4.3.3故障恢复策略Spark的故障恢复策略包括:-Task失败重试:默认情况下,Spark会自动重试失败的Task。-Executor失败恢复:当Executor失败时,Spark会将该Executor上的任务重新分配给其他Executor。-Driver失败恢复:当Driver失败时,Spark应用程序会终止,但可以通过配置spark.yarn.appMasterEnv.SPARK_YARN_IS_DRIVER和spark.yarn.isRecoveryEnabled来实现Driver的自动重启。示例:配置故障恢复#Spark配置文件中的故障恢复设置
spark.yarn.appMasterEnv.SPARK_YARN_IS_DRIVERtrue
spark.yarn.isRecoveryEnabledtrue
spark.task.maxFailures10在上述配置中:-spark.yarn.appMasterEnv.SPARK_YARN_IS_DRIVERtrue和spark.yarn.isRecoveryEnabledtrue启用了Driver的自动重启。-spark.task.maxFailures10指定了每个Task的最大失败次数。通过以上配置和示例,我们可以有效地管理和优化Spark集群,同时确保应用程序的稳定运行和高效性能。5Spark应用程序性能测试5.1设计性能测试用例在设计Spark应用程序的性能测试用例时,关键在于模拟真实世界的负载和数据规模。以下是一个设计性能测试用例的步骤:确定测试目标:比如,测试数据处理速度、内存使用效率或CPU利用率。选择数据集:使用与生产环境相似的数据集,包括数据类型、大小和复杂度。定义工作负载:根据应用程序的业务逻辑,创建类似的数据处理任务,如数据过滤、聚合或连接操作。设置测试环境:确保测试环境与生产环境尽可能一致,包括硬件配置、网络环境和Spark版本。5.1.1示例:性能测试用例设计假设我们有一个Spark应用程序,用于处理日志数据,目标是测试数据过滤操作的性能。我们可以设计以下测试用例:数据集:10GB的日志数据,包含各种类型的日志记录。工作负载:过滤出特定日期范围内的所有日志记录。测试环境:使用与生产环境相同的硬件配置和Spark版本。5.2使用工具进行性能测试Spark提供了多种工具和API来监控和测试应用程序的性能,包括SparkUI、SparkHistoryServer和SparkConf设置。5.2.1SparkUISparkUI是一个Web界面,可以实时监控正在运行的Spark应用程序。它提供了关于应用程序的详细信息,如任务进度、执行时间、资源使用情况等。5.2.2SparkHistoryServerSparkHistoryServer用于查看已完成的Spark应用程序的性能数据。它保存了应用程序的执行历史,便于事后分析和调优。5.2.3SparkConf设置通过SparkConf可以设置Spark应用程序的配置参数,如内存分配、并行度等,以优化性能。5.2.4示例:使用SparkConf设置进行性能测试frompysparkimportSparkConf,SparkContext
conf=SparkConf().setAppName("PerformanceTest").setMaster("local[4]")
sc=SparkContext(conf=conf)
#加载数据
data=sc.textFile("hdfs://localhost:9000/user/spark/logdata.txt")
#执行过滤操作
filtered_data=data.filter(lambdaline:"error"inline)
#计算结果
result=filtered_data.count()
#输出结果
print("Numberoferrorlogs:",result)在这个例子中,我们通过SparkConf设置了应用程序的名称和主节点,同时指定了并行度为4,以测试在不同并行度下的性能。5.3分析测试结果与调优分析Spark应用程序的性能测试结果,主要关注以下几个方面:任务执行时间:检查每个阶段的执行时间,找出瓶颈。资源使用:分析CPU、内存和磁盘I/O的使用情况。并行度:检查并行度是否合理,是否需要调整。数据倾斜:检查数据是否均匀分布,避免数据倾斜导致的性能问题。5.3.1示例:分析测试结果假设我们使用SparkUI监控了一个应用程序,发现某个阶段的执行时间异常长。我们可以进一步检查该阶段的shuffle操作,看是否由于数据倾斜或并行度设置不当导致。5.3.2调优策略增加并行度:通过增加spark.sql.shuffle.partitions参数的值,可以增加并行度,提高处理速度。优化数据存储:使用Parquet或ORC等列式存储格式,可以减少I/O操作,提高读写速度。减少shuffle操作:尽量避免在数据处理中使用shuffle操作,如groupByKey或reduceByKey,可以使用aggregateByKey等替代方法。5.3.3示例:调优代码示例#优化数据存储格式
data=sc.parquetFile("hdfs://localhost:9000/user/spark/logdata.parquet")
#减少shuffle操作
fromoperatorimportadd
#使用aggregateByKey替代reduceByKey
result=data.map(lambdax:(x.date,x)).aggregateByKey((0,[]),
lambdau,v:(u[0]+1,u[1]+[v]),
lambdau,v:(u[0]+v[0],u[1]+v[1]))在这个例子中,我们首先将数据存储格式从文本文件改为Parquet,以优化I/O性能。然后,我们使用aggregateByKey替代reduceByKey,以减少shuffle操作,提高处理速度。通过上述步骤,我们可以有效地设计、执行和分析Spark应用程序的性能测试,进而进行调优,提高应用程序的效率和稳定性。6大数据处理框架:Spark性能调优与故障排查6.1最佳实践与案例研究6.1.1行业应用案例分析在大数据处理领域,ApacheSpark因其高效、灵活和易于使用的特性,成为众多企业的首选框架。例如,一家在线零售公司使用Spark进行实时数据分析,以优化库存管理和预测销售趋势。他们通过以下步骤实现了性能提升:数据分区:根据地理位置对数据进行分区,确保数据在处理时能够更有效地分布在集群中。数据缓存:将频繁访问的数据集缓存到内存中,减少磁盘I/O,提高处理速度。并行度调整:根据集群资源和数据量调整并行度,避
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市场营销学基础知识课件
- 工资薪金所得税说课课件
- 二零二五年度城市燃气监控系统安装合同
- 2025年厂房租赁及配套设施升级改造合同文本
- 2025版电梯装饰工程设计与施工一体化服务合同
- 二零二五年度房屋租赁担保及装修设计服务合同
- 农村社区农业资源整合合同
- 疟疾知识讲座课件
- 儿童教育培训机构师资配备合同
- 畜牧兽医标准化管理课件
- 胫骨髁间棘撕脱骨折课件
- 2023年新疆职业大学单招职业技能考试笔试题库及答案解析
- 《仪表工培训》课件
- 小学语文人教六年级下册(统编)第二单元-《爱丽丝漫游奇境》教学反思
- 化粪池 (有限空间)作业安全告知牌及警示标志
- T∕CGMA 033001-2018 压缩空气站能效分级指南
- 部编人教版五年级语文上册习作《漫画老师》优秀课件(共32张PPT)
- 辽宁省高中毕业生登记表含成绩表学年评语表体检表家庭情况调查表完整版高中档案文件
- 变形铝及铝合金圆铸锭国家标准
- PCN变更申请单
- 质量信得过班组获奖材料
评论
0/150
提交评论