

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menyalin data antara DynamoDB dan HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS"></a>

Jika memiliki data di tabel DynamoDB, Anda dapat menggunakan Hive untuk menyalin data ke Hadoop Distributed File System (HDFS).

Anda dapat melakukan ini jika Anda menjalankan MapReduce pekerjaan yang membutuhkan data dari DynamoDB. Jika Anda menyalin data dari DynamoDB ke HDFS, Hadoop dapat memprosesnya, menggunakan semua simpul yang tersedia di klaster Amazon EMR secara paralel. Ketika MapReduce pekerjaan selesai, Anda kemudian dapat menulis hasil dari HDFS ke DDB.

Dalam contoh berikut, Hive akan membaca dari dan menulis ke direktori HDFS berikut: `/user/hadoop/hive-test`

**catatan**  
Contoh di bagian ini ditulis dengan asumsi Anda mengikuti langkah-langkah di [Tutorial: Menggunakan Amazon DynamoDB dan Apache Hive](EMRforDynamoDB.Tutorial.md) dan memiliki tabel eksternal di DynamoDB bernama *ddb\_features*. 

**Topics**
+ [Menyalin data menggunakan format default Hive](#EMRforDynamoDB.CopyingData.HDFS.DefaultFormat)
+ [Menyalin data dengan format yang ditentukan pengguna](#EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat)
+ [Menyalin data tanpa pemetaan kolom](#EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping)
+ [Mengakses data di HDFS](#EMRforDynamoDB.CopyingData.HDFS.ViewingData)

## Menyalin data menggunakan format default Hive
<a name="EMRforDynamoDB.CopyingData.HDFS.DefaultFormat"></a>

**Example Dari DynamoDB ke HDFS**  
Gunakan pernyataan `INSERT OVERWRITE` untuk menulis langsung ke HDFS.  

```
INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test'
SELECT * FROM ddb_features;
```
File data di HDFS tampak seperti ini:  

```
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
```
Setiap bidang dipisahkan oleh karakter SOH (awal mulai, 0x01). Di file, SOH muncul sebagai **^A**.

**Example Dari HDFS ke DynamoDB**  

1. Buat tabel eksternal yang memetakan data yang tidak diformat di HDFS.

   ```
   CREATE EXTERNAL TABLE hdfs_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 'hdfs:///user/hadoop/hive-test';
   ```

1. Salin data ke DynamoDB.

   ```
   INSERT OVERWRITE TABLE ddb_features
   SELECT * FROM hdfs_features_unformatted;
   ```

## Menyalin data dengan format yang ditentukan pengguna
<a name="EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat"></a>

Jika ingin menggunakan karakter pemisah bidang lain, Anda dapat membuat tabel eksternal yang dipetakan ke direktori HDFS. Anda dapat menggunakan teknik ini untuk membuat file data dengan nilai yang dipisahkan oleh koma (CSV).

**Example Dari DynamoDB ke HDFS**  

1. Buat tabel eksternal Hive yang dipetakan ke HDFS. Jika Anda melakukannya, pastikan jenis data konsisten dengan jenis data yang ada di tabel eksternal DynamoDB.

   ```
   CREATE EXTERNAL TABLE hdfs_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 'hdfs:///user/hadoop/hive-test';
   ```

1. Salin data dari DynamoDB.

   ```
   INSERT OVERWRITE TABLE hdfs_features_csv
   SELECT * FROM ddb_features;
   ```
File data di HDFS tampak seperti ini:  

```
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
```

**Example Dari HDFS ke DynamoDB**  
Dengan pernyataan HiveQL tunggal, Anda dapat mengisi tabel DynamoDB menggunakan data dari HDFS:  

```
INSERT OVERWRITE TABLE ddb_features
SELECT * FROM hdfs_features_csv;
```

## Menyalin data tanpa pemetaan kolom
<a name="EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping"></a>

Anda dapat menyalin data dari DynamoDB dalam format mentah dan menuliskannya ke HDFS tanpa menentukan jenis data atau pemetaan kolom. Anda dapat menggunakan metode ini untuk membuat arsip data DynamoDB dan menyimpannya di HDFS.



**catatan**  
Jika tabel DynamoDB Anda berisi atribut jenis Peta, Daftar, Boolean, atau Null, maka ini adalah satu-satunya cara Anda dapat menggunakan Hive untuk menyalin data dari DynamoDB ke HDFS.

**Example Dari DynamoDB ke HDFS**  

1. Buat tabel eksternal yang terkait dengan tabel DynamoDB Anda. (Tidak ada `dynamodb.column.mapping` dalam pernyataan HiveQL ini.)

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

   

1. Buat tabel eksternal lain yang terkait dengan direktori HDFS Anda.

   ```
   CREATE EXTERNAL TABLE hdfs_features_no_mapping
       (item MAP<STRING, STRING>)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
   LINES TERMINATED BY '\n'
   LOCATION 'hdfs:///user/hadoop/hive-test';
   ```

1. Salin data dari DynamoDB ke HDFS.

   ```
   INSERT OVERWRITE TABLE hdfs_features_no_mapping
   SELECT * FROM ddb_features_no_mapping;
   ```
File data di HDFS tampak seperti ini:  

```
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"}
```
Setiap bidang diawali dengan karakter STX (awal teks, 0x02) dan diakhiri dengan karakter ETX (akhir teks, 0x03). Dalam file tersebut, STX muncul sebagai **^B** dan ETX muncul sebagai **^C**.

**Example Dari HDFS ke DynamoDB**  
Dengan pernyataan HiveQL tunggal, Anda dapat mengisi tabel DynamoDB menggunakan data dari HDFS:  

```
INSERT OVERWRITE TABLE ddb_features_no_mapping
SELECT * FROM hdfs_features_no_mapping;
```

## Mengakses data di HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS.ViewingData"></a>

HDFS adalah sistem file terdistribusi, dapat diakses oleh semua simpul dalam klaster Amazon EMR. Jika menggunakan SSH untuk menghubungkan ke simpul pemimpin, Anda dapat menggunakan alat baris perintah untuk mengakses data yang ditulis Hive ke HDFS.

HDFS tidak sama dengan sistem file lokal di simpul pemimpin. Anda tidak dapat menggunakan file dan direktori di HDFS menggunakan perintah Linux standar (seperti `cat`, `cp`, `mv`, atau `rm`). Sebaliknya, Anda melakukan tugas-tugas ini menggunakan perintah `hadoop fs`.

Langkah-langkah berikut ditulis dengan asumsi Anda telah menyalin data dari DynamoDB ke HDFS menggunakan salah satu prosedur di bagian ini.

1. Jika saat ini Anda berada di prompt perintah Hive, keluarlah ke prompt perintah Linux.

   ```
   hive> exit;
   ```

1. Buat daftar isi direktori/user/hadoop/hive-test di HDFS. (Di sinilah Hive menyalin data dari DynamoDB.)

   ```
   hadoop fs -ls /user/hadoop/hive-test
   ```

   Responsnya akan tampak mirip dengan ini:

   ```
   Found 1 items
   -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0
   ```

   Nama file (*000000\_0*) dihasilkan sistem.

1. Lihat konten file:

   ```
   hadoop fs -cat /user/hadoop/hive-test/000000_0
   ```
**catatan**  
Dalam contoh ini, file relatif kecil (sekitar 29 KB). Hati-hati saat Anda menggunakan perintah ini dengan file yang sangat besar atau berisi karakter yang tidak dapat dicetak.

1. (Opsional) Anda dapat menyalin file data dari HDFS ke sistem file lokal di simpul pemimpin. Setelah melakukannya, Anda dapat menggunakan utilitas baris perintah Linux standar untuk menggunakan data dalam file.

   ```
   hadoop fs -get /user/hadoop/hive-test/000000_0
   ```

   Perintah ini tidak akan menimpa file.
**catatan**  
Kapasitas sistem file lokal di simpul pemimpin terbatas. Jangan gunakan perintah ini dengan file yang lebih besar dari ruang yang tersedia di sistem file lokal.