【问题标题】:Handling S3 PUT notifications when writing to an Amazon S3 bucket with Hive inside Amazon EMR在 Amazon EMR 中使用 Hive 写入 Amazon S3 存储桶时处理 S3 PUT 通知
【发布时间】:2017-01-23 19:24:05
【问题描述】:

我有一个如下所示的 Hive 脚本:

导入时跳过 csv 中的标头

SET skip.header.line.count = 1;

创建 CAC 表

CREATE EXTERNAL TABLE channelAccessCodes (accessCode string,channelCode string,id string,upc string,version bigint)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "properties.channelAccessCode", 
"dynamodb.column.mapping" = "accessCode:accessCode,channelCode:channelCode,id:id,upc:upc,version:version"); 

CREATE TEMPORARY TABLE if not exists bdc (id STRING,name STRING,address STRING,zip STRING,city_hotel STRING,cc1 STRING,ufi STRING,class STRING,currencycode STRING,minrate STRING,maxrate STRING,preferred STRING,nr_rooms STRING,longitude STRING,latitude STRING,public_ranking STRING,hotel_url STRING,photo_url STRING,desc_en STRING,desc_fr STRING,desc_es STRING,desc_de STRING,desc_nl STRING,desc_it STRING,desc_pt STRING,desc_ja STRING,desc_zh STRING,desc_pl STRING,desc_ru STRING,desc_sv STRING,desc_ar STRING,desc_el STRING,desc_no STRING,city_unique STRING,city_preferred STRING,continent_id STRING,review_score STRING,review_nr STRING)
ROW FORMAT DELIMITED fields terminated by '\t' lines terminated by '\n'
stored as textfile
LOCATION 's3://properties-uat-imports/input/BDC'
tblproperties("skip.header.line.count"="1");

CREATE TEMPORARY TABLE TempTableDeletes(ChannelAccessCode STRING)
ROW FORMAT DELIMITED fields terminated by '|' lines terminated by '\n';

INSERT INTO TABLE TempTableDeletes SELECT channelAccessCodes.id FROM channelAccessCodes LEFT JOIN bdc ON channelAccessCodes.id = CONCAT('BDC',bdc.id)  WHERE CONCAT('BDC',bdc.id) IS NULL AND channelAccessCodes.id LIKE 'BDC%';

Section - 将选定的数据写入 S3

create external table s3_export_deletes(ChannelAccessCode STRING)
row format delimited lines terminated by '\n'
stored as textfile
LOCATION 's3://properties-uat-imports-emr/';

写作

INSERT OVERWRITE TABLE s3_export_deletes SELECT * from TempTableDeletes;

它基本上从 dynamo 表中读取数据,并从 S3 中读取一个文件...对输出表进行一些操作,然后将该表写入 S3 存储桶。

当这个 Hive 脚本在 EMR 上运行时,它会将一个文件写入 S3。我在此存储桶上配置了一个通知,以在存储桶上收到 PUT 通知时向 SQS 队列发送一条消息。我只希望有一个通知,但似乎有多个(准确地说是 6 个)?

有谁知道这是为什么?是否可以强制 Hive 只调用 S3 存储桶一次?

谢谢,

克里斯

【问题讨论】:

  • 我强烈建议您围绕代码设置格式。

标签: amazon-web-services amazon-s3 hive emr


【解决方案1】:

这里的问题是,hive 的整个输出提交过程将文件写入子目录,然后重命名它们,都是 PUT 调用的组合(每个目录一个),重命名过程中每个副本一个。

我想不出任何简单的解决方案,除了过滤该通知(lambda?)以丢弃除最终提交 PUT 之外的所有内容

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2016-08-25
    • 1970-01-01
    • 2012-10-23
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多