Yanıtlar:
S3 yerli gerçek içeriği beri "bu kovayı arama" yok bilinmemektedir - Ayrıca, S3 bir teklif ala daha geleneksel veri depolarına kerede erişim birçok düğümlere hiçbir yerli yolu yoktur tabanlı anahtar / değer olduğundan (SELECT * FROM ... WHERE ...)
(a SQL modeli).
Yapmanız gereken ListBucket
, kovadaki nesnelerin bir listesini almak ve ardından uyguladığınız özel bir işlemi gerçekleştiren her öğeyi yinelemek - yani sizin araştırmanızdır.
Buraya eklemek için bir not: şimdi 3 yıl sonra, ancak "S3 Grubu nasıl aranır" yazdığınızda bu yayın Google'da en üst sıradadır.
Belki daha karmaşık bir şey arıyorsunuz, ancak buraya bir nesneyi (dosyayı) başlığına göre nasıl bulacağınızı anlamaya çalışıyorsanız, çılgın basit:
kovayı açın, sağ taraftaki "yok" u seçin ve dosya adını yazmaya başlayın.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
AWS CLI kullanarak arama dosyası adları yapmanın kısa ve çirkin bir yolu :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
sistemimde 32 karakter alan çıktıdaki zaman damgası ve dosya boyutu bilgisini keser. Buna ihtiyacınız yoktur, ancak çıktıyı başka bir komuta aktarıyorsanız "temiz" çıktıya sahip olmak kullanışlı olabilir.
include/exclude
. Yani,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
"Kovayı ara" olarak tanımlanabilecek (en az) iki farklı kullanım durumu vardır:
Grupta depolanan her nesnenin içinde bir şey arayın ; bu, bu gruptaki tüm nesneler (örneğin, metin dosyaları) vb. için ortak bir biçim alır. Böyle bir şey için, Cody Caughlan'ın az önce cevapladığı şeyi yapmak zorunda kalırsınız. AWS S3 belgeleri, bunun Java için AWS SDK ile nasıl yapılacağını gösteren örnek kodlara sahiptir: Anahtarları Java için AWS SDK kullanarak (burada ayrıca PHP ve C # örnekleri de bulacaksınız).
Liste öğesi Bu grupta bulunan nesne anahtarlarında bir şey arayın ; S3 yapar sahip kısmi bir sınırlayıcı sonra sonuç çöken ön ek kesin sonuç + izin şeklinde, bu destek. Bu, AWS S3 Geliştirici Kılavuzu'nda daha ayrıntılı olarak açıklanmaktadır . Bu, örneğin, nesne anahtarları olarak "klasörler"
klasör / alt klasör / file.txtBu kuralı izlerseniz, S3 GUI'lerin çoğu (AWS Konsolu gibi), grubunuzun bir klasör görünümünü gösterir.
AWS, S3 kovalarını SQL ile sorgulamak için yeni bir Hizmet yayınladı: Amazon Athena https://aws.amazon.com/athena/
Birden fazla seçenek vardır, hiçbiri basit "tek çekim" tam metin çözümü değildir:
Anahtar adı desen arama : Bazı dize ile başlayan anahtarları arama - anahtar adlarını dikkatli bir şekilde tasarlarsanız, oldukça hızlı bir çözümünüz olabilir.
Anahtarlara ekli meta verileri arama : AWS S3'e bir dosya gönderirken, içeriği işleyebilir, bazı meta bilgileri ayıklayabilir ve bu meta bilgileri özel üstbilgiler biçiminde anahtara ekleyebilirsiniz. Bu, tam içeriği getirmenize gerek kalmadan anahtar adlarını ve başlıklarını almanıza olanak tanır. Arama sırayla yapılmalıdır, bunun için "sql benzeri" arama seçeneği yoktur. Büyük dosyalarla bu çok fazla ağ trafiğinden ve zamandan tasarruf sağlayabilir.
Meta verileri SimpleDB'de depolayın : önceki nokta olarak, ancak meta verileri SimpleDB'de depolayarak. Burada sql benzeri select deyimleri var. Büyük veri kümeleri durumunda, üstesinden gelebilecek SimpleDB sınırlarına (birden çok SimpleDB etki alanında bölüm meta verileri) vurabilirsiniz, ancak gerçekten ileri giderseniz, başka bir metedata türü veritabanı kullanmanız gerekebilir.
İçeriğin sıralı tam metin araması - tüm anahtarların tek tek işlenmesi. Çok yavaş, eğer işlemek için çok fazla anahtarınız varsa.
Bir dosyanın 1440 versiyonunu birkaç yıl boyunca günde bir kez (dakikada bir) saklıyoruz, versiyonlu kova kullanarak kolayca mümkündür. Ancak, eski bir sürüme sahip olmak zaman alır, çünkü biri sırayla sürüme göre gitmelidir. Bazen kayıtlarla basit CSV indeksini kullanıyorum, yayın süresini artı sürüm kimliğini gösterdim, buna sahipim, daha hızlı bir şekilde eski sürüme geçebilirim.
Gördüğünüz gibi, AWS S3 tam metin aramaları için kendi başına tasarlanmamıştır, basit bir depolama hizmetidir.
doğrudan AWS Konsolu grup görünümünde.
Binlerce veya milyonlarca dosyanız olduğunda, istenen dosyaları almanın başka bir yolu da dağıtılmış kopyayı kullanarak başka bir konuma kopyalamaktır . Bunu bir Hadoop İşinde EMR'de çalıştırıyorsunuz . AWS ile ilgili en güzel şey, özel S3 sürümleri s3-dist-cp'yi sağlamalarıdır . İstediğiniz dosyaları groupBy alanında normal bir ifade kullanarak gruplamanıza olanak tanır. Bunu örneğin EMR'deki özel bir adımda kullanabilirsiniz
[
{
"ActionOnFailure": "CONTINUE",
"Args": [
"s3-dist-cp",
"--s3Endpoint=s3.amazonaws.com",
"--src=s3://mybucket/",
"--dest=s3://mytarget-bucket/",
"--groupBy=MY_PATTERN",
"--targetSize=1000"
],
"Jar": "command-runner.jar",
"Name": "S3DistCp Step Aggregate Results",
"Type": "CUSTOM_JAR"
}
]
Windows'daysanız ve güzel bir grep
alternatif bulmak için zamanınız yoksa , hızlı ve kirli bir yol olacaktır:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
ve sonra myfile.txt dosyasında hızlı arama yapın
"Klasör" biti isteğe bağlıdır.
PS, AWS CLI yüklü değilse - burada Chocolatey paket yöneticisini kullanan tek bir astar
choco install awscli
PPS Chocolatey paket yöneticisine sahip değilseniz - alın! Windows'taki hayatınız 10 kat daha iyi olacak. (Chocolatey ile hiçbir şekilde bağlantılı değilim, ama hey, gerçekten olması gereken bir şey).
AWS'de olduğunuz göz önüne alındığında ... Onların CloudSearch araçlarını kullanmak isteyeceğinizi düşünürüm. Aramak istediğiniz verileri hizmetlerine koyun ... S3 tuşlarını göstermesini sağlayın.
Başka bir seçenek de S3 kovasını web sunucunuza yansıtmak ve yerel olarak geçiş yapmaktır. İşin püf noktası, yerel dosyaların boş olması ve yalnızca iskelet olarak kullanılmasıdır. Alternatif olarak, yerel dosyalar normalde S3'ten almanız gereken yararlı meta verileri tutabilir (örn. Dosya boyutu, mime türü, yazar, zaman damgası, uuid). Dosyayı indirmek için bir URL sağladığınızda, yerel olarak arama yapın ve S3 adresine bir bağlantı sağlayın.
Yerel dosya dolaşımı kolaydır ve S3 yönetimi için bu yaklaşım dil bilincidir. Yerel dosya geçişi ayrıca, bir dosya veritabanının korunmasını ve sorgulanmasını veya grup içeriğini doğrulamak ve almak için bir dizi uzak API çağrısı yapılmasını geciktirir.
Kullanıcıların FTP veya HTTP aracılığıyla doğrudan sunucunuza dosya yüklemesine izin verebilir ve daha sonra, herhangi bir boyuttaki dosyalar için dizinleri yineleyerek bir grup yeni ve güncellenmiş dosyayı yoğun olmayan zamanlarda Amazon'a aktarabilirsiniz. Amazon'a dosya aktarımı tamamlandığında, web sunucusu dosyasını aynı adda boş bir dosyayla değiştirin. Yerel bir dosyanın herhangi bir dosya boyutu varsa, toplu aktarımını beklediği için doğrudan sunun.
Bunu yaptığım yol: s3'te binlerce dosyam var. Listedeki bir dosyanın özellikler panelini gördüm. Bu dosyanın URI'sini görebilirsiniz ve bunu tarayıcıya yapıştırdım - bir metin dosyasıydı ve güzel bir şekilde oluşturuldu. Şimdi, url'deki uuid'i elimdeki uuid ile değiştirdim ve dosya var.
Keşke AWS'nin bir dosyayı aramak için daha iyi bir yolu olsaydı, ama bu benim için çalıştı.
Bu komutu deneyin:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Daha sonra, onlarla ne istersen yapmak için belirli dosya türlerini almak için bunu bir grep'e bağlayabilirsiniz.
--output text
çıktının JSON vb. Değil düz metin olacağını belirtir ve --query 'Contents[].{Key: Key, Size: Size}'
yalnızca listenin çıktısını dosya adına ve dosya boyutuna göre filtreler. Arama Key: Key
veya benzeri değildir.
Bu biraz eski bir konu - ama belki de hala arama yapan birine yardım et - ben bir yıl arayan benim.
Çözüm, böyle veriler üzerinde arama yapabileceğiniz " AWS Athena " olabilir
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Şu anda fiyatlandırma 1 TB veri için 5 ABD dolarıdır - bu nedenle, örneğin, bir 1 TB dosya üzerinden 3 kez sorgu arama maliyetiniz 15 ABD dolarıdır - ancak örneğin "dönüştürülen sütun biçiminde" yalnızca 1 sütun varsa, okumak istediğiniz ödeme tutarınız 1 / 3 fiyatı 1,67 $ / TB anlamına gelir.
Bu belgelere bir göz atın: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
İsimlere filtre uygulamak için Perl Uyumlu Düzenli İfade (PCRE) kullanabilirsiniz.
Kovamdaki desenleri bulmak için aşağıdaki gibi bir şey yaptım
def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
var s3Client = new AmazonS3Client()
var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
var objectListing: ObjectListing = null
var res: List[String] = List()
do {
objectListing = s3Client.listObjects(listObjectsRequest)
res = res ++ objectListing.getCommonPrefixes
listObjectsRequest.setMarker(objectListing.getNextMarker)
} while (objectListing.isTruncated)
res
}
Daha büyük kovalar için bu çok fazla zaman alır çünkü tüm nesne özetleri Aws tarafından döndürülür, yalnızca önek ve sınırlayıcıyla eşleşenler değil. Performansı iyileştirmenin yollarını arıyorum ve şimdiye kadar sadece anahtarları adlandırmalı ve bunları kovalarda düzgün bir şekilde düzenlemeliyim.
Aynı sorunla karşılaştım. S3'te arama yapmak mevcut durumdan çok daha kolay olmalıdır. Bu nedenle, S3'te arama yapmak için bu açık kaynak aracını uyguladım.
SSEARCH tam açık kaynaklı S3 arama aracıdır. Her zaman performansın kritik faktör olduğunu akılda tutarak uygulandı ve kıyaslamalara göre saniyeler içinde ~ 1000 dosya içeren kovada arama yapıyor.
Kurulum basit. Yalnızca docker-compose dosyasını indirip
docker-compose up
SSEARCH başlatılacak ve sahip olduğunuz herhangi bir grupta herhangi bir şeyi arayabilirsiniz.
2020'ye kadar hızlı ilerleyin ve aws-okta'yı 2fa'mız olarak kullanarak, aşağıdaki komut, bu özel kovadaki tüm nesneler ve klasörler (+270.000) arasında yinelemek için yavaşça cehennem gibi çalıştı.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Teknik bir cevap değil, ancak joker karakter aramasına izin veren bir uygulama geliştirdim: https://bucketsearch.net/
Kovanınızı eşzamansız olarak dizine ekler ve ardından sonuçları aramanıza olanak tanır.
Kullanmak ücretsizdir (bağış yazılımı).
Durum 2018-07: Amazon, csv ve json dosyalarını aramak gibi yerel sql var!