數(shù)據(jù)湖:AWS Lake Formation:AWSLakeFormation與AWSGlue集成教程_第1頁
數(shù)據(jù)湖:AWS Lake Formation:AWSLakeFormation與AWSGlue集成教程_第2頁
數(shù)據(jù)湖:AWS Lake Formation:AWSLakeFormation與AWSGlue集成教程_第3頁
數(shù)據(jù)湖:AWS Lake Formation:AWSLakeFormation與AWSGlue集成教程_第4頁
數(shù)據(jù)湖:AWS Lake Formation:AWSLakeFormation與AWSGlue集成教程_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)湖:AWSLakeFormation:AWSLakeFormation與AWSGlue集成教程1數(shù)據(jù)湖簡介1.1數(shù)據(jù)湖的概念數(shù)據(jù)湖是一種存儲大量原始數(shù)據(jù)的架構(gòu),這些數(shù)據(jù)可以是結(jié)構(gòu)化、半結(jié)構(gòu)化或非結(jié)構(gòu)化。數(shù)據(jù)湖允許組織以原始格式存儲數(shù)據(jù),無需預先定義數(shù)據(jù)模型。這為數(shù)據(jù)分析提供了靈活性,因為數(shù)據(jù)可以在需要時進行處理和分析,而不是在收集時。數(shù)據(jù)湖通常使用對象存儲服務,如AWS的S3,來存儲數(shù)據(jù),因為這些服務可以處理大量數(shù)據(jù),并提供高可用性和持久性。1.1.1為什么選擇數(shù)據(jù)湖?靈活性:數(shù)據(jù)湖可以存儲各種類型的數(shù)據(jù),包括日志文件、JSON、CSV、圖像、音頻、視頻等。成本效益:與傳統(tǒng)數(shù)據(jù)倉庫相比,數(shù)據(jù)湖的存儲成本更低,因為它們使用廉價的存儲選項。可擴展性:數(shù)據(jù)湖可以輕松擴展以處理大量數(shù)據(jù)和高數(shù)據(jù)吞吐量。數(shù)據(jù)科學和機器學習:數(shù)據(jù)湖是數(shù)據(jù)科學和機器學習項目的數(shù)據(jù)來源,因為它們可以存儲和處理大量數(shù)據(jù)。1.2數(shù)據(jù)湖在AWS中的實現(xiàn)在AWS中,數(shù)據(jù)湖的實現(xiàn)主要依賴于AmazonS3作為存儲層,以及一系列服務來處理和分析數(shù)據(jù),如AWSGlue、AmazonAthena、AmazonRedshift等。AWSLakeFormation是AWS提供的一項服務,用于簡化構(gòu)建、保護和管理數(shù)據(jù)湖的過程。1.2.1AWSLakeFormationAWSLakeFormation提供了一套工具,用于快速設(shè)置數(shù)據(jù)湖,包括數(shù)據(jù)攝取、數(shù)據(jù)目錄、數(shù)據(jù)權(quán)限管理、數(shù)據(jù)清理和數(shù)據(jù)轉(zhuǎn)換。通過LakeFormation,用戶可以定義數(shù)據(jù)湖的結(jié)構(gòu),設(shè)置數(shù)據(jù)訪問策略,并使用AWSGlue進行數(shù)據(jù)轉(zhuǎn)換和清理。1.2.2AWSGlueAWSGlue是一個完全托管的ETL(Extract,Transform,Load)服務,用于準備數(shù)據(jù)以進行分析。Glue可以自動發(fā)現(xiàn)數(shù)據(jù),創(chuàng)建元數(shù)據(jù)表,并將數(shù)據(jù)轉(zhuǎn)換為所需的格式。Glue還提供了數(shù)據(jù)目錄和ETL作業(yè)的管理,使得數(shù)據(jù)湖中的數(shù)據(jù)可以被輕松地查詢和分析。示例:使用AWSGlue進行數(shù)據(jù)轉(zhuǎn)換假設(shè)我們有一個存儲在S3中的CSV文件,我們想要將其轉(zhuǎn)換為Parquet格式,以便在AmazonAthena中進行更高效的查詢。以下是一個使用AWSGlue進行數(shù)據(jù)轉(zhuǎn)換的Python示例:importboto3

#創(chuàng)建一個AWSGlue客戶端

glue_client=boto3.client('glue')

#定義輸入和輸出位置

input_path='s3://my-data-lake/input-data.csv'

output_path='s3://my-data-lake/output-data.parquet'

#創(chuàng)建一個Glue作業(yè)

job_input={

'Name':'my-glue-job',

'Description':'ConvertCSVtoParquet',

'Role':'arn:aws:iam::123456789012:role/service-role/AWSGlueServiceRole-my-glue-job',

'Command':{

'Name':'glueetl',

'ScriptLocation':'s3://my-data-lake/glue-scripts/convert_csv_to_parquet.py',

'PythonVersion':'3'

},

'DefaultArguments':{

'--input_path':input_path,

'--output_path':output_path

}

}

#執(zhí)行Glue作業(yè)

response=glue_client.create_job(**job_input)

job_run=glue_client.start_job_run(JobName='my-glue-job')在這個例子中,我們首先創(chuàng)建了一個AWSGlue客戶端,然后定義了輸入和輸出S3路徑。接著,我們創(chuàng)建了一個Glue作業(yè),指定了作業(yè)的名稱、描述、角色、命令(包括腳本位置和Python版本)以及默認參數(shù)。最后,我們執(zhí)行了Glue作業(yè),將CSV文件轉(zhuǎn)換為Parquet格式。AWSGlue腳本示例:convert_csv_to_parquet.py#GlueETL腳本

importsys

fromawsglue.transformsimport*

fromawsglue.utilsimportgetResolvedOptions

frompyspark.contextimportSparkContext

fromawsglue.contextimportGlueContext

fromawsglue.jobimportJob

args=getResolvedOptions(sys.argv,['JOB_NAME'])

sc=SparkContext()

glueContext=GlueContext(sc)

spark=glueContext.spark_session

job=Job(glueContext)

job.init(args['JOB_NAME'],args)

#讀取CSV數(shù)據(jù)

datasource0=glueContext.create_dynamic_frame.from_options(

format_options={"quoteChar":'"',"withHeader":True,"separator":","},

connection_type="s3",

format="csv",

connection_options={"paths":[args["input_path"]]},

transformation_ctx="datasource0"

)

