ฉันมีที่เก็บข้อมูลหลายพันไฟล์ในนั้น ฉันจะค้นหาที่ฝากข้อมูลได้อย่างไร มีเครื่องมือที่คุณสามารถแนะนำได้หรือไม่?
ฉันมีที่เก็บข้อมูลหลายพันไฟล์ในนั้น ฉันจะค้นหาที่ฝากข้อมูลได้อย่างไร มีเครื่องมือที่คุณสามารถแนะนำได้หรือไม่?
คำตอบ:
S3 ไม่ได้มีเจ้าของภาษา "ค้นหาฝากข้อมูลนี้" เนื่องจากไม่ทราบเนื้อหาจริง - เนื่องจาก S3 เป็นคีย์ / ค่าตามไม่มีวิธีดั้งเดิมในการเข้าถึงโหนดจำนวนมากในคราวเดียวนอกจากนี้ยังมีดาต้าเบสแบบดั้งเดิมที่ให้ (SELECT * FROM ... WHERE ...)
(ใน SQL รูปแบบ)
สิ่งที่คุณต้องทำคือทำListBucket
รายการของออบเจ็กต์ในที่เก็บข้อมูลแล้ววนซ้ำทุกไอเท็มที่มีการดำเนินการแบบกำหนดเองที่คุณใช้ซึ่งก็คือการค้นหาของคุณ
เพียงบันทึกที่จะเพิ่มที่นี่: ตอนนี้ 3 ปีต่อมา แต่โพสต์นี้ติดอันดับใน Google เมื่อคุณพิมพ์ใน "วิธีการค้นหา S3 Bucket"
บางทีคุณกำลังมองหาบางอย่างที่ซับซ้อนกว่านี้ แต่ถ้าคุณลงมาที่นี่พยายามคิดหาวิธีค้นหาวัตถุ (ไฟล์) โดยใช้ชื่อเป็นเรื่องง่าย ๆ :
เปิดที่ฝากข้อมูลเลือก "none" ทางด้านขวามือแล้วเริ่มพิมพ์ชื่อไฟล์
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
สนับสนุน CLI ดังนั้นaws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
มีอย่างน้อยสองกรณีการใช้งานที่แตกต่างกันซึ่งอาจอธิบายได้ว่า "ค้นหาถัง"
ค้นหาสิ่งที่อยู่ภายในทุกวัตถุที่เก็บไว้ที่ฝากข้อมูล นี่ถือว่าเป็นรูปแบบทั่วไปสำหรับวัตถุทั้งหมดในที่ฝากข้อมูล (พูดไฟล์ข้อความ) ฯลฯ ฯลฯ สำหรับบางสิ่งเช่นนี้คุณจะถูกบังคับให้ทำในสิ่งที่ Cody Caughlan เพิ่งตอบ เอกสาร AWS S3 มีรหัสตัวอย่างที่แสดงวิธีการใช้ AWS SDK สำหรับ Java: รายการคีย์โดยใช้ AWS SDK สำหรับ Java (ที่นั่นคุณจะพบ PHP และตัวอย่าง C #)
รายการสินค้าค้นหาบางสิ่งบางอย่างในคีย์วัตถุที่อยู่ในที่ฝากข้อมูลนั้น S3 จะมีบางส่วนที่ได้รับการสนับสนุนนี้ในรูปแบบของการอนุญาตให้ใช้คำนำหน้าแน่นอนแมตช์การแข่งขัน + ยุบหลังจากที่คั่น นี่คือคำอธิบายในรายละเอียดเพิ่มเติมได้ที่คู่มือนักพัฒนา AWS S3 สิ่งนี้ทำให้ตัวอย่างเช่นการใช้ "โฟลเดอร์" ผ่านการใช้เป็นวัตถุคีย์บางอย่างเช่น
โฟลเดอร์ / โฟลเดอร์ย่อย / file.txtหากคุณปฏิบัติตามอนุสัญญานี้ S3 GUIs ส่วนใหญ่ (เช่นคอนโซล AWS) จะแสดงมุมมองโฟลเดอร์ของที่เก็บข้อมูลของคุณ
AWS เปิดตัวบริการใหม่เพื่อสืบค้น S3 กลุ่มข้อมูลด้วย SQL: Amazon Athena https://aws.amazon.com/athena/
มีหลายตัวเลือกไม่มีวิธีแก้ไขปัญหาข้อความแบบเต็ม "one shot" อย่างง่าย:
การค้นหารูปแบบชื่อคีย์ : ค้นหาคีย์ที่เริ่มต้นด้วยสตริง - ถ้าคุณออกแบบชื่อคีย์อย่างระมัดระวังคุณอาจมีวิธีแก้ปัญหาที่ค่อนข้างรวดเร็ว
ค้นหาข้อมูลเมตาที่แนบกับคีย์ : เมื่อโพสต์ไฟล์ไปยัง AWS S3 คุณสามารถประมวลผลเนื้อหาแตกข้อมูลเมตาและแนบข้อมูลเมตานี้ในรูปแบบของส่วนหัวที่กำหนดเองลงในคีย์ สิ่งนี้ช่วยให้คุณสามารถดึงชื่อคีย์และส่วนหัวโดยไม่จำเป็นต้องดึงเนื้อหาที่สมบูรณ์ การค้นหาจะต้องทำตามลำดับไม่มีตัวเลือกการค้นหา "sql like" สำหรับสิ่งนี้ ด้วยไฟล์ขนาดใหญ่ทำให้ประหยัดเวลาและปริมาณการใช้เครือข่ายได้มาก
จัดเก็บข้อมูลเมตาบน SimpleDB : เป็นจุดก่อนหน้า แต่มีการจัดเก็บข้อมูลเมตาบน SimpleDB ที่นี่คุณมี SQL เช่นเลือกคำสั่ง ในกรณีที่ชุดข้อมูลขนาดใหญ่คุณอาจถึงขีด จำกัด SimpleDB ซึ่งสามารถเอาชนะได้ (พาร์ติชันเมตาดาต้าข้ามโดเมน SimpleDB หลายโดเมน) แต่ถ้าคุณไปไกลมากคุณอาจต้องใช้ฐานข้อมูลเมตาดาต้าชนิดอื่น
ค้นหาข้อความแบบเต็มตามลำดับของเนื้อหา - ประมวลผลปุ่มทั้งหมดทีละตัว ช้ามากถ้าคุณมีคีย์ที่ต้องดำเนินการมากเกินไป
เรากำลังจัดเก็บไฟล์ 1440 เวอร์ชันต่อวัน (หนึ่งต่อนาที) เป็นเวลาสองสามปีโดยใช้ที่ฝากข้อมูลเวอร์ชันที่เป็นไปได้อย่างง่ายดาย แต่การใช้เวอร์ชั่นที่เก่ากว่านั้นต้องใช้เวลา บางครั้งฉันใช้ดัชนี CSV แบบเรียบง่ายพร้อมระเบียนแสดงเวลาการเผยแพร่พร้อมรหัสเวอร์ชันเมื่อมีสิ่งนี้ฉันสามารถข้ามไปยังเวอร์ชันเก่ากว่าได้อย่างรวดเร็ว
อย่างที่คุณเห็น AWS S3 ไม่ได้เป็นของตัวเองที่ออกแบบมาสำหรับการค้นหาข้อความแบบเต็มมันเป็นบริการจัดเก็บข้อมูลที่เรียบง่าย
โดยตรงในมุมมองที่ฝากข้อมูล AWS Console
เมื่อคุณมีหลายพันหรือล้านไฟล์วิธีการที่จะได้รับไฟล์ที่ต้องการก็คือการคัดลอกไปยังสถานที่อื่นโดยใช้สำเนาแจกจ่าย คุณเรียกใช้สิ่งนี้บนEMRในงาน Hadoop สิ่งดีๆเกี่ยวกับ AWS ที่พวกเขาให้กำหนดเองของพวกเขารุ่น S3 S3-อ-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"
}
]
หากคุณใช้ Windows และไม่มีเวลาหาgrep
ทางเลือกที่ดีวิธีที่รวดเร็วและสกปรกก็คือ:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
จากนั้นทำการค้นหาอย่างรวดเร็วใน myfile.txt
บิต "โฟลเดอร์" เป็นตัวเลือก
ป.ล. ถ้าคุณไม่ได้ติดตั้ง AWS CLI นี่เป็นหนึ่งซับในที่ใช้ตัวจัดการแพคเกจ Chocolatey
choco install awscli
PPS ถ้าคุณไม่มีผู้จัดการแพ็คเกจ Chocolatey - รับไปเลย! ชีวิตของคุณบน Windows จะดีขึ้น 10 เท่า (ฉันไม่ได้มีส่วนเกี่ยวข้องกับ Chocolatey แต่อย่างใด แต่มันเป็นสิ่งที่ต้องมีจริงๆ)
อีกทางเลือกหนึ่งคือการทำมิเรอร์ถัง S3 บนเว็บเซิร์ฟเวอร์ของคุณและท่องไปในเครื่อง เคล็ดลับคือไฟล์โลคัลว่างเปล่าและใช้เป็นโครงกระดูกเท่านั้น อีกวิธีหนึ่งไฟล์โลคัลสามารถเก็บข้อมูลเมตาที่เป็นประโยชน์ซึ่งโดยปกติคุณจะต้องได้รับจาก S3 (เช่นขนาดไฟล์, mimetype, ผู้แต่ง, เวลาประทับ, uuid) เมื่อคุณระบุ URL เพื่อดาวน์โหลดไฟล์ให้ค้นหาในเครื่องและให้ลิงค์ไปยังที่อยู่ S3
การข้ามไฟล์ในเครื่องเป็นเรื่องง่ายและวิธีการสำหรับการจัดการ S3 นี้ไม่เชื่อเรื่องภาษา การข้ามผ่านไฟล์โลคัลยังหลีกเลี่ยงการดูแลรักษาและการเคียวรีฐานข้อมูลของไฟล์หรือความล่าช้าในการเรียกชุดรีโมต API เพื่อพิสูจน์ตัวตนและรับเนื้อหาที่ฝากข้อมูล
คุณสามารถอนุญาตให้ผู้ใช้อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ของคุณโดยตรงผ่าน FTP หรือ HTTP จากนั้นถ่ายโอนชุดของไฟล์ใหม่และที่อัปเดตไปยังอเมซอนในช่วงเวลาเร่งด่วนโดยเพียงแค่เรียกใช้ซ้ำไดเรกทอรีสำหรับไฟล์ทุกขนาด เมื่อการถ่ายโอนไฟล์ไปยัง Amazon เสร็จสิ้นให้แทนที่ไฟล์เว็บเซิร์ฟเวอร์ด้วยชื่อเดียวที่ว่างเปล่า หากไฟล์โลคัลมีขนาดไฟล์ใด ๆ ให้บริการไฟล์โดยตรงเพราะกำลังรอการถ่ายโอนแบตช์
วิธีที่ฉันทำคือฉันมีไฟล์หลายพันไฟล์ใน s3 ฉันเห็นแผงคุณสมบัติของหนึ่งไฟล์ในรายการ คุณสามารถดู URI ของไฟล์นั้นและฉันคัดลอกวางไปยังเบราว์เซอร์ - มันเป็นไฟล์ข้อความและแสดงผลได้ดี ตอนนี้ฉันแทนที่ 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 s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv
เอาต์พุตนี้พา ธ จริงที่มีไฟล์อยู่
2019-04-05 01:18:35 111111 folder1/2019/03/20/filename.csv
นี่เป็นข้อความเก่า ๆ เล็กน้อย - แต่อาจช่วยคนที่ยังค้นหา - ฉันเป็นคนที่ค้นหาปี
วิธีแก้ไขอาจเป็น " AWS Athena " ที่คุณสามารถค้นหาข้อมูลเช่นนี้
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
การกำหนดราคาปัจจุบันคือ5 ดอลลาร์สำหรับข้อมูล 1TB - ตัวอย่างเช่นหากคำค้นหาของคุณมากกว่าหนึ่งไฟล์ 1TB 3 ครั้งต้นทุนของคุณคือ $ 15 - แต่ตัวอย่างเช่นถ้ามีเพียง 1 คอลัมน์ใน "รูปแบบคอลัมน์ที่แปลงแล้ว" สิ่งที่คุณต้องการอ่าน / 3 ของราคาหมายถึง $ 1.67 / TB
ดูเอกสารนี้: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
คุณสามารถใช้นิพจน์ปกติที่เข้ากันได้กับ Perl (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
}
สำหรับที่เก็บขนาดใหญ่การใช้เวลามากเกินไปเนื่องจากสรุปวัตถุทั้งหมดจะถูกส่งคืนโดย Aws และไม่เพียง แต่ที่ตรงกับคำนำหน้าและตัวคั่นเท่านั้น ฉันกำลังมองหาวิธีในการปรับปรุงประสิทธิภาพและจนถึงตอนนี้ฉันเพิ่งพบว่าฉันควรตั้งชื่อคีย์และจัดระเบียบมันในที่เก็บอย่างถูกต้อง
ฉันประสบปัญหาเดียวกัน การค้นหาใน S3 ควรง่ายกว่าสถานการณ์ปัจจุบันมากขึ้น นั่นเป็นเหตุผลที่ฉันใช้เครื่องมือโอเพนซอร์ซนี้เพื่อค้นหาใน S3
SSEARCHเป็นเครื่องมือค้นหา S3 แบบโอเพ่นซอร์สแบบเต็ม มันถูกนำมาใช้เสมอทำให้ทราบว่าประสิทธิภาพเป็นปัจจัยสำคัญและตามมาตรฐานนั้นจะค้นหาที่ฝากข้อมูลที่มี ~ 1,000 ไฟล์ภายในไม่กี่วินาที
ติดตั้งง่าย คุณดาวน์โหลดเฉพาะไฟล์นักเทียบท่าและรันด้วย
docker-compose up
SSEARCH จะเริ่มขึ้นและคุณสามารถค้นหาอะไรก็ได้ในที่เก็บข้อมูลใด ๆ ที่คุณมี
กรอไปข้างหน้าอย่างรวดเร็วถึงปี 2020 และการใช้ aws-okta เป็น 2fa ของเราคำสั่งต่อไปนี้ในขณะที่ช้าเหมือนนรกในการย้ำผ่านวัตถุและโฟลเดอร์ทั้งหมดในที่เก็บข้อมูลชุดนี้ (+270,000) ทำงานได้ดี
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
ใช้ Amazon Athena เพื่อสอบถาม S3 bucket นอกจากนี้โหลดข้อมูลไปยังการค้นหาของ Amazon ยืดหยุ่น หวังว่านี่จะช่วยได้
ไม่ใช่คำตอบทางเทคนิค แต่ฉันได้สร้างแอปพลิเคชันที่อนุญาตให้ค้นหาไวด์การ์ด: https://bucketsearch.net/
มันจะทำดัชนีแบบไม่ประสานกันในที่เก็บข้อมูลของคุณแล้วให้คุณค้นหาผลลัพธ์
ใช้งานได้ฟรี (donationware)
สถานะ 2018-07: อเมซอนจะมี SQL Native เช่นการค้นหาสำหรับ CSV และ JSON ไฟล์!