EMR+DynamoDB+Hive 15分钟入门

amazon emr 相当于一个已经安装配置好的 Hadoop 集群。所有在普通Hadoop集群上能做的事情在 emr 上面基本都能做。
DynamoDB 是一个 k-v 的 no-sql 数据库。它的特点主要是使用了 SSD 进行存储,所以对于一般的请求一般在 10ms 就可以完成了,而且
请求的速度不会随着数据量的增加而缓慢。

Amazon 把 emr 和 Dynamodb 进行了深度的整合。可以在 EMR 上 调用 DynamoDB 的数据进行 map reduce 的计算,然后可以把计算结果
保存到 S3 或者 DHFS,通过这种方法也可以对 DynamoDB 进行备份。
DynamoDB 的缺点也很明显。最大的两个是不支持多个 index, 另一个是价格太贵,毕竟使用了 SSD.

那么我们使用了这样的一个解决方案: 用 emr 来对 dynamodb 的数据进行 map reduce, 然后把结果保存到 mysql 里。
我们通过一个例子来看这整个一个过程。

首先我们假设我们有一张 dynamodb 的表。
emr 提供了一个界面可以让我们手动的去启动一个 job flow。

整个过程如下:
1. 加载 DynamoDB 的数据到 HDFS,
2. 使用 hive 来进行 map reduce,
3. 把结果保存到 s3 或者 HDFS,
4. 用 sqoop 把结果映射到 mysql.


1. 
CREATE EXTERNAL TABLE orders_ddb_2012_01 ( order_id string, customer_id string, order_date bigint, total double )
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES (
"dynamodb.table.name" = "Orders-2012-01", "dynamodb.column.mapping" = "order_id:Order ID,customer_id:Customer ID,order_date:Order Date,total:Total");

2. 
SELECT customer_id, sum(total) spend, count(*) order_count FROM orders_ddb_2012_01 
WHERE order_date >= unix_timestamp('2012-01-01', 'yyyy-MM-dd')
AND order_date < unix_timestamp('2012-01-08', 'yyyy-MM-dd')
GROUP BY customer_id
ORDER BY spend desc
LIMIT 5 ;

3. 
CREATE EXTERNAL TABLE orders_s3_new_export ( order_id string, customer_id string, order_date int, total double )
PARTITIONED BY (year string, month string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://YOUR BUCKET';
INSERT OVERWRITE TABLE orders_s3_new_export
PARTITION (year='2012', month='01')
SELECT * from orders_ddb_2012_01;

4.
./sqoop-1.4.1-incubating__hadoop-0.20/bin/sqoop export --connect jdbc:mysql://<MYSQL_HOST>/<DATABASE_NAME> --table <TABLE_NAME> --export-dir <HDFS_PATH> --fields-terminated-by , --input-null-non-string '\\N' --username <USERNAME> --password <PASSWORD>

诸多细节在此没有阐明,大家可以去仔细研读下 Amazon 的文档。

你可能感兴趣的:(hadoop,hive,NoSQL,Amazon)