Я пытался создать бессерверное озеро данных с 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.