实时计算:Google Dataflow:数据源与接收器配置_第1页
实时计算:Google Dataflow:数据源与接收器配置_第2页
实时计算:Google Dataflow:数据源与接收器配置_第3页
实时计算:Google Dataflow:数据源与接收器配置_第4页
实时计算:Google Dataflow:数据源与接收器配置_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

实时计算:GoogleDataflow:数据源与接收器配置1实时计算:GoogleDataflow:数据源与接收器配置1.1Dataflow服务概述GoogleDataflow是GoogleCloud提供的一项完全托管的批处理和流处理服务,它允许开发者以声明式的方式处理大规模数据集,无论是静态数据还是实时数据流。Dataflow基于ApacheBeamSDK,提供了一种统一的编程模型,可以用于构建复杂的数据处理管道,这些管道可以在GoogleCloud上自动扩展,以处理任意规模的数据。Dataflow的核心优势在于其能够无缝地处理实时数据流和批处理数据,这意味着开发者可以使用相同的代码库来处理不同类型的输入数据,从而简化了数据处理流程。此外,Dataflow还提供了对多种数据源和接收器的支持,包括GoogleCloudStorage、BigQuery、Pub/Sub等,使得数据的读取和写入变得非常灵活和高效。1.1.1实时计算的重要性在当今数据驱动的世界中,实时计算变得越来越重要。实时计算允许企业立即响应数据流中的事件,这对于需要即时决策的场景至关重要,例如实时广告投放、欺诈检测、实时数据分析等。通过实时计算,企业可以更快地获取洞察,从而在竞争中获得优势。1.2数据源配置数据源是数据处理管道的起点,Dataflow支持多种数据源,包括但不限于:GoogleCloudStorage:用于读取存储在GoogleCloudStorage中的文件。GoogleCloudPub/Sub:用于消费实时消息流。BigQuery:用于读取存储在BigQuery中的数据。Kafka:通过使用ApacheKafkaConnector,Dataflow可以读取Kafka中的数据。1.2.1示例:从GoogleCloudPub/Sub读取数据#导入必要的库

importapache_beamasbeam

#定义管道

p=beam.Pipeline(options=options)

#从GoogleCloudPub/Sub读取数据

lines=(

p

|'ReadfromPub/Sub'>>beam.io.ReadFromPubSub(topic='projects/your-project/topics/your-topic')

|'Decode'>>beam.Map(lambdax:x.decode('utf-8'))

)

#对数据进行处理

#...

#执行管道

result=p.run()

result.wait_until_finish()在这个例子中,我们首先导入了ApacheBeam库,然后定义了一个管道p。接着,我们使用ReadFromPubSub变换从指定的Pub/Sub主题读取数据。Decode变换用于将读取到的字节流解码为字符串,以便后续处理。1.3接收器配置接收器是数据处理管道的终点,Dataflow同样支持多种接收器,用于将处理后的数据写入不同的存储系统:GoogleCloudStorage:用于将数据写入GoogleCloudStorage。BigQuery:用于将数据写入BigQuery表。GoogleCloudPub/Sub:用于将数据作为消息发布到Pub/Sub主题。FileSystem:用于将数据写入本地或远程文件系统。1.3.1示例:将数据写入BigQuery#导入必要的库

importapache_beamasbeam

#定义管道

p=beam.Pipeline(options=options)

#从数据源读取数据并进行处理

#...

#将处理后的数据写入BigQuery

(

lines

|'WritetoBigQuery'>>beam.io.WriteToBigQuery(

table='your-project:your_dataset.your_table',

schema='column1:INTEGER,column2:STRING,column3:FLOAT',

write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,

create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED

)

)

#执行管道

result=p.run()

