मेरे पास एक बाल्टी है जिसमें हजारों फाइलें हैं। मैं बाल्टी को कैसे खोज सकता हूं? क्या कोई उपकरण है जिसे आप सुझा सकते हैं?
मेरे पास एक बाल्टी है जिसमें हजारों फाइलें हैं। मैं बाल्टी को कैसे खोज सकता हूं? क्या कोई उपकरण है जिसे आप सुझा सकते हैं?
जवाबों:
S3 में मूल सामग्री अज्ञात होने के बाद से "मूल रूप से इस बकेट को खोजें" नहीं है - इसलिए, क्योंकि S3 कुंजी / मूल्य आधारित है, एक बार में कई नोड्स तक पहुंचने के लिए कोई मूल तरीका नहीं है, जो एक पारंपरिक (SELECT * FROM ... WHERE ...)
एसक्यूएल डेटास्टोर्स पर एक एसक्यूएल (एक एसक्यूएल) प्रदान करता है। नमूना)।
आपको ListBucket
बाल्टी में वस्तुओं की एक सूची प्राप्त करने के लिए प्रदर्शन करने की आवश्यकता होगी और फिर आपके द्वारा लागू किए जाने वाले एक कस्टम ऑपरेशन को निष्पादित करने वाले प्रत्येक आइटम पर पुनरावृति - जो आपकी खोज है।
यहां पर जोड़ने के लिए बस एक नोट: यह अब 3 साल बाद है, फिर भी यह पोस्ट Google में शीर्ष पर है जब आप "S3 बाल्टी की खोज कैसे करें" टाइप करते हैं।
शायद आप कुछ अधिक जटिल की तलाश कर रहे हैं, लेकिन यदि आप यहां यह पता लगाने की कोशिश कर रहे हैं कि किसी वस्तु (फ़ाइल) को शीर्षक से कैसे ढूंढा जाए, तो यह सरल है:
बाल्टी खोलें, दाहिने हाथ की तरफ "कोई नहीं" चुनें, और फ़ाइल नाम टाइप करना शुरू करें।
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
AWS CLI का उपयोग करके खोज फ़ाइल नाम करने का एक छोटा और बदसूरत तरीका है :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
बस टाइमस्टैम्प बंद कर देता है और आउटपुट से फ़ाइल आकार की जानकारी देता हूं, जो मेरे सिस्टम पर 32 अक्षर लेता है। आपको इसकी आवश्यकता नहीं है, लेकिन यदि आप आउटपुट को किसी अन्य कमांड में पाइप कर रहे हैं, तो यह "क्लीन" आउटपुट के लिए उपयोगी हो सकता है।
include/exclude
। तो,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
कम से कम दो अलग-अलग उपयोग मामले हैं जिन्हें "बाल्टी खोजें" के रूप में वर्णित किया जा सकता है:
बाल्टी में संग्रहीत प्रत्येक वस्तु के अंदर कुछ के लिए खोजें ; यह उस बाल्टी में सभी वस्तुओं (जैसे, पाठ फ़ाइलें) आदि के लिए एक सामान्य प्रारूप मानता है। कुछ इस तरह के लिए, आप कोड़ी कॉगलन ने जो जवाब दिया, वह करने के लिए मजबूर किया जाता है। AWS S3 डॉक्स में उदाहरण कोड है जो यह बताता है कि जावा के लिए AWS SDK के साथ यह कैसे किया जाए: लिस्टिंग कुंजी जावा के लिए AWS SDK का उपयोग करना (वहां आपको PHP और C # उदाहरण भी मिलेंगे)।
सूची आइटम उस बाल्टी में निहित ऑब्जेक्ट कुंजियों में कुछ के लिए खोजें ; S3 करता है आंशिक इस के लिए समर्थन, उपसर्ग सटीक मिलान + परिसीमक के बाद मैचों गिर अनुमति देता है के रूप में। यह AWS S3 डेवलपर गाइड पर अधिक विस्तार से बताया गया है । यह अनुमति देता है, उदाहरण के लिए, "फ़ोल्डर" को लागू करने के लिए ऑब्जेक्ट कुंजी के रूप में कुछ का उपयोग करके
फ़ोल्डर / सबफ़ोल्डर / file.txtयदि आप इस सम्मेलन का पालन करते हैं, तो S3 GUI (जैसे AWS कंसोल) के अधिकांश भाग आपको अपनी बाल्टी का एक फ़ोल्डर दृश्य दिखाएंगे।
AWS ने SQL के साथ S3 बकेट क्वेरी करने के लिए एक नई सेवा जारी की: Amazon Athena https://aws.amazon.com/athena/
कई विकल्प हैं, कोई भी सरल "एक शॉट" पूर्ण पाठ समाधान नहीं है:
कुंजी नाम पैटर्न खोज : कुछ स्ट्रिंग से शुरू होने वाली कुंजियों की खोज- यदि आप प्रमुख नामों को ध्यान से डिज़ाइन करते हैं, तो आपके पास त्वरित समाधान हो सकता है।
कुंजी से संलग्न मेटाडेटा खोजें : AWS S3 में फ़ाइल पोस्ट करते समय, आप सामग्री को संसाधित कर सकते हैं, कुछ मेटा जानकारी निकाल सकते हैं और कुंजी में कस्टम हेडर के रूप में इस मेटा जानकारी को संलग्न कर सकते हैं। यह आपको पूरी सामग्री लाने की आवश्यकता के बिना प्रमुख नाम और हेडर लाने की अनुमति देता है। खोज को अनुक्रमिक रूप से किया जाना है, इसके लिए कोई "sql जैसा" खोज विकल्प नहीं है। बड़ी फ़ाइलों के साथ यह बहुत सारे नेटवर्क ट्रैफ़िक और समय को बचा सकता है।
मेटाडाटा को स्टोर करें सिंपलडीबी पर : पिछले बिंदु के रूप में, लेकिन सिंपलडीबी पर मेटाडेटा को संग्रहीत करने के साथ। यहां आपके पास चुनिंदा कथनों की तरह sql है बड़े डेटा सेटों के मामले में, आप सिम्पलडीबी सीमा से टकरा सकते हैं, जिसे दूर किया जा सकता है (कई सिंपलडीबी डोमेन में विभाजन मेटाडेटा), लेकिन यदि आप वास्तव में बहुत दूर जाते हैं, तो आपको एक और मेटाडेटा प्रकार के डेटाबेस का उपयोग करने की आवश्यकता हो सकती है।
सामग्री की अनुक्रमिक पूर्ण पाठ खोज - एक-एक करके सभी कुंजी को संसाधित करना। बहुत धीमी गति से, अगर आपके पास प्रक्रिया करने के लिए बहुत अधिक चाबियाँ हैं।
हम कुछ वर्षों के लिए फ़ाइल के 1440 संस्करणों को प्रति दिन (एक मिनट) स्टोर कर रहे हैं, संस्करणित बाल्टी का उपयोग करके, यह आसानी से संभव है। लेकिन कुछ पुराने संस्करण प्राप्त करने में समय लगता है, क्योंकि किसी को संस्करण द्वारा क्रमिक रूप से जाना पड़ता है। कभी-कभी मैं रिकॉर्ड्स के साथ सरल CSV इंडेक्स का उपयोग करता हूं, प्रकाशन समय प्लस संस्करण आईडी दिखा रहा है, इस होने के बाद, मैं पुराने संस्करण पर जल्दी से कूद सकता हूं।
जैसा कि आप देखते हैं, एडब्ल्यूएस एस 3 पूर्ण पाठ खोजों के लिए डिज़ाइन किया गया है, यह सरल भंडारण सेवा नहीं है।
सीधे AWS कंसोल बकेट दृश्य में।
जब आपके पास वांछित फ़ाइलों को प्राप्त करने के लिए हजारों या लाखों फाइलें हैं, तो वितरित प्रतिलिपि का उपयोग करके उन्हें किसी अन्य स्थान पर कॉपी करना है । आप इसे Hadoop जॉब में EMR पर चलाते हैं । AWS के बारे में अच्छी बात यह है कि वे अपने कस्टम S3 संस्करण s3-dist-cp प्रदान करते हैं । यह आपको GroupBy फ़ील्ड में एक नियमित अभिव्यक्ति का उपयोग करके वांछित फ़ाइलों को समूह करने की अनुमति देता है। आप उदाहरण के लिए EMR पर एक कस्टम चरण में इसका उपयोग कर सकते हैं
[
{
"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"
}
]
यदि आप विंडोज पर हैं और आपके पास एक अच्छा grep
विकल्प खोजने का समय नहीं है , तो एक त्वरित और गंदा तरीका होगा:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
और फिर myfile.txt में क्विक-सर्च करें
"फ़ोल्डर" बिट वैकल्पिक है।
PS यदि आपके पास AWS सीएलआई स्थापित नहीं है - तो चॉकलेट पैकेज प्रबंधक का उपयोग करके एक लाइनर है
choco install awscli
पीपीएस यदि आपके पास चॉकलेट पैकेज प्रबंधक नहीं है - इसे प्राप्त करें! विंडोज पर आपका जीवन 10 गुना बेहतर हो जाएगा। (मैं चॉकलेट के साथ किसी भी तरह से संबद्ध नहीं हूं, लेकिन हे, यह बहुत जरूरी है, वास्तव में)।
यह देखते हुए कि आप AWS में हैं ... मुझे लगता है कि आप उनके CloudSearch टूल का उपयोग करना चाहेंगे। उन डेटा को डालें जिन्हें आप उनकी सेवा में खोजना चाहते हैं ... क्या यह S3 कुंजी की ओर इशारा करता है।
एक अन्य विकल्प अपने वेब सर्वर पर S3 बाल्टी को दर्पण करना और स्थानीय रूप से पार करना है। चाल यह है कि स्थानीय फाइलें खाली हैं और केवल कंकाल के रूप में उपयोग की जाती हैं। वैकल्पिक रूप से, स्थानीय फाइलें उपयोगी मेटा डेटा को पकड़ सकती हैं, जिन्हें आपको आमतौर पर S3 (जैसे कि filesize, mimetype, लेखक, टाइमस्टैम्प, यूआईडी) से प्राप्त करना होगा। जब आप फ़ाइल डाउनलोड करने के लिए एक URL प्रदान करते हैं, तो स्थानीय रूप से खोज करें लेकिन S3 पते के लिए एक लिंक प्रदान करें।
स्थानीय फ़ाइल ट्रैवर्सिंग आसान है और S3 प्रबंधन के लिए यह दृष्टिकोण भाषा अज्ञेय है। स्थानीय फ़ाइल ट्रैवर्सिंग भी फ़ाइलों के डेटाबेस को बनाए रखने और क्वेरी करने से बचती है या बाल्टी सामग्री को प्रमाणित करने और प्राप्त करने के लिए दूरस्थ एपीआई कॉल की एक श्रृंखला बनाती है।
आप उपयोगकर्ताओं को एफ़टीपी या एचटीटीपी के माध्यम से सीधे अपने सर्वर पर फ़ाइलों को अपलोड करने की अनुमति दे सकते हैं और फिर किसी भी आकार के साथ फ़ाइलों के लिए निर्देशिकाओं पर पुनरावृत्ति करके चरम समय पर अमेज़ॅन के लिए नई और अद्यतन फ़ाइलों के एक बैच को स्थानांतरित कर सकते हैं। अमेज़न पर एक फ़ाइल स्थानांतरण के पूरा होने पर, वेब सर्वर फ़ाइल को उसी नाम के रिक्त स्थान से बदलें। यदि किसी स्थानीय फ़ाइल में कोई फ़ाइल है तो सीधे उसकी सेवा करें क्योंकि इसकी प्रतीक्षा बैच हस्तांतरण है।
जिस तरह से मैंने ऐसा किया है: मेरे पास s3 में हजारों फाइलें हैं। मैंने सूची में एक फ़ाइल के गुण पैनल को देखा। आप उस फ़ाइल का यूआरआई देख सकते हैं और मैंने उस कॉपी को ब्राउज़र में पेस्ट कर दिया है - यह एक टेक्स्ट फाइल थी और इसे अच्छी तरह से प्रस्तुत किया गया था। अब मैंने uuid को url में उस uuid के साथ बदल दिया जो मेरे हाथ में था और वहाँ फ़ाइल बूम है।
काश AWS के पास एक फ़ाइल खोजने का एक बेहतर तरीका होता, लेकिन यह मेरे लिए काम करता है।
इस आदेश का प्रयास करें:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
फिर आप इसे विशिष्ट फ़ाइल प्रकारों को प्राप्त करने के लिए एक grep में पाइप कर सकते हैं।
--output text
निर्दिष्ट करता है कि आउटपुट प्लेन टेक्स्ट होगा, न कि JSON, आदि और --query 'Contents[].{Key: Key, Size: Size}'
केवल नाम और फ़ाइल का आकार दर्ज करने के लिए सूची के आउटपुट को फ़िल्टर करता है। यह खोज Key: Key
या पसंद नहीं करता है ।
यह छोटा सा पुराना धागा है - लेकिन शायद किसी ऐसे व्यक्ति की मदद करें जो अभी भी खोज करता है - मैं वह हूं जो एक वर्ष के लिए खोज करता हूं।
समाधान " AWS एथेना " हो सकता है जहां आप इस तरह से डेटा खोज सकते हैं
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
वर्तमान में मूल्य निर्धारण 1TB डेटा के लिए $ 5 है - इसलिए, उदाहरण के लिए, यदि आपकी क्वेरी 1TB फ़ाइल 3times पर खोज करती है, तो आपकी लागत $ 15 है - लेकिन उदाहरण के लिए यदि "कनवर्ट किए गए स्तंभ स्वरूप" में केवल 1column है, तो आप क्या पढ़ना चाहते हैं, आप 1 भुगतान करेंगे / 3 की कीमत का मतलब $ 1.67 / टीबी है।
इस दस्तावेज पर एक नज़र डालें: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
नामों को फ़िल्टर करने के लिए आप एक पर्ल-कम्पेटिबल रेगुलर एक्सप्रेशन (PCRE) का उपयोग कर सकते हैं।
मैंने अपनी बाल्टी में पैटर्न खोजने के लिए नीचे कुछ किया
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
}
बड़ी बाल्टियों के लिए यह बहुत अधिक समय लेता है क्योंकि सभी ऑब्जेक्ट सारांश एव्स द्वारा वापस कर दिए जाते हैं और न केवल उन लोगों को जो उपसर्ग और सीमांकक से मेल खाते हैं। मैं प्रदर्शन को बेहतर बनाने के तरीकों की तलाश कर रहा हूं और अब तक मैंने केवल यही पाया है कि मुझे चाबियों का नाम देना चाहिए और उन्हें बाल्टियों में ठीक से व्यवस्थित करना चाहिए।
मैंने उसी समस्या का सामना किया। वर्तमान स्थिति की तुलना में S3 में खोज करना अधिक आसान होना चाहिए। इसीलिए, मैंने S3 में खोज के लिए इस ओपन सोर्स टूल को लागू किया।
SSEARCH पूर्ण खुला स्रोत S3 खोज उपकरण है। यह हमेशा ध्यान में रखते हुए लागू किया गया है कि प्रदर्शन महत्वपूर्ण कारक है और बेंचमार्क के अनुसार यह बाल्टी की खोज करता है जिसमें सेकंड के भीतर ~ 1000 फाइलें होती हैं।
स्थापना सरल है। आप केवल docker-compose फ़ाइल डाउनलोड करते हैं और उसके साथ चल रहे हैं
docker-compose up
SSEARCH शुरू किया जाएगा और आप अपने पास मौजूद किसी भी बाल्टी में कुछ भी खोज सकते हैं।
2020 के लिए तेजी से आगे, और हमारे 2fa के रूप में aws-okta का उपयोग करते हुए, निम्न कमांड, जबकि इस विशेष बाल्टी (+270,000) में सभी वस्तुओं और फ़ोल्डरों के माध्यम से पुनरावृति करने के लिए नरक के रूप में धीमी गति से काम किया।
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
S3 बाल्टी को क्वेरी करने के लिए Amazon Athena का उपयोग करें। इसके अलावा, डेटा को Amazon Elastic खोज में लोड करें। उम्मीद है की यह मदद करेगा।
तकनीकी उत्तर नहीं, लेकिन मैंने एक एप्लिकेशन बनाया है जो वाइल्डकार्ड खोज के लिए अनुमति देता है: https://bucketsearch.net/
यह अतुल्यकालिक रूप से आपकी बाल्टी को अनुक्रमणित करेगा और फिर आपको परिणामों को खोजने की अनुमति देगा।
यह उपयोग करने के लिए स्वतंत्र है (दान)।
स्थिति 2018-07: अमेज़ॅन के पास csv और json फ़ाइलों की खोज की तरह देशी एसक्यूएल है!