Copia de datos entre DynamoDB y Amazon S3 - Amazon DynamoDB

Copia de datos entre DynamoDB y Amazon S3

Si tiene datos en una tabla de DynamoDB, puede usar Hive para copiarlos en un bucket de Amazon S3.

Puede ser interesante hacerlo si desea crear un archivo de datos en la tabla de DynamoDB. Por ejemplo, supongamos que tiene un entorno de pruebas en el cual necesita trabajar con un conjunto de datos de prueba de referencia en DynamoDB. Puede copiar los datos de referencia en un bucket de Amazon S3 y, a continuación, ejecutar las pruebas. A continuación, puede restablecer el entorno de pruebas restaurando los datos de referencia del bucket de Amazon S3 en DynamoDB.

Si ha realizado el Tutorial: Uso de Amazon DynamoDB y Apache Hive, ya dispone de un bucket de Amazon S3 que contiene los registros de Amazon EMR. Puede utilizar este bucket para los ejemplos de esta sección, si conoce su ruta raíz:

  1. Abra la consola de Amazon EMR enhttps://console.aws.amazon.com/emr.

  2. En Name, elija el clúster.

  3. La URI aparece en Log URI bajo Configuration Details.

  4. Anote la ruta raíz del bucket. La convención de nomenclatura es:

    s3://aws-logs-accountID-region

    donde accountID es el ID de su cuenta de AWS y region es la región de AWS del bucket.

nota

En estos ejemplos, utilizaremos una subruta contenida en el bucket, como en este ejemplo:

s3://aws-logs-123456789012-us-west-2/hive-test

Los procedimientos siguientes se han escrito partiendo del supuesto de que ya ha llevado a cabo los pasos del tutorial y de que ya dispone de una tabla externa en DynamoDB llamada ddb_features.

Copia de datos mediante el formato predeterminado de Hive

ejemplo Desde DynamoDB a Amazon S3

Use una instrucción INSERT OVERWRITE para escribir directamente en Amazon S3.

INSERT OVERWRITE DIRECTORY 's3://aws-logs-123456789012-us-west-2/hive-test' SELECT * FROM ddb_features;

El archivo de datos de Amazon S3 tiene este aspecto:

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135 1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260 253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133 264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900 115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

Cada campo se separa por un carácter SOH (inicio del encabezado, 0x01). En el archivo, SOH aparece como ^A.

ejemplo Desde Amazon S3 a DynamoDB
  1. Cree una tabla externa que apunte a los datos sin formato de Amazon S3.

    CREATE EXTERNAL TABLE s3_features_unformatted (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. Copie los datos en DynamoDB.

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_unformatted;

Copia de datos con un formato especificado por el usuario

Si desea especificar su propio carácter separador de campos, puede crear una tabla externa que esté mapeada al bucket de Amazon S3. Puede utilizar esta técnica para crear archivos de datos con valores separados por comas (CSV).

ejemplo Desde DynamoDB a Amazon S3
  1. Cree una tabla de Hive externa mapeada a Amazon S3. Al hacerlo, asegúrese de que los tipos de datos sean coherentes con los de la tabla de DynamoDB externa.

    CREATE EXTERNAL TABLE s3_features_csv (feature_id BIGINT, feature_name STRING, feature_class STRING, state_alpha STRING, prim_lat_dec DOUBLE, prim_long_dec DOUBLE, elev_in_ft BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. Copie los datos de DynamoDB.

    INSERT OVERWRITE TABLE s3_features_csv SELECT * FROM ddb_features;

El archivo de datos de Amazon S3 tiene este aspecto:

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135 1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260 253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133 264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900 115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
ejemplo Desde Amazon S3 a DynamoDB

Con una sola instrucción de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon S3:

INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_csv;

Copia de datos sin mapeo de columnas

Puede copiar datos de DynamoDB en formato sin procesar y escribirlos en Amazon S3 sin especificar ningún tipo de datos ni mapeo de columnas. Puede utilizar este método para crear un archivo comprimido de los datos de DynamoDB y almacenarlos en Amazon S3.

ejemplo Desde DynamoDB a Amazon S3
  1. Cree una tabla externa asociada con la tabla de DynamoDB. Esta instrucción de HiveQL no contiene ningún mapeo dynamodb.column.mapping.

    CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");

  2. Cree otra tabla externa asociada con el bucket de Amazon S3.

    CREATE EXTERNAL TABLE s3_features_no_mapping (item MAP<STRING, STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  3. Copie los datos de DynamoDB a Amazon S3.

    INSERT OVERWRITE TABLE s3_features_no_mapping SELECT * FROM ddb_features_no_mapping;

El archivo de datos de Amazon S3 tiene este aspecto:

Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"} Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"} Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"} Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"} Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}

Cada campo comienza por un carácter STX (inicio del texto, 0x02) y termina con un carácter ETX (final del texto, 0x03). En el archivo, STX aparece como ^B y ETX aparece como ^C.

ejemplo Desde Amazon S3 a DynamoDB

Con una sola instrucción de HiveQL, puede rellenar la tabla de DynamoDB usando los datos de Amazon S3:

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM s3_features_no_mapping;

Visualización de datos en Amazon S3

Si usa SSH para conectarse al nodo líder, puede usar la AWS Command Line Interface (AWS CLI) para acceder a los datos que Hive escribió en Amazon S3.

Los siguientes pasos se han escrito partiendo del supuesto de que ha copiado los datos de DynamoDB a Amazon S3 por medio de uno de los procedimientos de esta sección.

  1. Si tiene abierto el símbolo del sistema de Hive, salga y cambie al símbolo del sistema de Linux.

    hive> exit;
  2. Muestre el contenido del directorio hive-test en el bucket de Amazon S3. (Aquí es donde Hive ha copiado los datos de DynamoDB).

    aws s3 ls s3://aws-logs-123456789012-us-west-2/hive-test/

    El aspecto de la respuesta debe ser parecido al siguiente:

    2016-11-01 23:19:54 81983 000000_0

    El nombre de archivo (000000_0) lo genera el sistema.

  3. (Opcional) Puede copiar el archivo de datos de Amazon S3 al sistema de archivos local en el nodo líder. Después de hacerlo, puede utilizar las utilidades estándar de la línea de comandos de Linux para trabajar con los datos del archivo.

    aws s3 cp s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 .

    El aspecto de la respuesta debe ser parecido al siguiente:

    download: s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 to ./000000_0

    nota

    El sistema de archivos local del nodo líder tiene una capacidad limitada. No utilice este comando con archivos más grandes que el espacio disponible en el sistema de archivos local.