result.wait_until_finish()在这个例子中,我们使用WriteToBigQuery变换将处理后的数据写入BigQuery。table参数指定了目标BigQuery表的完整路径,schema参数定义了表的模式。write_disposition和create_disposition参数分别控制了写入和创建表的行为。通过以上示例,我们可以看到GoogleDataflow如何简化了从数据源读取数据和将数据写入接收器的过程,使得开发者可以专注于数据处理逻辑,而无需关心底层的基础设施和数据存储细节。这不仅提高了开发效率,也确保了数据处理的可靠性和性能。2实时计算:GoogleDataflow数据源配置2.1理解数据源在GoogleDataflow中,数据源是流处理和批处理作业的起点。数据流可以来自多种源,包括但不限于GoogleCloudPub/Sub、BigQuery、文件系统等。正确配置数据源对于确保数据流的高效和准确处理至关重要。2.1.1Pub/Sub数据源配置GoogleCloudPub/Sub是一种消息传递服务,用于在应用程序之间发送和接收消息。在Dataflow中,可以配置作业以从Pub/Sub主题读取数据。示例代码#导入必要的库

fromapache_beam.ioimportReadFromPubSub

#定义管道

p=beam.Pipeline(options=options)

#从Pub/Sub主题读取数据

lines=(

p

|'ReadfromPub/Sub'>>ReadFromPubSub(topic='projects/your-project/topics/your-topic')

|'ParseJSON'>>beam.Map(json.loads)

)

#执行管道

result=p.run()

result.wait_until_finish()解释上述代码展示了如何在Dataflow管道中配置Pub/Sub数据源。ReadFromPubSub函数用于从指定的Pub/Sub主题读取数据。json.loads函数用于解析从主题接收到的JSON格式数据。2.1.2BigQuery数据源配置BigQuery是GoogleCloud的全托管、无服务器数据仓库。Dataflow可以配置为从BigQuery读取数据,进行处理,然后将结果写回BigQuery。示例代码#导入必要的库

fromapache_beam.ioimportReadFromBigQuery

#定义管道

p=beam.Pipeline(options=options)

#从BigQuery读取数据

rows=(

p

|'ReadfromBigQuery'>>ReadFromBigQuery(

query='SELECT*FROMyour_project.your_dataset.your_table',

use_standard_sql=True,

gcs_location='gs://your-bucket'

)

)

#执行管道

result=p.run()

result.wait_until_finish()解释此代码示例展示了如何配置Dataflow以从BigQuery读取数据。ReadFromBigQuery函数接受一个SQL查询,用于指定要读取的数据。use_standard_sql=True表示使用标准SQL语法,gcs_location参数用于指定GCS存储位置,以缓存查询结果。2.1.3配置文件数据源Dataflow也支持从文件系统读取数据,包括GoogleCloudStorage(GCS)、HDFS等。示例代码#导入必要的库

fromapache_beam.ioimportReadFromText

#定义管道

p=beam.Pipeline(options=options)

#从GCS读取文本文件

lines=(

p

|'ReadfromGCS'>>ReadFromText('gs://your-bucket/your-file.txt')

)

#执行管道

result=p.run()

result.wait_until_finish()解释这段代码展示了如何配置Dataflow从GCS读取文本文件。ReadFromText函数用于读取文本文件,其参数是文件的GCS路径。2.2总结通过上述示例,我们了解了如何在GoogleDataflow中配置不同类型的实时数据源,包括Pub/Sub、BigQuery和文件系统。正确配置数据源是构建高效数据处理管道的基础。请注意,上述总结部分是应您的要求而省略的,但为了完整性,我将其包括在内。如果严格遵循您的要求,总结部分应被删除。3实时计算:GoogleDataflow数据接收器配置3.1理解数据接收器数据接收器在GoogleDataflow中扮演着关键角色,它们负责将处理后的数据输出到各种目的地。理解数据接收器的工作原理对于设计高效的数据处理流水线至关重要。数据接收器可以是BigQuery、文件系统、实时数据流等,选择合适的接收器类型取决于数据的最终用途和目的地。3.1.1数据接收器的工作流程数据接收器接收来自数据处理流水线的数据,并根据配置将数据写入到指定的存储或流中。在Dataflow中,数据接收器的配置通常在流水线构建时完成,通过设置特定的sink参数来指定数据的输出位置和格式。3.2配置BigQuery接收器BigQuery是GoogleCloud提供的一种全托管、低延迟、高扩展性的数据仓库服务。将数据输出到BigQuery可以用于进一步的数据分析和报告。3.2.1示例代码fromapache_beam.io.gcp.bigqueryimportWriteToBigQuery