#將數(shù)據(jù)轉(zhuǎn)換為Parquet格式

applymapping1=ApplyMapping.apply(

frame=datasource0,

mappings=[

("column1","string","column1","string"),

("column2","string","column2","string"),

("column3","string","column3","string")

],

transformation_ctx="applymapping1"

)

#寫入Parquet數(shù)據(jù)

datasink2=glueContext.write_dynamic_frame.from_options(

frame=applymapping1,

connection_type="s3",

format="parquet",

connection_options={"path":args["output_path"]},

transformation_ctx="datasink2"

)

mit()在這個腳本中,我們首先初始化了Glue作業(yè),并讀取了CSV數(shù)據(jù)。然后,我們使用ApplyMapping轉(zhuǎn)換將數(shù)據(jù)映射到Parquet格式。最后,我們將轉(zhuǎn)換后的數(shù)據(jù)寫入S3中的Parquet文件。1.2.3結(jié)合AWSLakeFormation和AWSGlueAWSLakeFormation和AWSGlue的結(jié)合使用,可以實現(xiàn)數(shù)據(jù)湖的自動化管理和數(shù)據(jù)的高效處理。LakeFormation提供了數(shù)據(jù)湖的結(jié)構(gòu)和權(quán)限管理,而Glue則負責數(shù)據(jù)的轉(zhuǎn)換和清理。通過這種方式,組織可以確保數(shù)據(jù)湖中的數(shù)據(jù)是安全的、可訪問的,并且以適合分析的格式存儲。例如,我們可以使用LakeFormation來定義數(shù)據(jù)湖的結(jié)構(gòu),包括數(shù)據(jù)表和數(shù)據(jù)集。然后,我們可以使用AWSGlue來創(chuàng)建ETL作業(yè),將原始數(shù)據(jù)轉(zhuǎn)換為所需的格式,并將其加載到數(shù)據(jù)湖中。這樣,我們就可以在AmazonAthena或AmazonRedshift中進行高效的數(shù)據(jù)查詢和分析。示例:使用LakeFormation和Glue創(chuàng)建數(shù)據(jù)表以下是一個使用AWSLakeFormation和AWSGlue創(chuàng)建數(shù)據(jù)表的示例:importboto3

#創(chuàng)建一個LakeFormation客戶端

lake_formation_client=boto3.client('lakeformation')

#定義數(shù)據(jù)表的結(jié)構(gòu)

table_input={

'Name':'my-data-table',

'DatabaseName':'my-data-lake',

'TableInput':{

'Name':'my-data-table',

'Description':'Adatatableformydatalake',

'StorageDescriptor':{

'Columns':[

{'Name':'column1','Type':'string'},

{'Name':'column2','Type':'string'},

{'Name':'column3','Type':'string'}

],

'Location':'s3://my-data-lake/data-tables/my-data-table',

'InputFormat':'org.apache.hadoop.mapred.TextInputFormat',

'OutputFormat':'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat',

'Compressed':False,

'NumberOfBuckets':-1,

'SerdeInfo':{

'SerializationLibrary':'org.openx.data.jsonserde.JsonSerDe',

'Parameters':{}

},

'BucketColumns':[],

'SortColumns':[],

'Parameters':{},

'SkewedInfo':{

'SkewedColumnNames':[],

'SkewedColumnValueLocationMaps':{},

'SkewedColumnValues':[]

},

'StoredAsSubDirectories':False

},

'PartitionKeys':[],

'TableType':'EXTERNAL_TABLE',

'Parameters':{},

'LastAccessTime':0,

'Retention':0,

'StorageCapacity':0,

'TableStatus':'OK'

}

}

#使用LakeFormation創(chuàng)建數(shù)據(jù)表

response=lake_formation_client.create_table(**table_input)

#使用AWSGlue將數(shù)據(jù)加載到數(shù)據(jù)表中

glue_client=boto3.client('glue')

job_input={

'Name':'my-glue-job',

'Description':'Loaddataintomydatatable',

'Role':'arn:aws:iam::123456789012:role/service-role/AWSGlueServiceRole-my-glue-job',

'Command':{

'Name':'glueetl',

'ScriptLocation':'s3://my-data-lake/glue-scripts/load_data_into_table.py',

'PythonVersion':'3'

},

'DefaultArguments':{

'--database_name':'my-data-lake',

'--table_name':'my-data-table',

'--input_path':'s3://my-data-lake/input-data.csv'

}

}

#執(zhí)行Glue作業(yè)

response=glue_client.create_job(**job_input)

job_run=glue_client.start_job_run(JobName='my-glue-job')在這個例子中,我們首先使用LakeFormation創(chuàng)建了一個數(shù)據(jù)表,定義了數(shù)據(jù)表的結(jié)構(gòu)和存儲位置。然后,我們使用AWSGlue創(chuàng)建了一個作業(yè),將CSV數(shù)據(jù)加載到數(shù)據(jù)表中。通過這種方式,我們可以確保數(shù)據(jù)湖中的數(shù)據(jù)是結(jié)構(gòu)化的,并且可以被高效地查詢和分析。AWSGlue腳本示例:load_data_into_table.py#GlueETL腳本

importsys

fromawsglue.transformsimport*

fromawsglue.utilsimportgetResolvedOptions

frompyspark.contextimportSparkContext

fromawsglue.contextimportGlueContext

fromawsglue.jobimportJob

fromawsglue.dynamicframeimportDynamicFrame

args=getResolvedOptions(sys.argv,['JOB_NAME','DATABASE_NAME','TABLE_NAME','INPUT_PATH'])

sc=SparkContext()

glueContext=GlueContext(sc)

spark=glueContext.spark_session

job=Job(glueContext)

job.init(args['JOB_NAME'],args)

#讀取CSV數(shù)據(jù)

datasource0=glueContext.create_dynamic_frame.from_options(

format_options={"quoteChar":'"',"withHeader":True,"separator":","},

connection_type="s3",

format="csv",

connection_options={"paths":[args["INPUT_PATH"]]},

transformation_ctx="datasource0"

)

#將數(shù)據(jù)加載到數(shù)據(jù)表中

