Firehose记录格式转换分区

时间:2018-05-15 06:47:41

标签: file-conversion amazon-kinesis-firehose

我尝试使用新的firehose功能“记录格式转换”将我的事件保存为athena或hive聚合的镶木地板文件。您必须从胶水目录中选择表格,但是firehose会忽略已定义的分区,而是将文件保存在结构YYYY / MM / DD / HH /中。数据也缺少定义的分区列。如果它已用于分区,那就没问题。

是否有强制使用表分区的API配置或其他内容?

1 个答案:

答案 0 :(得分:0)

即使分区相同,我也有同样的问题

因此,您必须使用AWS lambda来实现所需的目标

  1. 一个将Firehose生成的文件移动到Athena使用的存储桶中。
  2. 另一个触发刷新雅典娜表的表,因为它将看不到新文件夹 (我并没有放置所有触发器,但这应该只是调用“ MSCK REPAIR TABLE your_table_name;”)。

对于第一个,我选择NodeJ,因为这非常简单而且非常快。 在最少AWS允许的情况下,移动120MB文件需要大约3秒的时间才能分配128MB RAM内存(Firehose生成的文件最大约为64MB)

Node js项目结构 package.json

{ 
  "name": "your.project", 
  "version": "1.0.0", 
  "description": "Copy generated partitioned files by Firehose to valid partitioned files for Athena", 
  "main": "index.js", 
  "dependencies": { 
    "async": "^2.6.1" 
   } 
}

还有index.js

const aws = require('aws-sdk');
const async = require('async');
const s3 = new aws.S3();
const dstBucket = 'PUT_YOUR_BUCKET_NAME_HERE';
var util = require('util');

exports.handler = (event, context, callback) => {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = event.Records[0].s3.object.key;
    const split = srcKey.split('/');
    const dstKey = `event_year=${split[0]}/event_month=${split[1]}/event_day=${split[2]}/event_hour=${split[3]}/${split[4]}`;
    console.log("Reading options from event:\n", util.inspect(event, {depth: 10}));
    async.waterfall([
            function copy(next) {
                s3.copyObject({
                    Bucket: dstBucket,
                    CopySource: `${srcBucket}/${srcKey}`,
                    Key: dstKey
                }, next);
            },
            function deleteOriginal(copyResult, next) {
                s3.deleteObject({
                    Bucket: srcBucket,
                    Key: srcKey
                }, next);
            }
        ], function (err) {
            if (err) {
                console.error(`Failed: ${srcBucket}/${srcKey} => ${dstBucket}/${dstKey} to move FireHose partitioned object to Athena partitioned object. Error: ${err}`);
            } else {
                console.log(`Success: ${srcBucket}/${srcKey} => ${dstBucket}/${dstKey} moved FireHose partitioned object to Athena partitioned object`);
            }
            callback(null, 'move success');
        }
    );
};

仅更新一些数据以适合您的情况。 而且我遇到的另一个问题是,在使用

构建项目时
npm install

然后将其压缩,这在AWS解压缩中是不正确的,因此我必须更新index.js的路径。

这可行。

您也可以找到此行

console.log("Reading options from event:\n", util.inspect(event, {depth: 10}));

可以将其删除,但是极大地有助于了解处理对象的详细信息