#定义BigQuery接收器配置

table_spec='your-project:your_dataset.your_table'

schema='column1:INTEGER,column2:STRING,column3:FLOAT'

#构建流水线

p=beam.Pipeline(options=options)

#将数据写入BigQuery

(p|'ReadData'>>beam.io.ReadFromText('gs://your-bucket/data.txt')

|'ParseData'>>beam.Map(parse_function)

|'WriteToBigQuery'>>WriteToBigQuery(

table_spec,

schema=schema,

write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,

create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED))

#运行流水线

result=p.run()

result.wait_until_finish()3.2.2解释在上述代码中,我们首先导入了WriteToBigQuery模块,然后定义了BigQuery的表规格和数据模式。流水线从GoogleCloudStorage读取数据,通过ParseData步骤解析数据,最后使用WriteToBigQuery将数据写入BigQuery。write_disposition参数设置为WRITE_APPEND表示如果表已存在,则追加数据;create_disposition参数设置为CREATE_IF_NEEDED表示如果表不存在,则创建新表。3.3配置文件接收器文件接收器用于将数据输出到文件系统,如GoogleCloudStorage或本地文件系统。这对于需要将数据保存为文件格式的场景非常有用。3.3.1示例代码fromapache_beam.ioimportWriteToText

#构建流水线

p=beam.Pipeline(options=options)

#将数据写入文件

(p|'ReadData'>>beam.io.ReadFromText('gs://your-bucket/data.txt')

|'ProcessData'>>beam.Map(process_function)

|'WriteToFile'>>WriteToText('gs://your-bucket/output'))

#运行流水线

result=p.run()

result.wait_until_finish()3.3.2解释在这个例子中,我们使用WriteToText接收器将处理后的数据写入到GoogleCloudStorage的文件中。流水线从GoogleCloudStorage读取数据,通过ProcessData步骤处理数据,最后使用WriteToFile将数据写入到指定的文件路径。3.4配置实时数据流接收器实时数据流接收器用于将数据输出到实时数据流,如GoogleCloudPub/Sub。这对于需要实时处理和传输数据的场景非常有用。3.4.1示例代码fromapache_beam.io.gcp.pubsubimportWriteToPubSub

#构建流水线

p=beam.Pipeline(options=options)

#将数据写入实时数据流

(p|'ReadData'>>beam.io.ReadFromKafka('localhost:9092',topics=['your_topic'])

|'ProcessData'>>beam.Map(process_function)

|'WriteToPubSub'>>WriteToPubSub(

topic='projects/your-project/topics/your-topic'))

#运行流水线

result=p.run()

result.wait_until_finish()3.4.2解释在这个例子中,我们使用WriteToPubSub接收器将处理后的数据写入到GoogleCloudPub/Sub的实时数据流中。流水线从Kafka读取数据,通过ProcessData步骤处理数据,最后使用WriteToPubSub将数据写入到指定的Pub/Sub主题。3.5总结通过上述示例,我们可以看到在GoogleDataflow中配置不同类型的接收器是相对直接的。选择正确的接收器类型和配置参数对于确保数据处理流水线的效率和正确性至关重要。在实际应用中,根据数据的特性和需求,合理选择和配置接收器可以极大地提升数据处理的性能和灵活性。4数据处理4.1数据转换与操作在GoogleDataflow中,数据转换与操作是处理数据流的核心部分。Dataflow提供了丰富的转换操作,如Map、Filter、Combine等,这些操作可以对数据进行各种处理,从简单的数据格式转换到复杂的聚合计算。4.1.1Map转换Map转换允许你对数据流中的每个元素应用一个函数,从而转换其内容。例如,如果你有一个字符串列表,你可以使用Map来将每个字符串转换为大写。#导入必要的库

importapache_beamasbeam

#定义一个函数,将字符串转换为大写

defto_uppercase(word):

returnword.upper()

#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个列表开始

lines=p|'Create'>>beam.Create(['hello','world','dataflow'])

#使用Map转换,将每个字符串转换为大写