datasink2=glueContext.write_dynamic_frame.from_jdbc_conf(

frame=datasource0,

catalog_connection="my-data-lake-connection",

catalog_table=args["TABLE_NAME"],

database=args["DATABASE_NAME"],

redshift_tmp_dir=args["TempDir"],

transformation_ctx="datasink2"

)

mit()在這個腳本中,我們首先初始化了Glue作業(yè),并讀取了CSV數(shù)據(jù)。然后,我們使用write_dynamic_frame.from_jdbc_conf方法將數(shù)據(jù)加載到數(shù)據(jù)湖中的數(shù)據(jù)表中。這樣,我們就可以在數(shù)據(jù)湖中進行高效的數(shù)據(jù)查詢和分析。通過結(jié)合使用AWSLakeFormation和AWSGlue,組織可以構(gòu)建一個安全、可擴展和高效的數(shù)據(jù)湖,用于存儲和分析大量數(shù)據(jù)。這不僅可以提高數(shù)據(jù)處理的效率,還可以確保數(shù)據(jù)的安全性和合規(guī)性。2數(shù)據(jù)湖:AWSLakeFormation概述2.1LakeFormation的功能AWSLakeFormation是一項服務,旨在幫助用戶快速設(shè)置、清理、保護和管理數(shù)據(jù)湖。數(shù)據(jù)湖是一種存儲大量原始數(shù)據(jù)的環(huán)境,這些數(shù)據(jù)可以來自各種數(shù)據(jù)源,如日志、傳感器數(shù)據(jù)、圖像、音頻、視頻等。LakeFormation提供了一系列工具和功能,以簡化數(shù)據(jù)湖的構(gòu)建和管理過程。數(shù)據(jù)攝?。篖akeFormation支持從各種數(shù)據(jù)源自動攝取數(shù)據(jù),包括AmazonS3、AmazonRDS、AmazonDynamoDB和AmazonRedshift。數(shù)據(jù)清理:服務提供了數(shù)據(jù)清理工具,可以自動轉(zhuǎn)換和準備數(shù)據(jù),以便于分析。數(shù)據(jù)訪問控制:通過精細的訪問控制策略,LakeFormation確保只有授權(quán)用戶和應用程序可以訪問數(shù)據(jù)湖中的數(shù)據(jù)。數(shù)據(jù)質(zhì)量:LakeFormation可以監(jiān)控數(shù)據(jù)湖中的數(shù)據(jù)質(zhì)量,確保數(shù)據(jù)的準確性和一致性。數(shù)據(jù)治理:服務提供了數(shù)據(jù)治理功能,包括數(shù)據(jù)分類、標簽和審計,以幫助用戶更好地理解和管理數(shù)據(jù)湖中的數(shù)據(jù)。2.2LakeFormation的架構(gòu)AWSLakeFormation的架構(gòu)設(shè)計圍繞著幾個核心組件:數(shù)據(jù)目錄:數(shù)據(jù)目錄是LakeFormation的核心組件,它存儲了數(shù)據(jù)湖中所有數(shù)據(jù)的元數(shù)據(jù)信息。元數(shù)據(jù)包括數(shù)據(jù)的結(jié)構(gòu)、位置、權(quán)限和分類等。數(shù)據(jù)存儲:數(shù)據(jù)湖中的數(shù)據(jù)通常存儲在AmazonS3中,LakeFormation提供了工具來管理這些數(shù)據(jù)的存儲和訪問。數(shù)據(jù)轉(zhuǎn)換:LakeFormation使用AWSGlue來轉(zhuǎn)換和準備數(shù)據(jù),AWSGlue是一項完全托管的服務,用于構(gòu)建數(shù)據(jù)目錄和轉(zhuǎn)換數(shù)據(jù)。數(shù)據(jù)訪問控制:通過AWSIdentityandAccessManagement(IAM)和LakeFormation的精細訪問控制功能,可以設(shè)置和管理數(shù)據(jù)湖中的數(shù)據(jù)訪問權(quán)限。數(shù)據(jù)治理:LakeFormation提供了數(shù)據(jù)治理功能,包括數(shù)據(jù)分類、標簽和審計,以幫助用戶更好地理解和管理數(shù)據(jù)湖中的數(shù)據(jù)。2.2.1示例:使用AWSLakeFormation和AWSGlue創(chuàng)建數(shù)據(jù)湖#導入必要的庫

importboto3

#創(chuàng)建LakeFormation客戶端

lake_formation=boto3.client('lakeformation')

#創(chuàng)建Glue客戶端

glue=boto3.client('glue')

#定義數(shù)據(jù)目錄

data_catalog='my_data_catalog'

#創(chuàng)建數(shù)據(jù)目錄

response=glue.create_catalog(

Name=data_catalog,

Description='MydatacatalogforLakeFormation'

)

#輸出響應

print(response)

#授予LakeFormation對數(shù)據(jù)目錄的權(quán)限

response=lake_formation.grant_permissions(

Principal={

'DataLakePrincipalIdentifier':'my_principal'

},

Resource={

'Catalog':{}

},

Permissions=['ALL']

)

#輸出響應

print(response)

#創(chuàng)建數(shù)據(jù)表

response=glue.create_table(

DatabaseName=data_catalog,

TableInput={

'Name':'my_table',

'StorageDescriptor':{

'Columns':[

{'Name':'id','Type':'int'},

{'Name':'name','Type':'string'},

{'Name':'age','Type':'int'}

],

'Location':'s3://my-bucket/my-table/',

'InputFormat':'org.apache.hadoop.mapred.TextInputFormat',

'OutputFormat':'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat',

'Compressed':False,

'NumberOfBuckets':-1,

'SerdeInfo':{

'SerializationLibrary':'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe',

'Parameters':{

'field.delim':','

}

},

'BucketColumns':[],

'SortColumns':[],

'Parameters':{},

'SkewedInfo':{

'SkewedColumnNames':[],

'SkewedColumnValueLocationMaps':{},

'SkewedColumnValues':[]

},

'StoredAsSubDirectories':False

},

'PartitionKeys':[],

'TableType':'EXTERNAL_TABLE',

'Parameters':{},

'TargetTable':{}

}

)

#輸出響應

