amazon-s3 - google - aws
¿Cómo se busca un cubo amazon s3? (13)
Tengo un cubo con miles de archivos. ¿Cómo puedo buscar en el cubo? ¿Hay alguna herramienta que puedas recomendar?
Buscar por prefijo en la consola S3
directamente en la vista del depósito de la consola AWS.
Copie los archivos deseados usando s3-dist-cp
Cuando tiene miles o millones de archivos, otra forma de obtener los archivos buscados es copiarlos a otra ubicación utilizando una copia distribuida . Ejecuta esto en EMR en un trabajo de Hadoop. Lo mejor de AWS es que proporcionan su versión S3 personalizada s3-dist-cp . Le permite agrupar archivos deseados usando una expresión regular en el campo groupBy. Puede usar esto, por ejemplo, en un paso personalizado en 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"
}
]
AWS lanzó un nuevo servicio para consultar buckets S3 con SQL: Amazon Athena https://aws.amazon.com/athena/
Aquí hay una forma corta y fea de hacer nombres de archivos de búsqueda usando la CLI de AWS :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Dado que estás en AWS ... creo que querrías usar sus herramientas de CloudSearch. Pon los datos que deseas buscar en su servicio ... haz que apunten a las teclas S3.
Eche un vistazo a esta documentación: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Puede usar una expresión regular compatible con Perl (PCRE) para filtrar los nombres.
Hay (al menos) dos casos de uso diferentes que podrían describirse como "buscar en el cubo":
Busque algo dentro de cada objeto almacenado en el cubo; esto supone un formato común para todos los objetos en ese cubo (por ejemplo, archivos de texto), etc. Para algo como esto, estás obligado a hacer lo que Cody Caughlan acaba de responder. AWS S3 docs tiene un código de ejemplo que muestra cómo hacerlo con AWS SDK for Java: Listado de claves utilizando AWS SDK para Java (allí también encontrará ejemplos de PHP y C #).
Elemento de la lista Buscar algo en las claves de objetos que figuran en ese depósito; S3 tiene soporte parcial para esto, en la forma de permitir el prefijo de coincidencias exactas + colapso de coincidencias después de un delimitador. Esto se explica con más detalle en AWS S3 Developer Guide . Esto permite, por ejemplo, implementar "carpetas" mediante el uso de teclas de objeto algo así como
folder/subfolder/file.txt Si sigue esta convención, la mayoría de las GUI de S3 (como la consola de AWS) le mostrarán una vista de carpeta de su depósito.
Hay múltiples opciones, ninguna de ellas es una simple solución de texto completo "one shot":
Búsqueda de patrón de nombre de clave : Búsqueda de claves que comienzan con una cadena: si diseña cuidadosamente los nombres de clave, entonces puede tener una solución bastante rápida.
Buscar metadatos adjuntos a las claves : al publicar un archivo en AWS S3, puede procesar el contenido, extraer cierta metainformación y adjuntar esta metainformación en forma de encabezados personalizados a la clave. Esto le permite buscar nombres de teclas y encabezados sin necesidad de buscar contenido completo. La búsqueda tiene que hacerse de forma secuencial, no hay una opción de búsqueda "sql like" para esto. Con archivos grandes, esto podría ahorrar mucho tráfico de red y tiempo.
Almacene los metadatos en SimpleDB : como punto anterior, pero con el almacenamiento de los metadatos en SimpleDB. Aquí tiene sql como select statements. En el caso de grandes conjuntos de datos, puede llegar a los límites de SimpleDB, que pueden superarse (metadatos de partición en múltiples dominios SimpleDB), pero si va demasiado lejos, es posible que deba utilizar otro tipo de base de datos metedata.
Búsqueda secuencial de texto completo del contenido - procesando todas las claves una por una. Muy lento, si tiene demasiadas claves para procesar.
Estamos almacenando 1440 versiones de un archivo por día (una por minuto) durante un par de años, usando un cubo versionado, es muy posible. Pero obtener una versión más antigua lleva tiempo, ya que uno tiene que ir de forma secuencial versión por versión. En algún momento utilizo un índice simple de CSV con registros, mostrando el tiempo de publicación más la identificación de la versión, teniendo esto, podría pasar a la versión anterior bastante rápido.
Como puede ver, AWS S3 no está diseñado solo para búsquedas de texto completo, es un servicio de almacenamiento simple.
Hice algo como a continuación para encontrar patrones en mi cubo
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
}
Para las cubetas más grandes, esto consume mucho tiempo, ya que todos los resúmenes de objeto son devueltos por Aws y no solo los que coinciden con el prefijo y el delimitador. Estoy buscando maneras de mejorar el rendimiento y hasta ahora solo he descubierto que debo nombrar las claves y organizarlas en cubos correctamente.
La forma en que lo hice es: tengo miles de archivos en s3. Vi el panel de propiedades de un archivo en la lista. Puedes ver el URI de ese archivo y copiarlo pegado en el navegador, era un archivo de texto y se procesó muy bien. Ahora reemplacé el uuid en la url con el uuid que tenía a mano y aumenté allí el archivo.
Ojalá AWS tuviera una mejor manera de buscar un archivo, pero esto funcionó para mí.
Otra opción es duplicar el cubo S3 en su servidor web y recorrerlo localmente. El truco es que los archivos locales están vacíos y solo se usan como esqueleto. Alternativamente, los archivos locales podrían contener metadatos útiles que normalmente necesitaría obtener de S3 (por ejemplo, tamaño de archivo, tipo de mime, autor, marca de tiempo, uuid). Cuando proporciona una URL para descargar el archivo, busque localmente pero proporcione un enlace a la dirección S3.
El recorrido de archivos local es fácil y este enfoque para la gestión de S3 es independiente del idioma. El recorrido local de archivos también evita mantener y consultar una base de datos de archivos o retrasos al hacer una serie de llamadas API remotas para autenticar y obtener el contenido del contenedor.
Puede permitir que los usuarios carguen archivos directamente a su servidor a través de FTP o HTTP y luego transferir un lote de archivos nuevos y actualizados a Amazon en horas de menor actividad mediante la repetición de los directorios en busca de archivos de cualquier tamaño. Al completar una transferencia de archivos a Amazon, reemplace el archivo del servidor web con uno vacío del mismo nombre. Si un archivo local tiene cualquier tamaño de archivo, publíquelo directamente porque está esperando la transferencia por lotes.
Pruebe este comando:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query ''Contents[].{Key: Key}''
Luego puede canalizar esto en un grep para obtener tipos de archivos específicos para hacer lo que quiera con ellos.
Solo una nota para agregar aquí: ahora es de 3 años más tarde, sin embargo, esta publicación es superior en Google cuando escribes "Cómo buscar un Bucket S3".
Quizás estés buscando algo más complejo, pero si aterrizaste aquí tratando de descubrir cómo encontrar un objeto (archivo) por su título, es bastante simple:
abra el depósito, seleccione "ninguno" en el lado derecho y comience a escribir el nombre del archivo.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
S3 no tiene una "búsqueda en este cubo" nativa ya que el contenido real es desconocido. Además, dado que S3 está basado en clave / valor, no hay una forma nativa de acceder a muchos nodos a la vez a almacenes de datos más tradicionales que ofrecen un (SELECT * FROM ... WHERE ...)
(en un modelo de SQL).
Lo que tendrá que hacer es realizar ListBucket
para obtener una lista de objetos en el depósito y luego iterar sobre cada elemento realizando una operación personalizada que implemente, que es su búsqueda.