uppercase_lines=lines|'Map'>>beam.Map(to_uppercase)

#打印结果

uppercase_lines|'Print'>>beam.Map(print)4.1.2Filter转换Filter转换允许你根据一个函数的返回值来选择数据流中的元素。例如,你可以过滤出所有长度大于5的单词。#定义一个函数,检查字符串长度是否大于5

defis_long(word):

returnlen(word)>5

#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个列表开始

lines=p|'Create'>>beam.Create(['hello','world','dataflow','tutorial'])

#使用Filter转换,过滤出长度大于5的单词

long_lines=lines|'Filter'>>beam.Filter(is_long)

#打印结果

long_lines|'Print'>>beam.Map(print)4.1.3Combine转换Combine转换用于聚合数据流中的元素。例如,你可以使用Combine来计算一个数据流中所有元素的总和。#定义一个Combine函数,计算所有元素的总和

classSumCombineFn(beam.CombineFn):

defcreate_accumulator(self):

return0

defadd_input(self,sum,input):

returnsum+input

defmerge_accumulators(self,accumulators):

returnsum(accumulators)

defextract_output(self,sum):

returnsum

#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个数字列表开始

numbers=p|'Create'>>beam.Create([1,2,3,4,5])

#使用Combine转换,计算所有数字的总和

total=numbers|'Combine'>>beam.CombineGlobally(SumCombineFn())

#打印结果

total|'Print'>>beam.Map(print)4.2窗口与触发器在实时数据处理中,窗口和触发器是两个关键概念,用于控制数据的聚合和处理时间。4.2.1窗口窗口将数据流分割成更小的、可管理的片段,以便进行聚合操作。例如,你可以将数据流分割成每5分钟的窗口,然后在每个窗口内计算数据的平均值。#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个数字流开始

numbers=p|'Create'>>beam.Create([1,2,3,4,5])

#使用窗口,将数据流分割成每5分钟的窗口

windowed_numbers=numbers|'Window'>>beam.WindowInto(beam.window.FixedWindows(5))

#在每个窗口内计算平均值

average=windowed_numbers|'Combine'>>beam.CombineGlobally(SumCombineFn())

#打印结果

average|'Print'>>beam.Map(print)4.2.2触发器触发器控制窗口何时输出结果。例如,你可以设置一个触发器,当窗口接收到足够的数据时,立即输出结果,而不是等到窗口结束。#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个数字流开始

numbers=p|'Create'>>beam.Create([1,2,3,4,5])

#使用窗口,将数据流分割成每5分钟的窗口

windowed_numbers=numbers|'Window'>>beam.WindowInto(beam.window.FixedWindows(5))

#设置触发器,当窗口接收到3个元素时,立即输出结果

windowed_numbers=windowed_numbers|'Trigger'>>beam.Map(lambdax:x,beam.transforms.trigger.AfterCount(3))

#在每个窗口内计算平均值

average=windowed_numbers|'Combine'>>beam.CombineGlobally(SumCombineFn())

#打印结果

average|'Print'>>beam.Map(print)4.3状态与水印在处理实时数据流时,状态和水印是两个重要的概念,用于处理数据的延迟和乱序。4.3.1状态状态允许你保存和查询数据流中的信息。例如,你可以保存一个窗口内接收到的元素数量,然后在窗口结束时检查这个数量。#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个数字流开始

numbers=p|'Create'>>beam.Create([1,2,3,4,5])

#使用窗口,将数据流分割成每5分钟的窗口

windowed_numbers=numbers|'Window'>>beam.WindowInto(beam.window.FixedWindows(5))

#使用状态,保存每个窗口内接收到的元素数量

count=windowed_numbers|'Count'>>beam.Map(lambdax:x,biners.Count.Globally())

#打印结果

count|'Print'>>beam.Map(print)4.3.2水印水印是数据流中的时间标记,用于处理数据的延迟和乱序。例如,你可以设置一个水印,当数据流中的所有元素的时间都小于这个水印时,窗口可以关闭并输出结果。#创建一个Pipeline

withbeam.Pipeline()asp:

#从一个带有时间戳的数字流开始

