使用Hive进行OSS数据处理的一个最佳实践

本文主要介绍如何使用Hive来处理保存在OSS上的数据源,并通过E-MapReduce计算,最终的结果保存在OSS上,并能够每天自动的进行Hive的分区数据的调度

处理条件:

数据源:我们假设在OSS上我们的数据是按照一定的目录格式来保存的,比如时间,按照类似2016/06/01这样的年/月/日的方式存放。而原始数据内容都是一些非格式化的数据,完全没有经过处理。
类似如下的一个格式:

123|service control exceed 100. others content|192.168.0.1|2016-05-31

结果数据:我们需要把每个目录下的数据经过处理,写到OSS上类似2016/06/01的一个结果目录下

处理过程:

创建元数据表

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';

通过这一步,我们有了一张Hive的分区表,Hive只是在它的元数据库中记录了这个表的信息,这个时候还没有数据的处理。而数据也还在我们的OSS上躺着。

接着把需要的分区都加入到表中,这里我假设我们有很多个分区

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数据看一下,执行如下

select * from logoss limit 100;

我们就会看到我们的分区中的内容了。

处理原始数据

我们要把原来OSS上的原始数据,经过处理然后写到一个HDFS上的表,然后用这个HDFS的表进行后续的一系列处理。这里把所有的中间步骤都在HDFS上走,这样速度会快很多。

首先建立一个基于HDFS的Hive表,目前数据也还是空

CREATE TABLE loghdfs (id string, content string, ip string, oridate string) partitioned by (year string, month string, day string) stored AS textfile;

然后将OSS的数据进行处理并写入到HDFS的表中,这里我们使用IF NOT EXISTS,为了防止这个分区已经存在被我们覆盖掉,如果你希望数据直接覆盖,可以去掉这个条件判断。

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;

业务处理

好了,到了这一步,我们就已经有了一个hdfs上的表了,我们可以对这个表进行任意的后续处理,
比如groupby 所有的ip,然后看他们的总数值

CREATE TABLE userip as select ip, count(id) from loghdfs group by ip;

中间可以进行类似的各种操作,由你的业务决定。
当所有的操作都完成以后,如果要把数据写到OSS上,那么来到最后一步

写回OSS

首先我们会创建一个对应OSS路径的Hive表,与第一步很类似

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;

这样我们的结果数据就写到了OSS上对应的目录下,类似这样的路径

/path/year=2016/month=05/day=31/

如何自动化

看了上面的这个过程,会发现这中间这个时间的分区需要我们手工写在里面,实在是太麻烦了,完全没有办法自动跑啊,那么下面我们就来更加进化一下。

job上配置自动时间

我们首先在E-MapReduce控制台上编辑的时候使用hivevar来指定时间变量,如下

-hivevar year='2016' -hivevar month='05' -hivevar day='31' -f ossref://mypath/job.hql

然后,我们需要把这个里面的常量变成每天自动变化的时间,我们使用E-MapReduce提供的时间变量
如下

-hivevar year=' ${yyyy-1d}' -hivevar month=' ${MM-1d}' -hivevar day=' ${dd-1d}' -f ossref://mypath/job.hql

时间配置的说明请参考这里

完整的作业配置及代码

现在我们看看修改完成以后的完整的代码,中间的分区时间都是用变量进行了替换

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='${hivevar:year}', month='${hivevar:month}', day='${hivevar:day}') location 'oss://akid:aksecret@bucket.oss-cn-hangzhou-internal.aliyuncs.com/path/${hivevar:year}/${hivevar:month}/${hivevar:day}';

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='${hivevar:year}', month='${hivevar:month}', day='${hivevar:day}') 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) as count 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/outpath/';

INSERT OVERWRITE TABLE resultoss PARTITION (year='${hivevar:year}', month='${hivevar:month}', day='${hivevar:day}') IF NOT EXISTS select ip, count FROM userip;

然后你可以把这个作业加到一个周期执行的执行计划中,每天运行一次,就可以完全的自动每天跑数据啦。

时间: 2024-08-29 17:26:39

使用Hive进行OSS数据处理的一个最佳实践的相关文章

还是这里人气多,求一个最佳实践

问题描述 sliverlight和WCF之间的数据通信,你们有什么最佳实践么??我的情况:目前因为sliverlight不支持System.Data,所以我在WCF端用json序列化后写到内存流,然后转换成byte数组了,然后sliverlight端再转换回来,不想这么多的操作.我的WCF端不允许多操作,也就是说WCF端不允许传递泛型集合回来--仅仅提供最简单的数据库操作,泛型集合在sliverlight端进行构造.由于是全自学,没有sliverlight的经验,大家是这么搞的和WCF通信的呢?

用OSGi应用程序开发和工作的最佳实践

简介 OSGi 模块性提供了标准机制来以 Java 应用程序应对共同挑战.在 2007 年 ,OSGi Alliance Enterprise Expert Group (EEG) 成立,以一个业务 Java 编 程模型的形式向业务应用程序开发人员引入 OSGi 基础设施.OSGi 应用程序和 IBM WebSphere Application Server 企业级服务质量共同为模块化 Web 应用程 序提供最完整和最健壮的业务服务器.您可以使用 WebSphere Application Se

