Soru Amazon Redshift, S3 vs DynamoDB vs Insert'e veri yükleme (adım adım)


Kullanımı hakkında rapor göndermek zorunda olan bir web uygulamasına sahibim, Amazon RedShift'i bu amaçla bir veri ambarı olarak kullanmak istiyorum. Verileri nasıl toplamalıyım?

Her seferinde, kullanıcı benim uygulamam ile etkileşime giriyor, bunu rapor etmek istiyorum .. bu yüzden S3'e ne zaman dosya yazmalıyım? Ve kaç tane ? Demek istediğim ... dir:  - Eğer bilgileri hemen göndermezseniz, o zaman kaybedilen bir bağlantının sonucu olarak ya da sistemimdeki bazı hatalardan dolayı toplanabilir ve S3'e gönderilmeye hazır olabilirim.  - Her kullanıcı etkileşiminde S3'e dosya yazıyorsam, RedShift'e kopyalandıktan sonra yüzlerce dosyaya (her dosyada en az veriye sahip) sahip olacak, bu şekilde yönetilmesi, sıralanması ve silinmesi gerekiyor. iyi bir çözüm gibi.

Neyi kaçırıyorum? Bunun yerine DynamoDB kullanmalı mıyım, yerine Redshift içine basit bir ekleme kullanmalı mıyım?
Verileri DynamoDB'ye yazmam gerekirse, kopyalandıktan sonra bekletme tablosunu silmeli miyim .. en iyi uygulamalar hangileri?

Her halükarda, RedShift'te veri kopyalanmasını önlemek için en iyi uygulamalar nelerdir?

Yardımı takdir et!


25
2018-01-11 23:12


Menşei


stackoverflow.com/questions/38300416/... - AWSDeveloper


Cevaplar:


Tercih edilir toplam onları olayları Amazon Redshift'e sokmadan önce kaydeder.

Faydaları şunlardır:

  • Kullanacaksın paralel Redshift'in doğası daha iyi; KOPYA S3 (veya büyük bir DynamoDB tablosundan) büyük dosyalar kümesi üzerinde olacak çok küçük bir dosyanın bireysel INSERT veya COPY'den daha hızlı.

  • Yapabilirsin ayırma öncesi Redshift'e yüklemeden önce verileriniz (özellikle sıralama olay zamanına bağlıysa). Bu aynı zamanda yük performansınızı artırır ve ihtiyaçlarınızı azaltır. VAKUM senin masalarının.

Etkinliklerinizi bir araya toplayıp Redshift'e yüklemeden önce birkaç yerde toplayabilirsiniz:

  • S3 yerel dosya - En yaygın yol, günlüklerinizi müşteri / sunucu üzerinde toplamak ve her x MB veya y dakika S3'e yüklemek. Bu işlevi destekleyen birçok günlük ekleyicisi vardır ve kodda herhangi bir değişiklik yapmanız gerekmez (örneğin, FluentD veya Log4J). Bu sadece konteyner yapılandırması ile yapılabilir. Aşağı tarafı, bazı günlükleri kaybetme riski taşıyor ve bu yerel günlük dosyaları, yükleme işleminden önce silinebilir.

  • DynamoDB - @Swami'nin tarif ettiği gibi, DynamoDB olayları biriktirmek için çok iyi bir yoldur.

  • Amazon Kinesis - Son yayınlanan hizmet aynı zamanda, çeşitli istemcilerden ve sunuculardan olaylarınızı hızlı ve güvenilir bir şekilde merkezi bir konuma iletmenin iyi bir yoludur. Olaylar, daha sonra Redshift'e önceden sıralanmayı kolaylaştıran ekleme sırasına göre sıralanmıştır. Olaylar 24 saat Kinesis'te saklanır ve daha iyi performans için, örneğin her saatte okumayı kinesis'ten ve Redshift'e yükleyebilirsiniz.

Lütfen tüm bu servislerin (S3, SQS, DynamoDB ve Kinesis) izin ver olayları doğrudan itin Son kullanıcılardan / cihazlardan, bir orta web sunucusuna gitmeye gerek kalmadan. Bu, hizmetinizin yüksek kullanılabilirliğini (artan yük veya sunucu arızasıyla nasıl başa çıkılacağı) ve sistemin maliyetini önemli ölçüde artırabilir (yalnızca kullandığınız şey için ödeme yaparsınız ve yalnızca günlükler için yeterli sunuculara sahip olmanıza gerek yoktur).

Örneğin, mobil cihazlar için nasıl geçici güvenlik belirteçleri alabileceğinizi buradan görebilirsiniz: http://aws.amazon.com/articles/4611615499399490

Bu hizmetlerle doğrudan etkileşime izin veren bir başka önemli araç seti de çeşitlidir. SDKs. Örneğin Java, .AĞ, JavaScript, iOS ve Android.

İlişkin tekilleştirme gereksinimi; Yukarıdaki seçeneklerin çoğunda toplama aşamasında bunu yapabilirsiniz, örneğin, bir Kinesis akışından okurken, olaylarınızda yinelenmeler olmadığını kontrol edebilir, ancak büyük bir etkinlik aralığını analiz etmeden önce veri deposuna.