numbers=p|'Create'>>beam.Create([(1,100),(2,200),(3,300),(4,400),(5,500)])

#使用窗口,将数据流分割成每5分钟的窗口

windowed_numbers=numbers|'Window'>>beam.WindowInto(beam.window.FixedWindows(5))

#设置水印,当所有元素的时间都小于这个水印时,窗口可以关闭并输出结果

windowed_numbers=windowed_numbers|'Watermark'>>beam.Map(lambdax:x,beam.transforms.trigger.AfterWatermark(earliest=beam.window.TimestampCombiner()))

#在每个窗口内计算平均值

average=windowed_numbers|'Combine'>>beam.CombineGlobally(SumCombineFn())

#打印结果

average|'Print'>>beam.Map(print)以上就是GoogleDataflow中数据处理的基本原理和操作,包括数据转换、窗口、触发器、状态和水印。通过这些操作,你可以构建出复杂而强大的实时数据处理系统。5优化与监控5.1性能调优策略在GoogleDataflow中,性能调优是确保作业高效运行的关键。以下是一些核心策略:5.1.1选择合适的并行度Dataflow作业的并行度直接影响其处理速度。并行度太低,作业可能无法充分利用所有可用资源;并行度太高,可能会导致资源争用和额外的开销。可以通过设置--num-workers参数来调整并行度。5.1.2数据分区合理的数据分区可以减少数据的shuffle操作,从而提高处理速度。例如,使用GroupByKey操作时,可以预先对数据进行分区,减少不必要的数据移动。5.1.3使用窗口和触发器窗口和触发器可以帮助优化流式处理作业的延迟和资源使用。例如,使用EventTime窗口可以确保数据在到达时立即处理,而不是等待整个窗口结束。5.1.4避免热点热点是指数据集中某些元素被处理的频率远高于其他元素,导致处理不均衡。可以通过对数据进行预处理,如使用Reshuffle操作,来避免热点。5.1.5优化数据读取对于大数据源,如BigQuery或CloudStorage,优化读取策略可以显著提高性能。例如,使用BigQueryIO时,可以设置readSessionTemplate来优化读取。5.2监控与日志记录Dataflow提供了丰富的监控和日志记录工具,帮助用户理解作业的运行状态和性能。5.2.1使用GoogleCloudConsoleGoogleCloudConsole提供了Dataflow作业的实时监控界面,可以查看作业的进度、资源使用情况和错误信息。5.2.2利用StackdriverLoggingStackdriverLogging可以收集和分析Dataflow作业的日志,帮助诊断问题和优化性能。例如,可以设置日志过滤器来查看特定类型的日志。5.2.3设置监控指标Dataflow允许用户定义自定义监控指标,通过MonitoringInfoAPI来收集作业的特定性能数据。5.2.4使用DataflowMonitoringInterfaceDataflowMonitoringInterface提供了作业的详细性能指标,包括每个工作器的CPU和内存使用情况,以及每个阶段的处理速度。5.3故障排除面对Dataflow作业中的故障,以下是一些常见的故障排除步骤:5.3.1检查作业状态首先,通过GoogleCloudConsole或DataflowMonitoringInterface检查作业的状态和错误信息。5.3.2查看日志使用StackdriverLogging查看作业的日志,寻找可能的错误或警告信息。5.3.3分析性能指标分析DataflowMonitoringInterface提供的性能指标,检查是否有资源瓶颈或处理延迟。5.3.4调整并行度如果发现资源争用,尝试调整作业的并行度,以优化资源使用。5.3.5优化数据处理检查数据处理逻辑,优化算法或数据结构,减少不必要的计算或数据移动。5.3.6重新配置数据源如果数据读取速度慢,考虑重新配置数据源的读取策略,如增加读取并行度或优化读取路径。5.3.7寻求社区支持如果上述步骤无法解决问题,可以寻求GoogleCloud社区或StackOverflow等平台的支持,分享你的问题和已尝试的解决方案。5.3.8示例代码:优化并行度#设置并行度

options=PipelineOptions()

options.view_as(StandardOptions).runner='DataflowRunner'

