`

hive数据倾斜之multi-distinct性能优化

    博客分类:
  • hive
 
阅读更多

集群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-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-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-...

    hive驱动包hive-jdbc-uber-2.6.5.0-292.jar(用户客户端连接使用)

    - **性能优化**:通过设置连接池,如C3P0或HikariCP,可以提高并发查询的性能和资源利用率。 了解并正确使用Hive JDBC驱动,是进行Hive数据操作的重要一环,尤其对于那些希望通过编程方式或数据库管理工具访问Hive...

    DBeaver链接hive驱动包下载: hive-jdbc-uber-2.6.5.0-292.jar

    《DBeaver与Hive连接:hive-jdbc-uber-2.6.5.0-292.jar驱动详解》 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,广泛用于数据查询和分析。而DBeaver,作为一款跨平台的数据库管理工具,以其用户友好的...

    Hive-2.1.1-CDH-3.6.1 相关JDBC连接驱动 Jar 包集合

    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案例之---------微博数据分析及答案.zip

    在这个“hive案例之---------微博数据分析及答案”的项目中,我们将会探索如何利用Hive进行大规模的微博数据挖掘与分析。 首先,项目说明文档.docx可能会详细阐述了该项目的目标、背景、数据来源以及预期的结果。...

    hive-jdbc-3.1.2-standalone

    hive-jdbc-3.1.2-standalone适用于linux

    hive-jdbc-uber-2.6.5.0-292.zip

    标题中的“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+yanagishima-18.0

    这里我们关注的是"Hive-jdbc-uber-3.1.2",这是一个包含所有依赖的Uber jar包,旨在简化部署和使用流程。 Hive JDBC Uber 3.1.2是Hive的Java数据库连接器的一个优化版本,它通过将所有必需的依赖项打包到一个单一的...

    hive-jdbc-2.1.1-cdh6.2.0-standalone.jar

    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.jar

    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" &gt; "Driver Manager...") and hit the ...

    hive-jdbc-uber-2.6.5.0-292.rar

    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

    在实际项目中,"hive-jdbc-uber-2.6.5.0-292.jar"可以作为大数据分析工具链的一部分,与其他Java应用(如ETL工具、数据可视化工具等)集成,实现对Hive数据仓库的高效访问。尽管下载途径有限,但这个特定版本的JDBC...

    hive-jdbc-1.1.0-cdh5.12.1 连接库 jar包

    Hive JDBC 1.1.0-cdh5.12.1 连接库是Apache Hive项目中的一个重要组件,主要用于允许客户端程序通过Java数据库连接(JDBC)接口与...无论是数据分析、报表生成还是数据集成,Hive JDBC都是开发人员不可或缺的工具之一。

    hive-jdbc-2.3.7-standalone.jar

    hive-jdbc-2.3.7-standalone,可用dbeaver连接hive数据库,在工具中进行数据库记录的新增改查

    hive-jdbc-jar-多版本.zip

    "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-jdbc-uber-2.6.3.0-292.jar"是Hive与DBeaver之间的重要桥梁,它使数据分析师能够在DBeaver这样的通用数据库管理工具中方便地操作Hive数据仓库,提升了数据管理和分析的工作效率。正确配置和使用Hive ...

    hive-jdbc-uber-2.6.5.0-292.jar驱动

    7. **性能优化**:通过优化网络通信和数据传输,提高数据查询和处理的速度。 **Dbeaver与Hive JDBC驱动的结合使用:** Dbeaver是一款多平台的数据库管理工具,支持多种数据库系统,包括Hive。通过集成Hive JDBC驱动...

    hive-jdbc-1.2.1-standalone.jar

    hive-jdbc-1.2.1-standalone.jar hive-jdbc驱动jar包,欢迎下载

    hive-jdbc-3.1.2-standalone.jar

    Hive连接的jar包——hive-jdbc-3.1.2-standalone.jar,使用数据库连接软件连接数据仓库时需要使用相应的驱动器驱动,希望对大家有所帮助

Global site tag (gtag.js) - Google Analytics