print(response)2.2.2解釋在上述示例中,我們首先創(chuàng)建了一個數(shù)據(jù)目錄,然后授予LakeFormation對該目錄的權(quán)限。接著,我們創(chuàng)建了一個數(shù)據(jù)表,定義了表的結(jié)構(gòu)和存儲位置。這些步驟是構(gòu)建數(shù)據(jù)湖的基礎(chǔ),通過LakeFormation和AWSGlue的集成,可以自動化數(shù)據(jù)的攝取、轉(zhuǎn)換和存儲過程,從而簡化數(shù)據(jù)湖的構(gòu)建和管理。2.2.3數(shù)據(jù)樣例假設(shè)我們有以下CSV數(shù)據(jù)文件,存儲在AmazonS3中:id,name,age

1,John,30

2,Alice,25

3,Bob,35我們可以使用AWSGlue的ETL作業(yè)來轉(zhuǎn)換這些數(shù)據(jù),例如,將CSV格式轉(zhuǎn)換為Parquet格式,以提高查詢性能。然后,我們可以使用LakeFormation來管理這些數(shù)據(jù)的訪問控制和治理。通過AWSLakeFormation和AWSGlue的集成,我們可以構(gòu)建一個安全、高效且易于管理的數(shù)據(jù)湖,為數(shù)據(jù)分析和機器學習提供強大的數(shù)據(jù)支持。3數(shù)據(jù)湖:AWSLakeFormation:AWSLakeFormation與AWSGlue集成3.1AWSGlue介紹3.1.1Glue的數(shù)據(jù)目錄服務AWSGlue數(shù)據(jù)目錄服務是AWS提供的一種用于存儲和管理數(shù)據(jù)元數(shù)據(jù)的服務。它作為數(shù)據(jù)湖的中心元數(shù)據(jù)存儲,幫助用戶理解數(shù)據(jù)湖中存儲的數(shù)據(jù)集的結(jié)構(gòu)和內(nèi)容。數(shù)據(jù)目錄可以自動發(fā)現(xiàn)數(shù)據(jù)并生成元數(shù)據(jù),將這些元數(shù)據(jù)存儲在中心化的元數(shù)據(jù)存儲中,便于數(shù)據(jù)的查詢和使用。示例:使用AWSGlue數(shù)據(jù)目錄#導入boto3庫,這是AWSSDKforPython

importboto3

#創(chuàng)建一個AWSGlue客戶端

glue_client=boto3.client('glue',region_name='us-west-2')

#定義數(shù)據(jù)庫名稱

database_name='my_database'

#創(chuàng)建數(shù)據(jù)庫

response=glue_client.create_database(

DatabaseInput={

'Name':database_name,

'Description':'Thisismydatabaseforstoringdatasets.',

'LocationUri':'s3://my-bucket/data/'

}

)

#輸出響應

print(response)在上述代碼中,我們首先導入了boto3庫,這是AWSSDKforPython的一部分,用于與AWS服務進行交互。然后,我們創(chuàng)建了一個AWSGlue客戶端,并指定了要操作的區(qū)域。接下來,我們定義了一個數(shù)據(jù)庫名稱,并使用create_database方法創(chuàng)建了一個新的數(shù)據(jù)庫。我們還提供了數(shù)據(jù)庫的描述和位置URI,這通常是一個S3存儲桶的路徑,用于存儲與數(shù)據(jù)庫相關(guān)的數(shù)據(jù)。3.1.2Glue的ETL作業(yè)AWSGlueETL作業(yè)是一種用于執(zhí)行數(shù)據(jù)提取、轉(zhuǎn)換和加載(ETL)任務的服務。它允許用戶使用Python腳本或Glue的圖形界面來定義數(shù)據(jù)轉(zhuǎn)換邏輯,然后在AWS上運行這些作業(yè),以處理和轉(zhuǎn)換數(shù)據(jù),使其適合分析或進一步處理。示例:創(chuàng)建和運行一個AWSGlueETL作業(yè)#導入boto3庫

importboto3

#創(chuàng)建一個AWSGlue客戶端

glue_client=boto3.client('glue',region_name='us-west-2')

#定義作業(yè)參數(shù)

job_name='my_etl_job'

role='arn:aws:iam::123456789012:role/service-role/AWSGlueServiceRole-my_etl_job'

command={

'Name':'glueetl',

'ScriptLocation':'s3://my-bucket/scripts/etl_script.py'

}

default_arguments={

'--job-bookmark-option':'job-bookmark-enable',

'--enable-metrics':'true'

}

#創(chuàng)建作業(yè)

response=glue_client.create_job(

Name=job_name,

Role=role,

Command=command,

DefaultArguments=default_arguments,

GlueVersion='3.0',

ExecutionProperty={

'MaxConcurrentRuns':5

},

Description='ThisismyETLjobforprocessingdata.'

)

#輸出響應

print(response)

#運行作業(yè)

response=glue_client.start_job_run(

JobName=job_name

)

#輸出響應

print(response)在本例中,我們首先創(chuàng)建了一個AWSGlue客戶端。然后,我們定義了作業(yè)的參數(shù),包括作業(yè)名稱、IAM角色、命令(包括腳本位置)和默認參數(shù)。我們使用create_job方法創(chuàng)建了一個新的ETL作業(yè),并指定了Glue版本和最大并發(fā)運行數(shù)。最后,我們使用start_job_run方法啟動了作業(yè)。ETL作業(yè)腳本示例#導入AWSGlue模塊

fromawsglue.transformsimport*

fromawsglue.utilsimportgetResolvedOptions

frompyspark.contextimportSparkContext

fromawsglue.contextimportGlueContext

fromawsglue.jobimportJob

#初始化SparkContext和GlueContext

sc=SparkContext()

glueContext=GlueContext(sc)

spark=glueContext.spark_session

#獲取作業(yè)參數(shù)

args=getResolvedOptions(sys.argv,['JOB_NAME'])

#創(chuàng)建作業(yè)對象

job=Job(glueContext)

job.init(args['JOB_NAME'],args)

#讀取數(shù)據(jù)

datasource0=glueContext.create_dynamic_frame.from_options(

format_options={"quoteChar":'"',"withHeader":True,"separator":","},

connection_type="s3",

format="csv",

connection_options={"paths":["s3://my-bucket/input/"],"recurse":True},

transformation_ctx="datasource0"

)

#轉(zhuǎn)換數(shù)據(jù)