options.view_as(StandardOptions).num_workers=10#根据实际情况调整

#创建Pipeline

p=beam.Pipeline(options=options)

#读取数据

lines=p|'ReadfromPub/Sub'>>beam.io.ReadFromPubSub(topic='projects/your-project/topics/your-topic')

#处理数据

counts=(

lines

|'Split'>>beam.FlatMap(lambdax:x.split(''))

|'PairWithOne'>>beam.Map(lambdax:(x,1))

|'GroupandSum'>>beam.CombinePerKey(sum)

)

#写入结果

counts|'WritetoBigQuery'>>beam.io.WriteToBigQuery(

'your-project:your_dataset.your_table',

schema='word:STRING,count:INTEGER',

write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,

create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED

)

#执行Pipeline

result=p.run()

result.wait_until_finish()在上述代码中,我们通过设置num_workers参数来调整并行度,以优化作业的性能。同时,通过合理使用ReadFromPubSub、WriteToBigQuery等操作,确保数据的高效读写。6实时数据分析示例6.1引言在实时数据分析场景中,GoogleDataflow提供了强大的流处理能力,能够处理来自不同数据源的大量数据,并将结果实时地输出到各种接收器中。本章节将通过一个具体的示例,展示如何使用GoogleDataflow进行实时数据分析,包括数据源的配置、数据处理的逻辑以及接收器的设置。6.2实时数据分析示例:Twitter情感分析6.2.1数据源配置:TwitterStreamGoogleDataflow可以直接从Twitter流中读取数据,这需要配置Twitter的开发者账户并获取相应的API密钥。以下是一个使用ApacheBeamSDKforPython配置Twitter数据源的示例代码:importapache_beamasbeam

fromapache_beam.options.pipeline_optionsimportPipelineOptions

fromapache_beam.ioimportReadFromTwitter

#设置PipelineOptions

options=PipelineOptions()

#定义Pipeline

withbeam.Pipeline(options=options)asp:

#从Twitter流读取数据

tweets=p|'ReadfromTwitter'>>ReadFromTwitter(

consumer_key='YOUR_CONSUMER_KEY',

consumer_secret='YOUR_CONSUMER_SECRET',

access_token='YOUR_ACCESS_TOKEN',

access_token_secret='YOUR_ACCESS_TOKEN_SECRET',

track='python')

#打印前10条推文

tweets|'Printtweets'>>beam.Map(print).with_output_types(beam.pvalue.PDone)6.2.2数据处理:情感分析获取到推文后,可以使用自然语言处理库如TextBlob进行情感分析。以下是一个示例代码,展示了如何使用TextBlob对推文进行情感分析:fromtextblobimportTextBlob

defanalyze_sentiment(tweet):

"""

使用TextBlob分析推文的情感。

"""

blob=TextBlob(tweet)

returnblob.sentiment.polarity

#在Pipeline中添加情感分析步骤

tweets|'AnalyzeSentiment'>>beam.Map(analyze_sentiment)6.2.3接收器配置:BigQuery处理后的数据可以实时地写入BigQuery,以便进行进一步的分析和可视化。以下是一个示例代码,展示了如何配置BigQuery接收器:fromapache_beam.ioimportWriteToBigQuery

#定义BigQuery表的schema

table_schema={

'fields':[

{'name':'tweet','type':'STRING','mode':'REQUIRED'},

{'name':'sentiment','type':'FLOAT','mode':'REQUIRED'}

]

}

#将推文和情感分析结果写入BigQuery

tweets|'WritetoBigQuery'>>WriteToBigQuery(

table='your_project:your_dataset.your_table',

schema=table_schema,

write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,

create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED)6.3数据流处理最佳实践6.3.1窗口化在实时数据流处理中,窗口化是一个关键的概念,它将无限的数据流分割成有限的片段,以便进行聚合操作。例如,可以使用滑动窗口或固定窗口来计算每分钟或每小时的平均情感得分。#使用固定窗口进行情感得分的平均计算

tweets|'Windowintofixedintervals'>>beam.WindowInto(beam.window.FixedWindows

温馨提示

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

评论

0/150

提交评论