Bir s3 paketine her yeni veri yüklendiğinde bir python betiği nasıl tetiklenir?

Aug 19 2020

Saniyede yeni kayıtlar alan bir s3 paketinden verileri indirmeye çalışıyorum. Veriler saatte 250+ G olarak gelir. Yeni veri yüklerini saniyeler içinde gerçek zamanlı olarak toplamak için sürekli olarak çalışacak bir Python betiği oluşturuyorum .

İşte s3 kova anahtarlarının yapısı:

o_key=7111/year=2020/month=8/day=11/hour=16/minute=46/second=9/ee9.jsonl.gz
o_key=7111/year=2020/month=8/day=11/hour=16/minute=40/second=1/ee99999.jsonl.gz

Bunu denemek ve denemek için Boto3 kullanıyorum ve şu ana kadar sahip olduğum şey:

s3_resource = boto3.resource('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, verify=False)
s3_bucket = s3_resource.Bucket(BUCKET_NAME)
files = s3_bucket.objects.filter()
files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified, reverse=True)]
for x in files:
    print(x)

Bu, bu paketteki tüm anahtarları çıkarır ve son değiştirilen verilere göre sıralar. Bununla birlikte, yeni veriler yüklenene kadar komut dosyasını duraklatmanın ve ardından bu verileri işlemenin ve daha sonra saniyede devam etmenin bir yolu var mı? Yeni veriler yüklendiğinde 20 saniyelik gecikmeler olabilir, bu da mantığı oluştururken bana sorun çıkaran başka bir şeydir. Herhangi bir fikir veya öneri yardımcı olacaktır.

 s3_resource = boto3.resource('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, verify=False)
 s3_bucket = s3_resource.Bucket(BUCKET_NAME)

 files = s3_bucket.objects.filter()
 while list(files): #check if the key exists
         if len(objs) > 0 and objs[0].key == key:
                   print("Exists!")
         else:
               time.sleep(.1) #sleep until the next key is there
               continue 

Bu, denediğim başka bir yaklaşım ama işe yaramıyor. Sonraki veri olmadığında uyumaya çalışıyorum ve yeni verileri yüklendikten sonra işlemeye çalışıyorum.

Yanıtlar

r0ck Aug 19 2020 at 20:52

Amazon S3 bildirim özelliği, klasörünüzde belirli olaylar olduğunda bildirim almanızı sağlar. Bildirimleri etkinleştirmek için önce Amazon S3'ün yayınlamasını istediğiniz olayları ve Amazon S3'ün bildirimleri göndermesini istediğiniz hedefleri tanımlayan bir bildirim yapılandırması eklemeniz gerekir. Bu yapılandırmayı, bir paketle ilişkili bildirim alt kaynağında depolarsınız. - Tipik olarak Lambda'da ...

https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

Umarım bu
r0ck'a yardımcı olur