applymapping1=ApplyMapping.apply(

frame=datasource0,

mappings=[

("id","string","id","string"),

("name","string","name","string"),

("age","int","age","int")

],

transformation_ctx="applymapping1"

)

#寫入數(shù)據(jù)

datasink2=glueContext.write_dynamic_frame.from_options(

frame=applymapping1,

connection_type="s3",

format="parquet",

connection_options={"path":"s3://my-bucket/output/"},

transformation_ctx="datasink2"

)

#完成作業(yè)

mit()在這個ETL作業(yè)腳本中,我們首先導入了必要的AWSGlue模塊。然后,我們初始化了SparkContext和GlueContext,并創(chuàng)建了一個作業(yè)對象。我們從S3讀取了CSV格式的數(shù)據(jù),并使用ApplyMapping轉(zhuǎn)換將數(shù)據(jù)映射到新的模式。最后,我們將轉(zhuǎn)換后的數(shù)據(jù)寫入S3,格式為Parquet,這是一種高效的列式存儲格式,非常適合大數(shù)據(jù)分析。通過這些示例,我們可以看到AWSGlue如何簡化數(shù)據(jù)目錄管理和ETL作業(yè)的創(chuàng)建和運行,從而加速數(shù)據(jù)湖的構(gòu)建和數(shù)據(jù)的處理。4數(shù)據(jù)湖:AWSLakeFormation與AWSGlue集成4.1LakeFormation與Glue的集成4.1.1集成的好處在AWS的數(shù)據(jù)湖構(gòu)建中,AWSLakeFormation和AWSGlue的集成提供了以下顯著優(yōu)勢:簡化數(shù)據(jù)湖管理:LakeFormation提供了一套服務,用于構(gòu)建、保護和管理數(shù)據(jù)湖,而Glue則負責數(shù)據(jù)目錄和ETL作業(yè)。集成后,可以更輕松地發(fā)現(xiàn)、準備和訪問數(shù)據(jù)湖中的數(shù)據(jù)。增強數(shù)據(jù)治理:LakeFormation增強了數(shù)據(jù)治理能力,包括數(shù)據(jù)分類、權(quán)限管理和審計。通過與Glue的集成,可以自動發(fā)現(xiàn)和分類數(shù)據(jù),簡化了數(shù)據(jù)治理流程。加速數(shù)據(jù)準備:Glue的ETL功能可以加速數(shù)據(jù)準備過程,而LakeFormation則確保數(shù)據(jù)的安全性和合規(guī)性。這種集成使得數(shù)據(jù)科學家和分析師能夠更快地訪問準備好的數(shù)據(jù),進行分析和洞察。提升數(shù)據(jù)質(zhì)量:通過Glue的數(shù)據(jù)轉(zhuǎn)換作業(yè),可以清洗和轉(zhuǎn)換數(shù)據(jù),提高數(shù)據(jù)質(zhì)量。LakeFormation則通過其數(shù)據(jù)分類和權(quán)限管理功能,確保只有經(jīng)過驗證的數(shù)據(jù)才能進入數(shù)據(jù)湖。4.1.2集成的步驟集成AWSLakeFormation與AWSGlue涉及以下關(guān)鍵步驟:創(chuàng)建LakeFormation數(shù)據(jù)湖:首先,需要在AWSLakeFormation中創(chuàng)建數(shù)據(jù)湖。這包括設(shè)置數(shù)據(jù)湖位置,定義數(shù)據(jù)分類規(guī)則,以及設(shè)置數(shù)據(jù)訪問權(quán)限。使用Glue發(fā)現(xiàn)數(shù)據(jù):接下來,使用AWSGlue的Crawler功能來發(fā)現(xiàn)數(shù)據(jù)湖中的數(shù)據(jù)。Crawler會掃描數(shù)據(jù)湖位置,自動創(chuàng)建或更新數(shù)據(jù)目錄中的表定義。數(shù)據(jù)分類與權(quán)限設(shè)置:在Glue創(chuàng)建或更新表定義后,LakeFormation可以自動或手動分類數(shù)據(jù),并設(shè)置相應的權(quán)限。例如,可以設(shè)置特定用戶或角色只能訪問特定的數(shù)據(jù)表。數(shù)據(jù)清洗與轉(zhuǎn)換:使用AWSGlue的ETL功能來清洗和轉(zhuǎn)換數(shù)據(jù)。這可以通過定義GlueETL作業(yè)來實現(xiàn),作業(yè)可以使用ApacheSpark或Python等編程語言編寫。數(shù)據(jù)訪問與審計:最后,通過LakeFormation的數(shù)據(jù)訪問控制和審計功能,確保數(shù)據(jù)的安全性和合規(guī)性。數(shù)據(jù)科學家和分析師可以通過SQL查詢或使用AWSSDK訪問數(shù)據(jù)湖中的數(shù)據(jù)。示例:使用AWSGlueCrawler發(fā)現(xiàn)數(shù)據(jù)#導入必要的庫

importboto3

#創(chuàng)建Glue客戶端

glue=boto3.client('glue',region_name='us-west-2')

#定義Crawler

response=glue.create_crawler(

Name='my-lake-formation-crawler',

Role='service-role/AWSGlueServiceRole-my-lake-formation',

DatabaseName='my-lake-formation-db',

Targets={

'S3Targets':[

{

'Path':'s3://my-lake-formation-bucket/data/'

},

],

},

SchemaChangePolicy={

'UpdateBehavior':'UPDATE_IN_DATABASE',

'DeleteBehavior':'LOG'

}

)

#啟動Crawler

response=glue.start_crawler(Name='my-lake-formation-crawler')在上述代碼中,我們首先創(chuàng)建了一個Glue客戶端,然后定義了一個Crawler,指定其名稱、角色、數(shù)據(jù)庫名稱和S3數(shù)據(jù)目標。通過start_crawler方法啟動Crawler,它將掃描指定的S3路徑,并在Glue數(shù)據(jù)目錄中創(chuàng)建或更新表定義。示例:使用AWSGlueETL作業(yè)清洗數(shù)據(jù)#定義GlueETL作業(yè)

