数据分析工具:Apache Druid:实时数据摄取与批量数据导入_第1页
数据分析工具:Apache Druid:实时数据摄取与批量数据导入_第2页
数据分析工具:Apache Druid:实时数据摄取与批量数据导入_第3页
数据分析工具:Apache Druid:实时数据摄取与批量数据导入_第4页
数据分析工具:Apache Druid:实时数据摄取与批量数据导入_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据分析工具:ApacheDruid:实时数据摄取与批量数据导入1数据分析工具:ApacheDruid:实时数据摄取与批量数据导入1.1简介1.1.1ApacheDruid介绍ApacheDruid是一个开源的数据存储和查询系统,专为实时分析大规模数据集而设计。它能够处理PB级别的数据,提供低延迟的数据查询和聚合功能,适用于实时监控、交互式数据探索和多维数据分析等场景。Druid的核心架构包括数据摄取、查询引擎、数据存储和分布式计算,使其能够高效地处理大量数据并提供快速的查询响应。1.1.2ApacheDruid的应用场景实时监控:Druid可以实时摄取数据流,如网站点击流、设备日志等,用于实时监控和警报。交互式数据探索:支持快速的多维数据查询和聚合,适用于数据分析师进行交互式的数据探索。多维数据分析:Druid能够处理多维数据集,提供丰富的数据可视化和分析功能,适用于商业智能和数据仓库场景。1.1.3ApacheDruid的核心特性实时数据摄取:Druid支持实时数据摄取,能够即时处理和存储数据流,提供低延迟的数据查询。批量数据导入:除了实时数据摄取,Druid还支持批量数据导入,可以处理历史数据的导入和更新。分布式计算:Druid采用分布式架构,能够水平扩展,处理大规模数据集。多维数据查询:提供多维数据查询和聚合功能,支持复杂的查询模式。高可用性和容错性:Druid设计有高可用性和容错性,确保数据的可靠性和服务的连续性。1.2实时数据摄取1.2.1原理实时数据摄取是ApacheDruid的一个关键特性,它通过实时摄取服务(Real-timeTask)来处理数据流。实时摄取服务可以接收来自各种数据源的数据,如Kafka、Flume等,然后将数据转换为Druid的内部数据格式并存储在Druid集群中。这一过程是低延迟的,确保数据的实时性和可用性。1.2.2示例假设我们有一个Kafka数据流,包含网站的点击日志,我们想要实时摄取这些数据到Druid中。以下是一个简单的实时摄取配置示例:{

"type":"realtime",

"spec":{

"dataSchema":{

"dataSource":"web_logs",

"parser":{

"type":"string",

"parseSpec":{

"format":"json",

"timestampSpec":{

"column":"timestamp",

"format":"auto"

},

"dimensionsSpec":{

"dimensions":["user_id","url","referrer"],

"dimensionExclusions":[]

},

"metricsSpec":[

{

"name":"count",

"type":"count"

}

]

}

},

"granularitySpec":{

"type":"uniform",

"segmentGranularity":"HOUR",

"queryGranularity":"MINUTE",

"rollup":true

}

},

"ioConfig":{

"type":"kafka",

"kafkaConfig":{

"bootstrap.servers":"localhost:9092",

"topic":"web_logs",

"group.id":"druid-consumer",

"zookeeper.connect":"localhost:2181"

}

},

"tuningConfig":{

"type":"kafka",

"maxRowsInMemory":100000,

"maxRowsPerSegment":5000000,

"maxPendingPersists":1

}

}

}在这个示例中,我们定义了一个名为web_logs的数据源,它将从Kafka主题web_logs中摄取数据。数据格式为JSON,包含时间戳、用户ID、URL和referrer等字段。我们还定义了数据的粒度,以小时为单位分割数据,并以分钟为单位进行查询。最后,我们配置了Kafka的连接信息和数据处理的调优参数。1.3批量数据导入1.3.1原理批量数据导入是Druid处理历史数据的主要方式。它通过批量导入任务(IndexTask)来处理数据文件,如CSV、Parquet等格式。批量导入任务可以将数据文件转换为Druid的内部数据格式,并存储在Druid集群中。这一过程可以是离线的,适用于处理大量历史数据。1.3.2示例假设我们有一个CSV文件,包含过去一年的网站点击日志,我们想要将这些数据批量导入到Druid中。以下是一个简单的批量导入配置示例:{

"type":"index",

"spec":{

"dataSchema":{

"dataSource":"web_logs",

"parser":{

"type":"string",

"parseSpec":{

"format":"csv",

"timestampSpec":{

"column":"timestamp",

"format":"yyyy-MM-dd'T'HH:mm:ss.SSSZ"

},

"dimensionsSpec":{

"dimensions":["user_id","url","referrer"],

"dimensionExclusions":[]

},

"metricsSpec":[

{

"name":"count",

"type":"count"

}

]

}

},

"granularitySpec":{

"type":"uniform",

"segmentGranularity":"DAY",

"queryGranularity":"MINUTE",

"rollup":true

}

},

"ioConfig":{

"type":"index",

"firehose":{

"type":"local",

"baseDir":"/path/to/data",

"filter":"web_logs.csv"

},

"appendToExisting":false

},

"tuningConfig":{

"type":"index",

"maxRowsInMemory":100000,

"maxRowsPerSegment":5000000,

"indexSpec":{

"bitmap":{

"type":"roaring"

}

}

}

}

}在这个示例中,我们定义了一个名为web_logs的数据源,它将从本地文件系统中读取名为web_logs.csv的CSV文件。数据包含时间戳、用户ID、URL和referrer等字段。我们定义了数据的粒度,以天为单位分割数据,并以分钟为单位进行查询。最后,我们配置了数据处理的调优参数,包括内存中最大行数、每个段的最大行数以及位图索引的类型。1.4总结ApacheDruid通过实时数据摄取和批量数据导入,提供了灵活的数据处理能力,适用于实时监控、交互式数据探索和多维数据分析等场景。无论是实时数据流还是历史数据文件,Druid都能够高效地处理和存储,提供低延迟的查询响应。通过上述示例,我们可以看到Druid在处理不同数据源时的配置灵活性和强大功能。2安装与配置2.1ApacheDruid的安装步骤在开始安装ApacheDruid之前,确保你的系统满足以下要求:Java8或更高版本至少4GB的内存稳定的网络连接2.1.1下载ApacheDruid访问ApacheDruid的官方网站下载最新版本的Druid。选择适合你的操作系统的版本,通常为.tar.gz或.zip文件。2.1.2解压安装包将下载的安装包解压到你选择的目录中。例如,如果你下载的是apache-druid-0.18.0.tar.gz,可以使用以下命令在Linux系统上解压:tar-xzfapache-druid-0.18.0.tar.gz2.1.3启动ApacheDruid进入解压后的目录,找到bin目录下的启动脚本。在Linux或macOS上,使用以下命令启动Druid:./bin/start-druid.sh在Windows上,你可能需要使用.bat文件来启动Druid。2.1.4验证安装安装完成后,可以通过访问Druid的监控界面来验证安装是否成功。默认情况下,Druid的监控界面可以在以下URL访问:http://localhost:8080/druid/indexer/v1/taskhttp://localhost:8080/druid/coordinator/v1/datasourceshttp://localhost:88882.2配置ApacheDruid环境ApacheDruid的配置主要通过修改配置文件来完成。Druid的配置文件位于解压后的目录下的conf文件夹中。2.2.1修改配置文件打开conf/druid/coordinator目录下的perties文件,你可以修改以下配置:druid.coordinator.dataSourceConfigurators=druid.coordinator.hdfs.HdfsDataSourceConfigurator

