2017-10-16 79 views
0

我将管道分隔的未分区数据作为Amazon S3上的文本文件,我从红移卸载以清除我们的红移节点上的空间。我在雅典娜创建了一个表来访问这些数据,但我想优化我的数据以获得性能。我尝试使用AWS EMR将我的数据转换为parquet格式,并将它们作为parquet格式的文件存储在s3存储桶中。我试图按照AWS网站上的说明操作,但我发现这些说明有点令人困惑。将文本转换为实木复合地板

回答

0

如果没有关于您要转换的数据或您遇到的错误的某些具体细节,则很难确定对您最有帮助的内容。但我希望从我的经验,下面的提示将帮助:

1.图出的原始数据外观 可能的是,你将被转换的数据将被存储在亚马逊S3水桶,通常存储在一个单独的每个不同的表文件夹和每个文件夹将该数据的内容分割成压缩文本文件。了解格式对于在下一步中编写正确的Hive命令至关重要。

2.写镶木转换DDL脚本 在镶木转换过程的关键要素是基于蜂房DDL(数据定义语言)脚本,该脚本描述了表的架构(包括数据类型),并且指向输入数据的存储位置和输出数据的最终位置。通常,描述原始数据基础设施的“ddl”文件与数据一起提供,或者模式在某处进行描述。作为一个例子,这里是一个S3桶“文件夹”与一个特定模式的转换镶DDL脚本:

ADD JAR /usr/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.0.0-amzn-5.jar; 

CREATE EXTERNAL TABLE offer (
offer_sid VARCHAR(36), 
created TIMESTAMP, 
offer_id VARCHAR(100), 
offer_position VARCHAR(100), 
page_position VARCHAR(100), 
vertical VARCHAR(100), 
partner VARCHAR(100), 
card_name VARCHAR(255)) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
LOCATION 's3://yourdata/raw/table' ; 

CREATE EXTERNAL TABLE parquet_hive (
offer_sid VARCHAR(36), 
created TIMESTAMP, 
offer_id VARCHAR(100), 
offer_position VARCHAR(100), 
page_position VARCHAR(100), 
vertical VARCHAR(100), 
partner VARCHAR(100), 
card_name VARCHAR(255)) 
STORED AS PARQUET 
LOCATION 's3://yourdata/parquet/table/'; 

INSERT OVERWRITE TABLE parquet_hive SELECT * FROM offer; 

这里,第一行表示蜂巢版本在解释即将语句中使用。请注意,您选择的Hive版本将决定哪个版本受支持,这一点非常重要。点击此处查看亚马逊提供的不同Hive versions

下一行代码块按照DDL语句的指定创建表。原始数据的位置用“位置”表示,更重要的是,数据的格式(在步骤(1)中确定)用“行格式”表示。在这里,SerDe(Serializer/Deserializer)接口OpenCSVSerde很好地处理存储在双引号中的行中的数据值。默认情况下,OpenCSVSerde使用双引号作为引号字符和逗号作为分隔符。请注意,并非所有原始数据格式都需要此SerDe接口;双引号的情况有点特殊。

最后一行代码块定义了最终Parquet表的格式(用“STORED AS PARQUET”表示),Parquet文件最终的输出位置,然后使用第一个表中的数据写入表。

3. EMR集群执行脚本镶 一旦你写的特定表,镶木转换脚本,将其上传到一个单独的文件夹适当的S3存储(S3中的:// yourdata/parquet_scripts由于写本例中的parquet-table.q)。该脚本将在安装了Hive的EMR集群上执行。下面是一个例子命令来启动一个EMR集群执行使用AWS CLI(命令行界面)脚本:

aws emr create-cluster --enable-debugging --log-uri s3://yourdata/parquetLogs --applications Name=Hadoop Name=Hive Name=HCatalog --ec2-attributes KeyName=your_pemkey,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-888777ff --service-role EMR_DefaultRole --release-label emr-5.3.0 --instance-type m4.xlarge --instance-count 1 --steps Type=HIVE,Name="Convert offer to Parquet",ActionOnFailure=CONTINUE,ActionOnFailure=TERMINATE_CLUSTER,Args=[-f,s3://yourdata/parquet_scripts/write-parquet-table.q,-hiveconf,INPUT=s3://yourdata/raw/table/,-hiveconf,OUTPUT=s3://yourdata/parquet/table,-hiveconf,REGION=us-east-1] --region us-east-1 --auto-terminate --profile your_profile

除了提供您的S3存储deails,pemkey名称和AWS CLI配置文件,你会需要将SubnetId = subnet-888777ff更改为有效的子网。现在,在您的AWS仪表板中确定一个可用的VPC子网,并将上面的命令中的subnet-888777ff替换为其ID。

此特定命令将启动在m4.xlarge EC2实例上运行的EMR群集,将调试日志写入s3:// yourdata/parquetLogs,执行Parquet转换脚本“write-parquet-table.q”,并使用AWS CLI凭证配置文件“your_profile”。根据您使用的原始数据量和实例大小,完成Parquet转换过程所花费的时间将有很大差异。脚本完成后,EMR群集将自行终止,Parquet格式的数据将准备好导入到Amazon Athena等界面中。

相关问题