response=glue.create_job(

Name='my-lake-formation-etl-job',

Role='service-role/AWSGlueServiceRole-my-lake-formation',

Command={

'Name':'glueetl',

'ScriptLocation':'s3://my-lake-formation-bucket/etl-scripts/my-etl-script.py',

'PythonVersion':'3'

},

DefaultArguments={

'--additional-python-modules':'pandas,pyarrow'

},

GlueVersion='3.0',

NumberOfWorkers=2,

WorkerType='Standard'

)

#啟動ETL作業(yè)

response=glue.start_job_run(JobName='my-lake-formation-etl-job')在本例中,我們創(chuàng)建了一個GlueETL作業(yè),指定了作業(yè)名稱、角色、命令(包括腳本位置和Python版本)、默認參數(shù)(如額外的Python模塊),以及作業(yè)的Glue版本、工作器數(shù)量和類型。通過start_job_run方法啟動作業(yè),它將執(zhí)行位于S3上的ETL腳本,清洗和轉(zhuǎn)換數(shù)據(jù)。示例:使用LakeFormation設(shè)置數(shù)據(jù)訪問權(quán)限#創(chuàng)建LakeFormation客戶端

lake_formation=boto3.client('lakeformation',region_name='us-west-2')

#設(shè)置數(shù)據(jù)訪問權(quán)限

response=lake_formation.grant_permissions(

Principal={

'DataLakePrincipalIdentifier':'arn:aws:iam::123456789012:user/my-data-scientist'

},

Resource={

'Table':{

'CatalogId':'123456789012',

'DatabaseName':'my-lake-formation-db',

'Name':'my-lake-formation-table'

}

},

Permissions=['SELECT','ALTER','DROP']

)在本例中,我們首先創(chuàng)建了一個LakeFormation客戶端,然后使用grant_permissions方法設(shè)置數(shù)據(jù)訪問權(quán)限。我們指定了權(quán)限的接收者(Principal)、資源(Resource,這里是特定的數(shù)據(jù)庫和表),以及要授予的權(quán)限(如SELECT、ALTER和DROP)。這確保了只有授權(quán)的用戶或角色才能訪問和修改數(shù)據(jù)湖中的數(shù)據(jù)。通過這些步驟,AWSLakeFormation與AWSGlue的集成可以顯著提高數(shù)據(jù)湖的構(gòu)建效率,同時確保數(shù)據(jù)的安全性和合規(guī)性。5數(shù)據(jù)湖:AWSLakeFormation與AWSGlue集成5.1創(chuàng)建和管理數(shù)據(jù)目錄5.1.1使用LakeFormation創(chuàng)建數(shù)據(jù)目錄在AWS中,數(shù)據(jù)目錄是存儲元數(shù)據(jù)的地方,這些元數(shù)據(jù)描述了數(shù)據(jù)湖中的數(shù)據(jù)結(jié)構(gòu)和位置。LakeFormation簡化了這一過程,允許你通過幾個簡單的步驟來創(chuàng)建和管理數(shù)據(jù)目錄。步驟1:啟用LakeFormation服務#在AWSManagementConsole中,導航至LakeFormation服務頁面。

#點擊“開始使用”以啟用服務。步驟2:創(chuàng)建數(shù)據(jù)目錄#使用Boto3庫創(chuàng)建數(shù)據(jù)目錄

importboto3

#創(chuàng)建LakeFormation客戶端

lf_client=boto3.client('lakeformation')

#定義數(shù)據(jù)目錄的參數(shù)

data_catalog_input={

'Name':'my_data_catalog',

'Type':'GLUE',

'Description':'MydatacatalogforLakeFormation',

'Parameters':{

'catalog-id':'123456789012'#你的AWS賬戶ID

}

}

#調(diào)用API創(chuàng)建數(shù)據(jù)目錄

response=lf_client.create_data_catalog(DataCatalog=data_catalog_input)

print(response)步驟3:配置數(shù)據(jù)目錄在創(chuàng)建數(shù)據(jù)目錄后,你可能需要配置一些權(quán)限和設(shè)置,以確保數(shù)據(jù)的安全和合規(guī)性。#配置數(shù)據(jù)目錄的權(quán)限

response=lf_client.put_data_catalog_encryption_settings(

DataCatalogEncryptionSettings={

'EncryptionType':'SSE-KMS',

'SseAwsKmsKeyId':'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

}

)

print(response)5.1.2使用Glue爬蟲更新數(shù)據(jù)目錄AWSGlue爬蟲用于自動發(fā)現(xiàn)數(shù)據(jù)并記錄其元數(shù)據(jù),以便在數(shù)據(jù)目錄中使用。這一步驟對于數(shù)據(jù)湖的自動化管理和數(shù)據(jù)的快速訪問至關(guān)重要。步驟1:創(chuàng)建Glue爬蟲#使用Boto3創(chuàng)建Glue爬蟲

glue_client=boto3.client('glue')

#定義爬蟲的參數(shù)

crawler_input={

'Name':'my_glue_crawler',

'Role':'service-role/AWSGlueServiceRole-myservice',

'DatabaseName':'my_database',

'Targets':{

'S3Targets':[

{

'Path':'s3://my-bucket/path/to/data',

'Exclusions':[

's3://my-bucket/path/to/data/excluded/*'

]

}

]

},

'Schedule':'cron(012**?*)',#每天中午12點運行

'SchemaChangePolicy':{

'UpdateBehavior':'UPDATE_IN_DATABASE',

'DeleteBehavior':'LOG'

}

}

#創(chuàng)建爬蟲

response=glue_client.create_crawler(CrawlerInput=crawler_input)

print(response)步驟2:運行Glue爬蟲創(chuàng)建爬蟲后,你需要運行它以開始發(fā)現(xiàn)和記錄數(shù)據(jù)元數(shù)據(jù)。#運行Glue爬蟲

response=glue_client.start_crawler(Name='my_glue_crawler')

print(response)步驟3:監(jiān)控爬蟲狀態(tài)爬蟲運行后,你可以監(jiān)控其狀態(tài),確保數(shù)據(jù)目錄的更新按預期進行。#監(jiān)控爬蟲狀態(tài)

defcheck_crawler_status(crawler_name):

response=glue_client.get_crawler(Name=crawler_name)

state=response['Crawler']['State']

print(f"Crawler{crawler_name}iscurrently{state}")

ifstate=='RUNNING':

print("Crawlerisstillrunning.Checkingagainin60seconds.")