druid.coordinator.metastore.type=derby

druid.coordinator.metastore.connectURI=jdbc:derby:druid-metastore;create=true这些配置分别指定了数据源配置器的类型、元数据存储的类型以及元数据存储的连接URI。2.2.2配置日志在conf/druid/overlord目录下的perties文件中,可以配置日志的级别和输出位置:druid.log.level=INFO

druid.log4j.configurationFile=conf/druid/log4j2.xml2.2.3配置数据摄取在conf/druid/indexer目录下的perties文件中,可以配置数据摄取的相关参数:druid.indexer.runner.javaOpts=-Xmx4g

druid.indexer.task.timeout=PT1H这些配置分别指定了摄取任务的Java内存选项和超时时间。2.3ApacheDruid的基本架构理解ApacheDruid是一个用于实时数据摄取和批量数据导入的高性能数据存储和查询系统。它由以下几个主要组件构成:2.3.1CoordinatorCoordinator是Druid的主节点,负责管理数据源和任务调度。它监控集群中的数据分布,并确保数据在集群中均匀分布。2.3.2OverlordOverlord负责接收数据摄取任务,并将任务分发给集群中的其他节点。它还负责监控任务的执行状态。2.3.3HistoricalHistorical节点存储历史数据,并提供数据查询服务。它们是集群中的数据存储节点。2.3.4RealtimeRealtime节点负责实时数据的摄取和存储。它们可以处理流式数据源,并将数据实时地存储到集群中。2.3.5MiddleManagerMiddleManager节点负责接收Overlord分发的任务,并执行任务。它们可以是Historical或Realtime节点。2.3.6BrokerBroker节点负责接收查询请求,并将查询分发给集群中的其他节点。它们提供了一个统一的查询入口点。2.3.7SegmentSegment是Druid中数据的最小存储单位。每个数据源由多个Segment组成,每个Segment包含了一定时间范围内的数据。2.3.8元数据存储Druid使用元数据存储来保存集群状态和数据源信息。默认情况下,它使用Derby数据库作为元数据存储,但也可以配置为使用MySQL或PostgreSQL。2.3.9理解数据摄取流程数据摄取流程通常包括以下步骤:数据导入:数据从外部数据源导入到Druid。数据转换:数据在导入过程中可能需要进行转换,例如,将时间戳转换为Druid支持的格式。数据存储:转换后的数据被存储到Segment中。数据分发:Segment被分发到Historical或Realtime节点。数据查询:数据可以通过Broker节点进行查询。通过理解这些组件和流程,你可以更好地配置和使用ApacheDruid,以满足你的实时数据摄取和批量数据导入需求。3实时数据摄取3.1实时摄取的原理与流程实时数据摄取是ApacheDruid的一个关键特性,它允许系统以低延迟的方式处理和分析流式数据。这一过程主要通过Druid的实时摄取架构实现,该架构包括以下组件:Broker-负责接收查询并将其分发到合适的节点。Historical-存储历史数据,处理历史查询。MiddleManager-负责协调实时数据的摄取和存储。Indexer-执行数据摄取任务,可以是实时或批量的。Coordinator-管理数据段的生命周期,确保数据在集群中均匀分布。实时摄取流程如下:数据接收-Druid通过Firehose接口接收实时数据流。数据处理-Indexer节点处理数据,将其转换为Druid的数据格式。数据存储-处理后的数据被存储在MiddleManager节点上,形成实时数据段。数据查询-Broker节点接收查询,根据数据的实时性将查询分发到MiddleManager或Historical节点。3.2使用Firehose进行实时数据摄取Firehose是Druid用于实时数据摄取的接口,它能够连接到各种数据源,如Kafka、AmazonKinesis等,以流式方式接收数据。下面是一个使用Kafka作为数据源的Firehose配置示例:{

"type":"kafka",

"consumerProperties":{

"bootstrap.servers":"localhost:9092",

"group.id":"druid-kafka-consumer"

},

"topic":"druid-ingestion",

"zookeeperHost":"localhost",

"zookeeperPort":2181,

"zookeeperPath":"/druid/kafka",

"maxPendingMessagesPerPartition":1000,

"maxUncommittedOffsetsPerPartition":10000,

"maxUncommittedOffsetsTotal":100000

}3.2.1解释type-指定Firehose的类型,这里是Kafka。consumerProperties-Kafka消费者的配置,包括服务器地址和消费者组ID。topic-Kafka主题名称,数据将从这个主题中摄取。zookeeperHost和zookeeperPort-Zookeeper的主机和端口,用于Kafka的元数据管理。zookeeperPath-Zookeeper中用于存储Druid元数据的路径。maxPendingMessagesPerPartition-每个分区最多待处理的消息数。maxUncommittedOffsetsPerPartition和maxUncommittedOffsetsTotal-控制未提交偏移量的限制,以避免内存溢出。3.3实时摄取的性能调优为了优化实时数据摄取的性能,可以采取以下策略:增加Indexer节点-增加Indexer节点的数量可以提高数据处理的并行度,从而加快摄取速度。调整Firehose配置-根据数据流的特性调整Firehose的配置参数,如maxPendingMessagesPerPartition,以避免内存溢出或数据处理延迟。使用Rollup-Rollup是一种预聚合技术,可以在数据摄取时进行聚合操作,减少查询时的数据处理量。优化数据模型-确保数据模型设计合理,如合理选择维度和度量,可以提高查询性能。监控和调整-使用Druid的监控工具定期检查系统性能,根据需要调整配置参数。3.3.1示例:使用Rollup进行预聚合在实时摄取配置中,可以启用Rollup来预聚合数据。下面是一个配置示例:{

"dataSchema":{

"dataSource":"example",

"granularitySpec":{

"type":"uniform",

"segmentGranularity":"HOUR",

"queryGranularity":"MINUTE",

"rollup":true

},

"metricsSpec":[

{

"name":"count",

"type":"count"

},

{

"name":"sum_value",

"type":"longSum",

"fieldName":"value"

}

],

"dimensionsSpec":{

"dimensions":["dimension1","dimension2"]

}

},

"tuningConfig":{

"type":"realtime",

"maxRowsInMemory":100000,

"intermediatePersistPeriod":"PT10M"

}

}3.3.2解释rollup-设置为true表示启用预聚合。metricsSpec-定义了要聚合的度量,如计数和长整型求和。dimensionsSpec-定义了维度,这些维度将被用于聚合操作。maxRowsInMemory-控制每个Indexer节点在内存中处理的最大行数,以避免内存溢出。intermediatePersistPeriod-设置中间结果的持久化周期,以减少数据丢失的风险。通过以上配置,Druid在摄取数据时会自动进行预聚合,从而在查询时提供更快的响应速度。4批量数据导入4.1批量导入的必要性与场景在大数据分析领域,ApacheDruid提供了强大的实时数据处理能力,但同时也支持批量数据导入,这对于处理历史数据或大规模数据集尤为重要。批量导入可以显著提高数据加载速度,减少资源消耗,适用于以下场景:历史数据回填:当需要将大量历史数据加载到Druid时,批量导入可以快速完成数据的初始化。定期数据更新:对于定期生成的大型数据集,如日志文件或销售数据,批量导入可以高效地更新数据仓库。数据迁移:从其他数据存储系统迁移数据到Druid时,批量导入可以确保数据的完整性和一致性。4.2使用Index任务进行批量数据导入ApacheDruid的批量数据导入主要通过Index任务实现。Index任务可以从多种数据源读取数据,如CSV文件、JSON文件或数据库查询结果,并将其转换为Druid可以理解的格式,然后加载到数据表中。4.2.1示例:从CSV文件导入数据假设我们有一个CSV文件,包含以下数据:timestamp,metric,host