Ancak, bu kontrolü Redshift'te de yapabilirsiniz. İyi bir uygulama COPY verileri bir hazırlama tablolarına ve sonra İç içe iyi organize edilmiş ve sıralı bir tablo.

Uygulayabileceğiniz bir diğer en iyi uygulama, günlük (veya haftalık) bir tablo bölümüne sahip olmaktır. Büyük bir uzun etkinlik tablosuna sahip olmak isteseniz bile, ancak sorgularınızın çoğu tek bir günde (örneğin son gün) çalışıyorsa, benzer yapıya sahip bir dizi tablo oluşturabilirsiniz (events_01012014, events_01022014, events_01032014) ...). O zaman yapabilirsin SELECT INTO ... WHERE date = ... bu tabloların her birine. Verileri birden çok gün içinde sorgulamak istediğinizde, UNION_ALL.


42
2018-01-12 08:49



Teşekkürler Guy, cevabınız çok detaylı, sanırım S3'ten yararlanacağım, verilerin bir araya toplanması için bir çözüm olarak. Ama anladığımdan emin olmadığım bir şey, neden bir orta web sunucusuna gitmem gerekmediğini iddia ediyorsun? - Ofer Velich
Nesneleri doğrudan S3'e yükleyebilirsiniz. Buraya bakın: docs.aws.amazon.com/AmazonS3/latest/dev/... - Guy
and you can schedule the reading from kinesis and loading to Redshift every hour - Bunu nasıl yapacağınıza dair herhangi bir bağlantı lütfen? - Kevin Meredith
Kinesis Konnektörler Kütüphanesi ve ilgili özellikler dosyası: github.com/awslabs/amazon-kinesis-connectors/blob/master/src/... - Guy
Verileri kopyalamak için Java bağlayıcı kitaplığı yerine AWS Lambda kullanmak mümkün mü? S3 -> Redshift? S3'ten Redshift'e veri kopyalamak için Lambda'yı kullanma konusunda hiçbir belge görmedim. - Kevin Meredith


Göz önünde bulundurulması gereken bir seçenek, DynamoDB'de her kullanıcı etkileşimini yazmak için DynamoDB'de her gün veya haftada bir tablo oluşturduğunuz zaman serisi tabloları oluşturmaktır. Zaman periyodunun sonunda (gün, saat veya hafta), günlükleri Redshift'e kopyalayabilirsiniz.

Daha fazla ayrıntı için, DynamoDB zaman serisi tablosunda bu desene bakın: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

ve bu blog:

http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-amazon-dynamodb.html

Redshift DynamoDB kopyası için: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html

Bu yardımcı olur umarım.


6
2018-01-12 03:04





Burada kabul edilmiş bir cevap olmasına rağmen, AWS yeni bir servis başlattı Kinesis Firehose toplama, kullanıcı tanımlı aralıklara, s3'e geçici yükleme ve yükleme (SAVE), kırmızıya kayma, yeniden deneme ve hata işleme, çıktı yönetimi vb.

Bu muhtemelen bunu yapmanın en kolay ve en güvenilir yoludur.


2
2018-01-14 02:56





Sadece burada biraz bencil olmak ve tam olarak ne olduğunu açıklamak Kar küreme bir olay analizi platformu yapar. İstemcilerin olay günlüklerini toplayıp S3'te toplayarak bu müthiş benzersiz yolu kullanıyorlar.

Bunun için Cloudfront kullanıyorlar. Yapabileceğiniz şey, S3 paketlerinden birinde bir piksel barındırır ve bu kovayı bir kaynak olarak bir CloudFront dağılımının arkasına yerleştirir. Aynı CloudFront için bir S3 grubuna günlükleri etkinleştirin.

Müşterinizdeki bu pikseli çağırdığınızda (google analizine benzer şekilde) günlükleri URL parametreleri olarak gönderebilirsiniz. Bu günlükler daha sonra zenginleştirilebilir ve Kopyalama kullanılarak Redshift veritabanına eklenebilir.

Bu, günlüklerin toplanması amacını çözmektedir. Bu kurulum sizin için tüm bunları ele alacaktır.

Ayrıca bakabilirsin Piwik'i açık kaynaklı bir analitik hizmetidir ve bunu ihtiyaçlarınıza göre değiştirip değiştiremeyeceğinizi öğrenin.


1
2018-06-01 13:26





Verileri yerel diskte CSV dosyasına yazabilir ve ardından Amazon Redshift'e veri yüklemek için Python / boto / psycopg2 komut dosyasını çalıştırabilirsiniz.

Benim .. De CSV_Loader_For_Redshift Ben sadece şunu yaparım:

  1. S3’ü kullanarak verileri sıkıştır ve yükle boto Python modülü ve çok parçalı yükleme.

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
    bucket = conn.get_bucket(bucket_name)
    k = Key(bucket)
    k.key = s3_key_name
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr )
    
  2. kullanım psycopg2 Redshift tablosuna veri eklemek için KOPYA komutu.

    sql="""
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
    

1
2018-04-27 21:33