time.sleep(60)

check_crawler_status(crawler_name)

elifstate=='FAILED':

print("Crawlerfailed.Checklogsformoreinformation.")

elifstate=='STOPPED':

print("Crawlerstoppedsuccessfully.")

check_crawler_status('my_glue_crawler')5.2結(jié)合使用LakeFormation和GlueLakeFormation和AWSGlue的結(jié)合使用,可以實現(xiàn)數(shù)據(jù)湖的自動化管理和安全控制。通過Glue爬蟲發(fā)現(xiàn)數(shù)據(jù),LakeFormation可以自動應用數(shù)據(jù)分類、權(quán)限管理和加密策略,確保數(shù)據(jù)的安全和合規(guī)性。5.2.1示例:使用LakeFormation和Glue創(chuàng)建和管理數(shù)據(jù)目錄#創(chuàng)建數(shù)據(jù)目錄

data_catalog_input={

'Name':'my_data_catalog',

'Type':'GLUE',

'Description':'MydatacatalogforLakeFormation',

'Parameters':{

'catalog-id':'123456789012'

}

}

response=lf_client.create_data_catalog(DataCatalog=data_catalog_input)

print(response)

#創(chuàng)建Glue爬蟲

crawler_input={

'Name':'my_glue_crawler',

'Role':'service-role/AWSGlueServiceRole-myservice',

'DatabaseName':'my_database',

'Targets':{

'S3Targets':[

{

'Path':'s3://my-bucket/path/to/data',

'Exclusions':[

's3://my-bucket/path/to/data/excluded/*'

]

}

]

},

'Schedule':'cron(012**?*)',

'SchemaChangePolicy':{

'UpdateBehavior':'UPDATE_IN_DATABASE',

'DeleteBehavior':'LOG'

}

}

response=glue_client.create_crawler(CrawlerInput=crawler_input)

print(response)

#運行爬蟲并監(jiān)控狀態(tài)

response=glue_client.start_crawler(Name='my_glue_crawler')

print(response)

defcheck_crawler_status(crawler_name):

response=glue_client.get_crawler(Name=crawler_name)

state=response['Crawler']['State']

print(f"Crawler{crawler_name}iscurrently{state}")

ifstate=='RUNNING':

print("Crawlerisstillrunning.Checkingagainin60seconds.")

time.sleep(60)

check_crawler_status(crawler_name)

elifstate=='FAILED':

print("Crawlerfailed.Checklogsformoreinformation.")

elifstate=='STOPPED':

print("Crawlerstoppedsuccessfully.")

check_crawler_status('my_glue_crawler')通過上述步驟,你可以有效地創(chuàng)建和管理數(shù)據(jù)目錄,同時利用AWSLakeFormation和AWSGlue的強大功能,確保數(shù)據(jù)湖的高效、安全和合規(guī)運行。6數(shù)據(jù)湖的訪問控制6.1設(shè)置LakeFormation的訪問控制策略在AWSLakeFormation中,訪問控制是通過設(shè)置精細的權(quán)限策略來實現(xiàn)的。LakeFormation允許你定義誰可以訪問數(shù)據(jù)湖中的哪些數(shù)據(jù),以及他們可以執(zhí)行哪些操作。這包括讀取、寫入、修改元數(shù)據(jù)等權(quán)限。通過LakeFormation,你可以創(chuàng)建和管理數(shù)據(jù)湖中的數(shù)據(jù)訪問控制策略,確保數(shù)據(jù)的安全性和合規(guī)性。6.1.1創(chuàng)建數(shù)據(jù)訪問控制策略要創(chuàng)建數(shù)據(jù)訪問控制策略,首先需要在LakeFormation中注冊你的數(shù)據(jù)存儲位置,如AmazonS3桶。然后,你可以使用LakeFormation的權(quán)限管理功能來授予或撤銷對數(shù)據(jù)的訪問權(quán)限。例如,你可以授予一個用戶或一組用戶對特定S3桶或表的讀取權(quán)限。示例:使用AWSCLI授予數(shù)據(jù)訪問權(quán)限#使用AWSCLI授予用戶對數(shù)據(jù)湖中的表的讀取權(quán)限

awslakeformationgrant-permissions\

--principalPrincipal={DataLakePrincipalIdentifier:"arn:aws:iam::123456789012:user/ExampleUser"}\

--resourceResource={Table:{CatalogId:"123456789012",DatabaseName:"exampledb",Name:"exampletable"}}\

--permissionsSELECT在上述示例中,我們使用AWSCLI的grant-permissions命令來授予用戶ExampleUser對exampledb數(shù)據(jù)庫中exampletable表的讀取權(quán)限。6.2使用IAM角色和策略控制Glue訪問AWSGlue是一個用于構(gòu)建和管理數(shù)據(jù)目錄的服務,它與LakeFormation緊密集成,用于處理數(shù)據(jù)湖中的數(shù)據(jù)。通過IAM(IdentityandAccessManagement)角色和策略,你可以控制Glue對數(shù)據(jù)湖中數(shù)據(jù)的訪問。6.2.1創(chuàng)建IAM角色在AWS管理控制臺中,你可以創(chuàng)建一個IAM角色,該角色具有執(zhí)行特定AWSGlue操作的權(quán)限。例如,你可以創(chuàng)建一個角色,允許Glue爬蟲訪問你的S3桶以構(gòu)建數(shù)據(jù)目錄。示例:創(chuàng)建允許Glue訪問S3的IAM角色{

"Version":"2012-10-17",

"Statement":[

{

"Effect":"Allow",

"Action":[

"glue:Get*",

"glue:Create*",

"glue:Update*",

"glue:Delete*",

"glue:BatchCreate*",

"glue:BatchDelete*",

"glue:BatchUpdate*"

],

"Resource":"*"

},

{

"Effect":"Allow",

"Action":[

"s3:GetObject",

"s3:PutObject",

"s3:ListBucket"

],

"Resource":[

"arn:aws:s3:::your-s3-bucket/*",

"arn:aws:s3:::your-s3-bucket"

]

}

]

}在上面的JSON策略中,我們定義了一個IAM角色,它允許執(zhí)行所有Glue操作,并且允許對S3桶your-s3-bucket進行讀取、寫入和列出操作。6.2.2附加IAM策略到Glue爬蟲創(chuàng)建了IAM角色后,你需要將其附加到AWSGlue爬蟲上,以便爬蟲可以使用該角色的權(quán)限訪問數(shù)據(jù)湖中的數(shù)據(jù)。示例:使用AWSCLI將IAM角色附加到Glue爬蟲#使用AWSCLI將IAM角色附加到Glue爬蟲