2022-01-01T00:00:00.000Z,10.5,server1

2022-01-01T00:01:00.000Z,11.2,server2

2022-01-01T00:02:00.000Z,10.8,server1我们可以使用以下Index任务的JSON配置文件来导入这些数据:{

"type":"index",

"spec":{

"dataSchema":{

"dataSource":"example",

"parser":{

"type":"string",

"parseSpec":{

"format":"csv",

"timestampSpec":{

"column":"timestamp",

"format":"iso"

},

"dimensionsSpec":{

"dimensions":["host"],

"dimensionExclusions":[]

},

"metricsSpec":[

{

"type":"count",

"name":"count"

},

{

"type":"doubleSum",

"name":"metric",

"fieldName":"metric"

}

],

"columns":["timestamp","metric","host"],

"skipHeaderRecord":true

}

},

"ioConfig":{

"type":"index",

"inputSource":{

"type":"local",

"baseDir":"/path/to/data",

"filter":"data.csv"

},

"inputFormat":{

"type":"csv"

}

},

"tuningConfig":{

"type":"index",

"maxRowsInMemory":5000000,

"indexSpec":{

"bitmap":{

"type":"roaring"

}

}

}

},

"dataGranularitySpec":{

"type":"uniform",

"segmentGranularity":"DAY",

"queryGranularity":"HOUR",

"rollup":true

}

}

}4.2.2解释dataSource:指定数据源的名称,这里是example。parser:定义数据解析规则,包括时间戳格式、维度和度量字段。ioConfig:指定数据的输入源和格式。tuningConfig:用于优化导入过程,如内存使用和索引类型。4.3优化批量导入的策略为了提高批量导入的效率和性能,可以采取以下策略:数据预处理:在导入前对数据进行预处理,如压缩、排序或聚合,可以减少导入时间和存储空间。使用合适的索引类型:根据数据特性和查询需求选择合适的索引类型,如RoaringBitmap或ConciseBitmap。调整导入参数:通过调整maxRowsInMemory、maxRowsPerSegment等参数,优化内存使用和段的大小。并行导入:利用Druid的并行处理能力,同时导入多个数据段,加速数据加载过程。监控和调优:监控导入任务的性能指标,如错误率、导入速度等,根据监控结果调整导入策略。通过这些策略,可以确保ApacheDruid的批量数据导入既高效又稳定,满足大数据分析的需求。5数据查询与分析5.1ApacheDruid的查询语言SQLApacheDruid支持标准的SQL查询语言,这使得数据分析师和开发者能够使用熟悉的语法来查询和分析数据。Druid的SQL查询功能强大,能够处理实时和历史数据,支持各种聚合和过滤操作。5.1.1示例:使用SQL查询ApacheDruid数据假设我们有一个名为events的数据表,其中包含用户事件数据,字段包括timestamp(事件时间戳)、user_id(用户ID)、event_type(事件类型)等。下面是一个查询示例,用于计算每天的事件总数:--使用标准SQL查询每天的事件总数

