Data Lake AWS без сервера Amazon S3 - PullRequest
0 голосов
/ 04 октября 2019

Я пытался создать бессерверное озеро данных с Amazon Simple Storage Service (Amazon S3) в качестве основного хранилища данных. Загруженные данные попадают в корзину Amazon S3, которую мы называем необработанной зоной. Чтобы сделать эти данные доступными, я должен каталогизировать их схему в каталоге данных клея AWS.

Я делаю это с помощью лямбда-функции AWS, вызываемой триггером Amazon S3 для запуска сканера клея AWS, который каталогизирует данные.

Когда сканер завершит создание определения таблицы, он вызывает вторую лямбда-функцию, используя правило Amazon CloudWatch Events. На этом этапе запускается задание AWS Glue ETL для обработки и вывода данных в другую корзину Amazon S3, которую мы называем обработанной зоной. Задание AWS Glue ETL преобразует данные в формат Apache Parquet и сохраняет их в обработанной корзине S3

Lambda для запуска искателя:

var AWS = require('aws-sdk');
var glue = new AWS.Glue();
var sqs = new AWS.SQS();
    exports.handler = function(event, context,callback) {
        console.log(JSON.stringify(event, null, 3));
        if(event.Records.length > 0 && event.Records[0].eventSource == 'aws:sqs'){
            startCrawler('datacrawler', function(err2,data2){
                if(err2) callback(err2)
                else callback(null,data2)
            })
        }else{
        var dbName = 'datacatalog';
        var params = {
            DatabaseInput: {
                Name: dbName,
                Description: 'Rede Post database',
            }
        };
        glue.createDatabase(params, function(err, data) {
                var params1 = {
                    DatabaseName: dbName,
                    Name: 'datacrawler',
                    Role: 'service-role/rede-data-lake-GlueLabRole-1OI9OXN93676F',
                    Targets: {
                        S3Targets: [{ Path: 's3://rede-data-lake-raws3bucket-1qgllh1leebin/' }]
                    },
                    Description: 'crawler test'
                };
                glue.createCrawler(params1, function(err1, data1) {
                    startCrawler('datacrawler', function(err2,data2){
                        if(err2) callback(err2)
                        else callback(null,data2)
                    })
                });
        });
    };
};
function startCrawler(name,callback){
    var params = {
        Name: name,
    };
    glue.startCrawler(params, function(err, data) {
        if (err){
            console.log(JSON.stringify(err,null,3 ))
            var params1 = {
                MessageBody: 'retry',
                QueueUrl: 'https://sqs.us-east-2.amazonaws.com/094381036356/rede-data-lake-SQSqueue-1AWGW0PCYANIY'
            };
            sqs.sendMessage(params1, function(err1, data1) {
                if (err1) callback(err1);
                else     callback(null, data1)
            });
        }
        else{
            callback(null, data)
        }
    });
    }

Cloud Watch Event rule:

{
  "detail-type": [
    "Glue Crawler State Change"
  ],
  "source": [
    "aws.glue"
  ],
  "detail": {
    "crawlerName": [
      "datacrawler"
    ],
    "state": [
      "Succeeded"
    ]
  }
}

Лямбда для запуска задания склейки:

var AWS = require('aws-sdk');
var sns = new AWS.SNS( { region: "us-east-2" });
var s3 = new AWS.S3();
var glue = new AWS.Glue({apiVersion: '2017-03-31'});
    exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event, null, 3));
        var params = {
            JobName: 'GlueSalesJob',
            Timeout: 20,
        };
        glue.startJobRun(params, function(err1, data1) {
            if (err1) {
                console.log(err1, err1.stack);}
            else {
                console.log(data1);}
        });
        console.log(JSON.stringify(event, null, 3));
    };

Все работает просто отлично, когда мы имеем дело только с одним файлом и одним заданием на склеивание, я не вижу, как его масштабировать.

Представьте, что у меня есть различные файлы, поступающие в необработанную зону, каждый файл в папку, для каждого из которых мне нужно запустить сканер AWS Glue и задание AWS Glue ETL и сохранить его в одной папке внутри обработанной области зоны.

Пример: SaleFile, installmentsFile, DebitFiles и т. Д. *

Как я могу назвать вторую лямбду, передающую имя задания, которое должно выполняться для каждого файла? По сути, мне нужно определить файл или папку Ingested, чтобы вызвать соответствующее задание склеивания.

Кто-то может помочь мне найти решение для этого? Я ценю любую помощь. Я очень новичок в Amazon.

1 Ответ

0 голосов
/ 04 октября 2019

Хорошо идет! Вы почти там: -)

Когда вы слушаете 'событие изменения состояния сканера', вы получите объект события в лямбде. Он имеет следующую структуру

"detail": {
    "crawlerName": "demo",
    ....
    ....
}

Используйте event["detail"]["crawlerName"] для получения имени сканера. Поскольку каждый сканер сопоставлен с соответствующим заданием ETL, вы можете запустить задание склеивания с помощью этого сопоставления.

...