awsglueupdate-crawler\

--nameExampleCrawler\

--roleRoleArn=arn:aws:iam::123456789012:role/ExampleGlueRole在上述示例中,我們使用update-crawler命令將IAM角色ExampleGlueRole附加到名為ExampleCrawler的Glue爬蟲上。6.2.3使用IAM策略控制GlueETL作業(yè)除了爬蟲,你還可以使用IAM策略來控制GlueETL(Extract,Transform,Load)作業(yè)對數(shù)據(jù)湖中數(shù)據(jù)的訪問。例如,你可以創(chuàng)建一個策略,允許ETL作業(yè)讀取一個S3桶中的數(shù)據(jù),但不允許寫入。示例:創(chuàng)建允許GlueETL作業(yè)讀取S3數(shù)據(jù)的IAM策略{

"Version":"2012-10-17",

"Statement":[

{

"Effect":"Allow",

"Action":[

"glue:StartJobRun",

"glue:GetJob"

],

"Resource":[

"arn:aws:glue:us-west-2:123456789012:job/ExampleJob"

]

},

{

"Effect":"Allow",

"Action":[

"s3:GetObject"

],

"Resource":[

"arn:aws:s3:::your-s3-bucket/*"

]

}

]

}在上面的JSON策略中,我們定義了一個IAM策略,它允許執(zhí)行特定的Glue作業(yè),并且允許讀取S3桶your-s3-bucket中的對象。6.2.4小結(jié)通過設(shè)置LakeFormation的訪問控制策略和使用IAM角色與策略控制Glue訪問,你可以確保數(shù)據(jù)湖中的數(shù)據(jù)安全和合規(guī)。這些策略和角色允許你精細地管理誰可以訪問數(shù)據(jù),以及他們可以執(zhí)行哪些操作,從而增強數(shù)據(jù)湖的安全性和效率。以上內(nèi)容詳細介紹了如何在AWSLakeFormation中設(shè)置訪問控制策略,以及如何使用IAM角色和策略來控制AWSGlue對數(shù)據(jù)湖中數(shù)據(jù)的訪問。通過這些步驟,你可以構(gòu)建一個安全、合規(guī)的數(shù)據(jù)湖環(huán)境,同時利用Glue的強大功能進行數(shù)據(jù)處理和分析。7數(shù)據(jù)湖的優(yōu)化與監(jiān)控7.1優(yōu)化數(shù)據(jù)湖性能7.1.1理解數(shù)據(jù)湖性能瓶頸數(shù)據(jù)湖性能的優(yōu)化首先需要理解可能的性能瓶頸。這些瓶頸可能包括數(shù)據(jù)的讀寫速度、查詢性能、數(shù)據(jù)格式、分區(qū)策略、數(shù)據(jù)壓縮以及元數(shù)據(jù)管理。例如,使用非優(yōu)化的數(shù)據(jù)格式(如CSV)可能導致讀取和查詢數(shù)據(jù)時的性能下降,因為CSV格式不支持列式存儲,這在大數(shù)據(jù)分析中是效率較低的。7.1.2數(shù)據(jù)格式優(yōu)化優(yōu)化數(shù)據(jù)湖性能的一個關(guān)鍵步驟是選擇正確的數(shù)據(jù)格式。列式存儲格式如Parquet或ORC可以顯著提高查詢性能,因為它們允許數(shù)據(jù)湖服務直接讀取和處理所需的列,而無需讀取整個行。示例:將CSV轉(zhuǎn)換為Parquet格式importboto3

importawswrangleraswr

#初始化AWSGlue和S3客戶端

glue_client=boto3.client('glue')

s3_client=boto3.client('s3')

#CSV文件的S3位置

csv_s3_path='s3://your-bucket/your-folder/your-data.csv'

#Parquet文件的S3位置

parquet_s3_path='s3://your-bucket/your-folder/your-data.parquet'

#使用awswrangler將CSV文件轉(zhuǎn)換為Parquet

wr.s3.to_parquet(

path=parquet_s3_path,

df=wr.s3.read_csv(path=csv_s3_path)

)7.1.3分區(qū)策略數(shù)據(jù)湖中的數(shù)據(jù)分區(qū)可以提高查詢性能,尤其是在處理大量數(shù)據(jù)時。通過將數(shù)據(jù)按日期、地區(qū)或其他維度進行分區(qū),可以減少掃描的數(shù)據(jù)量,從而提高查詢速度。示例:在AWSGlue中創(chuàng)建分區(qū)表#定義分區(qū)鍵

partition_keys=['year','month','day']

#創(chuàng)建分區(qū)表

glue_client.create_table(

DatabaseName='your-database',

TableInput={

'Name':'your-partitioned-table',

'StorageDescriptor':{

'Columns':[{'Name':'column1','Type':'string'},{'Name':'column2','Type':'int'}],

'Location':'s3://your-bucket/your-folder/',

'InputFormat':'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',

'OutputFormat':'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',

'Compressed':False,

'NumberOfBuckets':-1,

'SerdeInfo':{

'SerializationLibrary':'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'

},

'BucketColumns':[],

'SortColumns':[],

'Parameters':{},

'SkewedInfo':{

'SkewedColumnNames':[],

'SkewedColumnValueLocationMaps':{},

'SkewedColumnValues':[]

},

'StoredAsSubDirectories':False

},

'PartitionKeys':partition_keys,

'TableType':'EXTERNAL_TABLE',

'Parameters':{},

'TargetTable':{}

}

)7.1.4數(shù)據(jù)壓縮數(shù)據(jù)壓縮可以減少存儲成本,同時提高數(shù)據(jù)讀取和處理的速度。在數(shù)據(jù)湖中,選擇正確的壓縮算法(如Snappy或Gzip)對于優(yōu)化性能至關(guān)重要。7.1.5元數(shù)據(jù)管理元數(shù)據(jù)管理是數(shù)據(jù)湖性能優(yōu)化的另一個關(guān)鍵方面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論