SELECT

DATE_TRUNC('day',timestamp)ASday,

COUNT(*)ASevent_count

FROM

events

GROUPBY

day

ORDERBY

dayASC;在这个查询中,DATE_TRUNC函数用于将时间戳截断到天级别,COUNT(*)函数用于计算每天的事件数量。GROUPBY和ORDERBY子句分别用于按天分组和排序结果。5.2实时查询与历史查询的区别在ApacheDruid中,实时查询和历史查询针对不同类型的查询进行了优化,以提高查询性能和响应速度。5.2.1实时查询实时查询主要用于处理最近的数据,即数据摄取后不久的数据。这些查询通常需要快速响应,以便实时监控和分析。实时查询通过Druid的实时数据摄取层进行,该层设计为低延迟和高吞吐量。5.2.2历史查询历史查询则用于处理较旧的数据,这些数据可能已经经过一段时间的存储和压缩。历史查询通过Druid的历史数据存储层进行,该层优化了数据的存储和压缩,以支持大规模数据的高效查询。5.2.3示例:实时查询与历史查询的使用场景假设我们正在监控一个应用程序的实时用户活动,我们可能需要执行实时查询来获取过去几分钟内的用户登录次数。另一方面,如果我们需要分析过去一年的用户行为模式,那么我们将使用历史查询来处理这些数据。5.3使用ApacheDruid进行数据可视化ApacheDruid与多种数据可视化工具集成,如ApacheSuperset、Grafana和Kibana,使得数据分析师能够轻松地创建和分享数据可视化报告。通过这些工具,用户可以将Druid中的数据转换为图表、仪表板和其他可视化元素,以更直观地理解数据。5.3.1示例:使用ApacheSuperset连接ApacheDruid数据源配置Druid数据源:在ApacheSuperset中,首先需要配置一个指向Druid服务器的数据源。这通常涉及到输入Druid服务器的URL和其他连接参数。创建可视化:一旦数据源配置完成,就可以使用Superset的可视化工具来创建图表。例如,可以创建一个折线图来展示每天的事件趋势。#Superset中创建图表的伪代码示例