MaxCompute多团队协同数据开发项目管理最佳实践

MaxCompute多项目管理最佳实践 背景介绍: 厦门美柚科技有限公司,创始于2013年4月,是一家专注为女性服务的互联网公司.秉承"让女人更美更健康"的理念,美柚以经期管理为切入点,为女性提供备孕.怀孕.育儿.社区交流等功能服务.目前,美柚用户超过1亿,日活跃用户近千万,拥有约160个高活跃的女性话题圈,社区内用户日均互动量超500万帖,日均浏览量超过1.8亿次.之前各种数据开发.数据支持.数据挖掘都在同一个项目中,随着公司业务线的不断扩充,规模的不断壮大,参与大数据开发的部门(团

Javascript 初学者应知的 24 条最佳实践

1. 优先使用 ===,而不是 == JavaScript 使用两种相等性操作符:===,!==和==,!=.通常认为做比较的最佳实践是使用前一组操作符. "若两个操作数的类型和值相同,那么===比较的结果为真,!==比较的结果为假." --- JavaScript语言精粹(JavaScript: The Good Parts) 然而,如果使用==和!=,当比较不同类型的操作数时,你就会碰到问题啦.在这种情况下,这组操作符会尝试对操作数的值做无用的强制转换. 2. Eval 就是糟糕的

数据统计-数据处理问题:发现最佳模数

问题描述 数据处理问题:发现最佳模数 发现最佳模数(有一组大整数N1, N2, - Nx和一个较小的整数M,要求找出一个不超过M的整数P,使所有大整数对P的模皆不重复.继而再问如何找到符合以上要求的最小的P. 请问大家有什么好的方法或者思路,可以比较快速的解决这个问题,谢谢! 解决方案 首先(N1,n2.....Nx)的数都不相同,然后选其中最大的数MaxN做除数,那么所有的模都不相同,这步不用做,只是说明数理.然后,如果这个最大数是奇数,加1,然后除以2得到的数(向上取整),作为除数.如果模有

【OSS 最佳实践】JS SDK使用STS方式实现断点续传

OSS提供JS SDK方式可以让用户直接在前端页面中嵌入js包直接操作OSS,但是该方式操作OSS最容易出现的问题即是AccessKeyId和AccessKeySecret的泄露导致被恶意访问的情况.因此提供了STS的方式动态获取token操作OSS,随之而来带来了整个业务逻辑的复杂度.今天在这里给大家介绍STS方式进行断点续传的实践方法. 基本概念 1. OSS Javascript SDK OSS提供了海量.安全.低成本.高可靠的云存储服务,因此该产品最基本的功能即是实现将客户端的资源上传至

帮助您在云设备中安装一个恰当配置的应用程序最佳实践

将应用程序部署到云中的一个常见场景是一个拥有非云软件的场景,您想要将这些非云软件集成到已在云中运行的软件中,要做到这一点,有几个特性需要计划(如果您仍在修复有问题的应用程序)或集成(如果应用程序已存在).在本文中,作者提供了 18 个最佳实践,确保您的应用程序可以轻松地集成到另一个云产品中,轻松地集成到另一个云设备中,或作为一个独立设备托管在云中. 本文提供几个设计和打包应用程序到云环境中的最佳实践,这样此应用程序就可以: 集成到另一个云产品中,以便其他产品利用其功能. 集成到一个已在云中托管的

PgSQL · 最佳实践 · 双十一数据运营平台订单Feed数据洪流实时分析方案

摘要 2017年的双十一又一次刷新了记录,交易创建峰值32.5万笔/秒.支付峰值25.6万笔/秒.而这样的交易和支付等记录,都会形成实时订单Feed数据流,汇入数据运营平台的主动服务系统中去. 数据运营平台的主动服务,根据这些合并后的数据,实时的进行分析,进行实时的舆情展示,实时的找出需要主动服务的对象等,实现一个智能化的服务运营平台. 通过阿里云RDS PostgreSQL和HybridDB for PGSQL实时分析方案: - 承受住了几十万笔/s的写入吞吐并做数据清洗,是交易的数倍 - 实

HybridDB · 最佳实践 · 阿里云数据库PetaData

前言 随着互联网DT时代的高速发展,业界需要简单高效的数据处理方式在海量数据中挖掘价值,企业厂商和开源界目前较流行的的做法,是提供支持类SQL接口的数据库服务,或者是提供SDK接口的数据处理平台服务. 在SQL接口的数据库服务中,传统的关系数据库,如MySQL.PG等,处理海量数据显得越来越力不从心,既无法突破单机硬件资源限制,又无法并行利用多机硬件资源:大数据NewSQL数据库,必须依赖外部数据库保证数据的事务特性,并通过数据导入工具将完整提交的数据导入进来计算,系统复杂度和成本较高. 在SD