集群182个节点,一天的数据量20亿条,查询网站一天的流量数据:uv、pv、ip、cookie、onlinetime,其中uv、ip、cookie 需要distinct去重。reduce到达99%的时候,就卡死了,由于多个distinct 加上数据倾斜造成的。
优化之前的sql:
select sum(case when d.pv_flag=1 then 1 else 0 end) as pv,count(distinct id) as uv,count(distinct ip) as ip,sum(d.otime),count(distinct cookie),'$STA_TYPE', '$STA_TYPE' from access_dap d where log_date='$YESTERDAY' ;
优化之后的sql:
1.去重汇总
2.以空间换时间,借用union all的把数据根据distinct的字段扩充起来,假如有8个distinct,相当于数据扩充8倍,用rownumber=1来达到间接去重的目的,如果这里不计算整体pv的话,可以直接进行Group by效果一样。这里的unionall只走一个job,不会因为job多拖后腿(hadoop不怕数据量大【一定范围内】,就怕job多和数据倾斜)。
3.得到最终结果,没有一个distinct,全部走的是普通sum,可以在mapper端提前聚合,会很快
完整的sql:
create temporary function rownumber as 'com.renren.acorn.udf.RowNumber'; drop table if exists tmp_site_global_access_distinct_1_$DATE; drop table if exists tmp_site_global_access_distinct_2_$DATE; create table tmp_site_global_access_distinct_1_$DATE as select id,ip,cookie,idis_zero,sum(case when pv_flag=1 then 1 else 0 end) as pv,sum(otime) as onlinetime from ${TEMP_ACCESS_TABLE}${DATE} group by id,ip,cookie,idis_zero; drop table if exists tmp_site_global_access_distinct_2_$DATE; create table tmp_site_global_access_distinct_2_$DATE as select type,type_value,rownumber(type,type_value) as rn,pv,onlinetime from ( select type,type_value,pv,onlinetime from ( select 'id' as type,cast(id as string) as type_value,pv,onlinetime from tmp_site_global_access_distinct_1_$DATE where idis_zero=0 union all select 'ip' as type,ip as type_value,pv,onlinetime from tmp_site_global_access_distinct_1_$DATE union all select 'cookie' as type,case when cookie='null' then 'acorn_cookie' else cookie end as type_value,pv,onlinetime from tmp_site_global_access_distinct_1_$DATE ) t1 cluster by type,type_value ) t2; select sum(case when type='ip' then pv else cast(0 as bigint) end) as pv, sum(case when type='id' and rn=1 then 1 else 0 end) as uv, sum(case when type='ip' and rn=1 then 1 else 0 end) as ip, sum(case when type='ip' then onlinetime else cast('0' as bigint) end) as onlinetime, sum(case when type='cookie' and rn=1 then 1 else 0 end) as cookie, '$STA_TYPE','$STA_TYPE' from tmp_site_global_access_distinct_2_$DATE; drop table if exists tmp_site_global_access_distinct_1_$DATE; drop table if exists tmp_site_global_access_distinct_2_$DATE;
优化之前整个过程需要1个小时,而且有可能在99%的时候卡死,优化之后只需要不到10分钟;
RowNumber代码为:
public class RowNumber extends UDF { private static int MAX_VALUE = 50; private static String comparedColumn[] = new String[MAX_VALUE]; private static int rowNum = 1; public int evaluate(Object... args) { String columnValue[] = new String[args.length]; for (int i = 0; i < args.length; i++){ if (null == args[i]) { columnValue[i] = "acorn_default"; } else { columnValue[i] = args[i].toString(); } } if (rowNum == 1) { for (int i = 0; i < columnValue.length; i++) comparedColumn[i] = columnValue[i]; } for (int i = 0; i < columnValue.length; i++) { if (!comparedColumn[i].equals(columnValue[i])) { for (int j = 0; j < columnValue.length; j++) { comparedColumn[j] = columnValue[j]; } rowNum = 1; return rowNum++; } } return rowNum++; } }
相关推荐
大数据Hive数据倾斜、Hive-SQL优化 在大数据处理中,Hive是一个非常重要的工具,然而在实际应用中,数据倾斜和性能优化问题经常会出现。为了解决这些问题,我们需要了解Hive的性能调优、数据模型设计、数据倾斜判断...
含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-...
- **性能优化**:通过设置连接池,如C3P0或HikariCP,可以提高并发查询的性能和资源利用率。 了解并正确使用Hive JDBC驱动,是进行Hive数据操作的重要一环,尤其对于那些希望通过编程方式或数据库管理工具访问Hive...
《DBeaver与Hive连接:hive-jdbc-uber-2.6.5.0-292.jar驱动详解》 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,广泛用于数据查询和分析。而DBeaver,作为一款跨平台的数据库管理工具,以其用户友好的...
02、hive-exec-2.1.1-cdh6.3.1.jar 03、hive-jdbc-2.1.1-cdh6.3.1.jar 04、hive-jdbc-2.1.1-cdh6.3.1-standalone.jar 05、hive-metastore-2.1.1-cdh6.3.1.jar 06、hive-service-2.1.1-cdh6.3.1.jar 07、libfb303-...
在这个“hive案例之---------微博数据分析及答案”的项目中,我们将会探索如何利用Hive进行大规模的微博数据挖掘与分析。 首先,项目说明文档.docx可能会详细阐述了该项目的目标、背景、数据来源以及预期的结果。...
hive-jdbc-3.1.2-standalone适用于linux
标题中的“hive-jdbc-uber-2.6.5.0-292.zip”指的是Hive JDBC驱动的Uber版本,版本号为2.6.5.0-292。Uber JAR是一种包含所有依赖的单一JAR文件,便于分发和使用,特别是对于连接工具如DataGrip这样的集成开发环境...
这里我们关注的是"Hive-jdbc-uber-3.1.2",这是一个包含所有依赖的Uber jar包,旨在简化部署和使用流程。 Hive JDBC Uber 3.1.2是Hive的Java数据库连接器的一个优化版本,它通过将所有必需的依赖项打包到一个单一的...
hive-jdbc-2.1.1-cdh6.2.0(ieda等jdbc链接hive2.1.1);cdh6.2.0安装的hive2.1.1
hive-jdbc-uber-2.6.5.0-292.jar DbVisualizer (as of version 9.5.5) Below is an example configuration using DbVisualizer: Open the Diver Manager dialog ("Tools" > "Driver Manager...") and hit the ...
hive客户端工具DBever连接时所使用的驱动,hive-jdbc-uber-2.6.5.0-292.jar,hive-jdbc-uber-2.6.5.0-292.jar,hive-jdbc-uber-2.6.5.0-292.jar
在实际项目中,"hive-jdbc-uber-2.6.5.0-292.jar"可以作为大数据分析工具链的一部分,与其他Java应用(如ETL工具、数据可视化工具等)集成,实现对Hive数据仓库的高效访问。尽管下载途径有限,但这个特定版本的JDBC...
Hive JDBC 1.1.0-cdh5.12.1 连接库是Apache Hive项目中的一个重要组件,主要用于允许客户端程序通过Java数据库连接(JDBC)接口与...无论是数据分析、报表生成还是数据集成,Hive JDBC都是开发人员不可或缺的工具之一。
hive-jdbc-2.3.7-standalone,可用dbeaver连接hive数据库,在工具中进行数据库记录的新增改查
"hive-jdbc-jar-多版本.zip"是一个压缩包,包含了不同版本的Hive JDBC Uber Jars,覆盖了从1.5到1.8的多个Hive版本,适应不同的项目需求。 首先,我们要理解Uber JAR的概念。Uber JAR(也称为Shaded JAR)是一个...
总结,"hive-jdbc-uber-2.6.3.0-292.jar"是Hive与DBeaver之间的重要桥梁,它使数据分析师能够在DBeaver这样的通用数据库管理工具中方便地操作Hive数据仓库,提升了数据管理和分析的工作效率。正确配置和使用Hive ...
7. **性能优化**:通过优化网络通信和数据传输,提高数据查询和处理的速度。 **Dbeaver与Hive JDBC驱动的结合使用:** Dbeaver是一款多平台的数据库管理工具,支持多种数据库系统,包括Hive。通过集成Hive JDBC驱动...
hive-jdbc-1.2.1-standalone.jar hive-jdbc驱动jar包,欢迎下载
Hive连接的jar包——hive-jdbc-3.1.2-standalone.jar,使用数据库连接软件连接数据仓库时需要使用相应的驱动器驱动,希望对大家有所帮助