#注意:Superset使用Flask和Jinja2模板引擎,但具体代码实现取决于Superset的版本和配置

fromsupersetimportapp

fromsuperset.models.coreimportDatabase

#获取Druid数据源

druid_db=Database.get('druid_data_source')

#创建图表

chart=Chart(

datasource=druid_db,

viz_type='line',

params={

'metric':'event_count',

'groupby':['day'],

'since':'2023-01-01',

'until':'2023-01-31'

}

)

#渲染图表

withapp.app_context():

chart.render()在这个示例中,我们首先从Superset的数据库模型中获取了Druid数据源。然后,我们创建了一个图表对象,指定了图表类型为折线图,并设置了查询参数,包括要查询的度量(event_count)、分组字段(day)以及查询的时间范围。最后,我们使用Superset的上下文来渲染图表。通过上述步骤,数据分析师可以利用ApacheDruid的强大查询能力,结合数据可视化工具,快速地分析和展示数据,从而更好地理解数据模式和趋势。6高级功能与最佳实践6.1ApacheDruid的数据分片与分区6.1.1数据分片ApacheDruid通过数据分片(sharding)来实现数据的水平扩展。数据分片是指将数据集分割成多个较小的部分,每个部分存储在集群的不同节点上。这种策略可以提高查询性能和数据的可用性,因为查询可以并行地在多个节点上执行,而不会因为单个节点的故障而影响整个查询过程。实现方式Druid使用哈希算法来确定数据片段的分布。每个数据片段都有一个唯一的标识符,称为“shardspec”。当数据被摄取时,Druid会根据shardspec来决定数据应该存储在哪个节点上。示例假设我们有一个包含全球用户活动的日志数据集,我们希望根据用户所在的国家进行数据分片。我们可以定义一个基于国家的shardspec,如下所示:{

"type":"hashed",

"partitionSize":10,

"partitionKey":"country"

}在这个例子中,partitionSize指定了我们将数据集分成多少个片段,partitionKey指定了我们根据哪个字段进行分片。6.1.2数据分区数据分区(partitioning)是另一种优化数据存储和查询性能的策略。在Druid中,数据通常按照时间进行分区,这意味着数据被分割成多个时间范围,每个时间范围的数据存储在一个单独的分区中。这种策略可以减少查询时需要扫描的数据量,从而提高查询速度。示例如果我们有一个包含一年内用户活动的日志数据集,我们可以将其按照月份进行分区。这意味着每个月的数据将存储在一个单独的分区中。在Druid中,我们可以使用以下的JSON配置来定义基于时间的分区策略:{

"type":"time",

"interval":"P1M",

"partitionKey":"timestamp"

}在这个配置中,interval指定了分区的时间间隔,partitionKey指定了用于确定数据属于哪个分区的字段。6.2数据压缩与存储优化ApacheDruid提供了多种数据压缩和存储优化技术,以减少存储成本并提高查询性能。6.2.1数据压缩Druid支持多种压缩算法,包括LZ4、Snappy和Zstandard。这些算法可以显著减少数据的存储空间,同时保持较快的查询速度。示例在Druid中,我们可以在数据摄取时指定压缩算法。例如,使用LZ4压缩算法的配置如下:{

"type":"lz4",

"compressionLevel":9

}在这个配置中,compressionLevel指定了压缩的强度,数值越大,压缩后的数据越小,但压缩和解压缩的速度会变慢。6.2.2存储优化Druid的存储优化主要通过数据的列式存储和索引技术来实现。列式存储意味着数据按列而不是按行存储,这在查询时可以避免读取不必要的数据。索引技术则可以加速查询过程,尤其是在进行过滤和聚合操作时。示例在Druid中,我们可以为特定的列创建索引,以加速查询。例如,如果我们经常根据用户ID进行查询,我们可以为用户ID列创建一个倒排索引:{

"type":"bitmap",

"name":"user_id",

"dimension":"user_id"

}在这个配置中,type指定了索引的类型,name指定了索引的名称,dimension指定了用于创建索引的列。6.3ApacheDruid的集群管理与运维ApacheDruid的集群管理与运维是确保系统稳定运行和高效查询的关键。这包括节点管理、数据摄取策略、查询优化和故障恢复等方面。6.3.1节点管理Druid集群由多种类型的节点组成,包括历史节点(Historical)、中间节点(MiddleManager)、协调节点(Coordinator)、查询节点(Broker)和实时节点(Realtime)。每种节点都有其特定的功能和职责,例如,历史节点负责存储和查询历史数据,实时节点负责摄取和查询实时数据。示例在Druid中,我们可以通过修改集群配置文件来添加或删除节点。例如,添加一个历史节点的配置如下:{

"type":"historical",

"host":"00",

"port":8081,

"maxSize":"1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论