1、在E-MapReduce上创建基于OSS的Hive外部表样例:
2、Hadoop新模式:计算存储分离
部署一个集群大体上可以分为两类:混合部署和分离部署。混合部署指的是计算和数据存储部署在一个集群中;分离部署指的是计算和数据存储分别部署在不同的集群中。
早期将HDFS和Hadoop部署在一起时,可以利用数据本地化特性来提升作业性能。但目前看来,“数据本地化(data locality)”的概念已过时。在许多Hadoop场景中,即使计算和数据存储部署在一个集群,Hadoop作业也无法受益于数据本地化。然而将计算和存储分开可以简化操作,用户可以分别扩展和管理计算和存储系统。
对于计算和存储来说,所需要的机器类型也是不一样的。对于HDFS来说,你可能需要更大的磁盘空间;对于Hadoop/Spark来说你可能需要更多的CPU和更大的内存。针对HDFS和Hadoop/Spark选择合适的机型,可以让集群发挥更大的能力。
从集群扩展角度来说,随着业务的发展,集群的规模常常不能满足业务的需求。也许是数据规模超过了集群存储能力,也许是业务上对数据产出的周期提出新的要求导致计算能力跟不上。这就要求我们能随时应对集群存储空间不足或者计算能力不足的挑战。将计算和存储分离,可能更好地应对单方面的不足。如果将计算和存储混合部署,常常会因为为了扩存储而带来额外的计算扩容,这其实就是一种浪费;同理,只为了提升计算能力,也会带来一段时期的存储浪费。
E-MapReduce的一个很大的特性是按需创建集群,也就是需要处理数据时才去创建集群,用完即可销毁。这种模式很适合那些只需要每天定时离线处理的场景,例如产出每天报表等等。但是,这种模式也带来一个要求,集群不能存放数据,否则集群释放后数据也就丢失。这就给那些希望用集群来存放数据的用户带来麻烦。计算和存储分离可以很好地解决这个问题,你只需要保证存储集群长期运行即可,计算集群可以随时使用随时创建,增加使用的灵活性。
所以, 合适的方案是在OSS中存储冷数据,E-MR上确保充足的计算能力和必要的小量数据存储。
3、计算存储分离代码实例
使用Hive来处理保存在OSS上的数据源,并通过E-MapReduce计算,最终的结果保存在OSS上。
hive> show create table oss_share_feedback;
OK
CREATE EXTERNAL TABLE `oss_share_feedback`(
`uid` string,
`os` string,
`source_id` string,
`type` string,
`target_key` string,
`created_time` string,
`updated_time` string)
PARTITIONED BY (
`pt_month` string,
`pt_day` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'='\t',
'line.delim'='\n',
'serialization.format'='\t')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'oss://{AccessKeyId}:{AccessKeySecret}@{bucket}.{endpoint}/hive/oss_share_feedback'
TBLPROPERTIES (
'transient_lastDdlTime'='1495603307')
Time taken: 0.141 seconds, Fetched: 25 row(s)
2、Hadoop新模式:计算存储分离
部署一个集群大体上可以分为两类:混合部署和分离部署。混合部署指的是计算和数据存储部署在一个集群中;分离部署指的是计算和数据存储分别部署在不同的集群中。
早期将HDFS和Hadoop部署在一起时,可以利用数据本地化特性来提升作业性能。但目前看来,“数据本地化(data locality)”的概念已过时。在许多Hadoop场景中,即使计算和数据存储部署在一个集群,Hadoop作业也无法受益于数据本地化。然而将计算和存储分开可以简化操作,用户可以分别扩展和管理计算和存储系统。
对于计算和存储来说,所需要的机器类型也是不一样的。对于HDFS来说,你可能需要更大的磁盘空间;对于Hadoop/Spark来说你可能需要更多的CPU和更大的内存。针对HDFS和Hadoop/Spark选择合适的机型,可以让集群发挥更大的能力。
从集群扩展角度来说,随着业务的发展,集群的规模常常不能满足业务的需求。也许是数据规模超过了集群存储能力,也许是业务上对数据产出的周期提出新的要求导致计算能力跟不上。这就要求我们能随时应对集群存储空间不足或者计算能力不足的挑战。将计算和存储分离,可能更好地应对单方面的不足。如果将计算和存储混合部署,常常会因为为了扩存储而带来额外的计算扩容,这其实就是一种浪费;同理,只为了提升计算能力,也会带来一段时期的存储浪费。
E-MapReduce的一个很大的特性是按需创建集群,也就是需要处理数据时才去创建集群,用完即可销毁。这种模式很适合那些只需要每天定时离线处理的场景,例如产出每天报表等等。但是,这种模式也带来一个要求,集群不能存放数据,否则集群释放后数据也就丢失。这就给那些希望用集群来存放数据的用户带来麻烦。计算和存储分离可以很好地解决这个问题,你只需要保证存储集群长期运行即可,计算集群可以随时使用随时创建,增加使用的灵活性。
所以, 合适的方案是在OSS中存储冷数据,E-MR上确保充足的计算能力和必要的小量数据存储。
3、计算存储分离代码实例
使用Hive来处理保存在OSS上的数据源,并通过E-MapReduce计算,最终的结果保存在OSS上。
CREATE EXTERNAL TABLE logoss (logcontent string) partitioned by (year string, month string, day string) stored AS textfile location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path';
ALTER TABLE logoss ADD PARTITION (year='2016', month='05', day='31') location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path/2016/05/31' PARTITION (year='2016', month='06', day='01') location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path/2016/06/01' PARTITION (year='2016', month='06', day='02') location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path/2016/06/02' PARTITION (year='2016', month='06', day='03') location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path/2016/06/03';
select * from logoss limit 100;
CREATE TABLE loghdfs (id string, content string, ip string, oridate string) partitioned by (year string, month string, day string) stored AS textfile;
INSERT OVERWRITE TABLE loghdfs PARTITION (year='2016', month='05', day='31') IF NOT EXISTS select split(logcontent,'\\|')[0] as id, split(logcontent,'\\|')[1] as content, split(logcontent,'\\|')[2] as ip, split(logcontent,'\\|')[3] as oridate FROM logoss;
CREATE TABLE userip as select ip, count(id) from loghdfs group by ip;
CREATE EXTERNAL TABLE resultoss (ip string, count int) partitioned by (year string, month string, day string) stored AS textfile location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path';
INSERT OVERWRITE TABLE resultoss PARTITION (year='2016', month='05', day='31') IF NOT EXISTS select ip, count FROM userip;