热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

123.Impala查询缓慢问题与解决

123.1问题情况前提ImpalaDaemon已启用-convert_legacy_hive_parquet_utc_timestampsHive创建测试表,其中“

123.1 问题情况


  • 前提
    • Impala Daemon已启用-convert_legacy_hive_parquet_utc_timestamps
  • Hive创建测试表,其中“statsdate”字段为TIMESTAMP类型:

[root@cdh4 scripts]# cat createSourceTable.sql
create database if not exists iot_test;
use iot_test;
create table if not exists hive_table_text (
ordercoldaily BIGINT,
smsusedflow BIGINT,
gprsusedflow BIGINT,
statsdate TIMESTAMP,
custid STRING,
groupbelong STRING,
provinceid STRING,
apn STRING )
PARTITIONED BY ( subdir STRING )
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ;

  • 执行命令

./hivesql_exec.sh createSourceTable.sql

  • 查看测试表,在beeline中
  • 执行命令,查看表结构

show create table hive_table_test;


  • 测试数据准备
    • 生成测试数据,gendata.sh脚本

[root@cdh4 scripts]# cat gendata.sh
function rand(){ min=$1 max=$(($2-$min+1)) num=$(($RANDOM+1000000000))echo $(($num%$max+$min))
}
let i=1
while [ $i -le 3 ];
dolet n=1while [ $n -le $1 ];dolet month=$n%12+1if [ $month -eq 2 ];thenlet day=$n%28+1elselet day=$n%30+1fi let hour=$n%24rnd=$(rand 10000 10100) echo "$i$n,$i$n,$i$n,2017-$month-$day $hour:20:00,${rnd},$n,$n,$n" >> data$i.txtlet n=n+1done
let i=i+1
done

  • 执行命令

./gendata.sh 300000


  • 上传测试数据

# 运行upLoad.sh脚本,将测试数据上传至HDFS的/tmp/hive目录下
[root@cdh4 scripts]# cat upLoadData.sh
#!/bin/shnum=3
path='/tmp/hive'
#create directory
sudo -u hdfs hdfs dfs -mkdir -p $path
sudo -u hdfs hdfs dfs -chmod 777 $path
#upload file
let i=1
while [ $i -le $num ];
dohdfs dfs -put data${i}.txt $pathlet i=i+1
done
#list file
hdfs dfs -ls $path

  • 验证
  • 加载数据进入测试表

# 执行./hivesql_exec.sh loadData.sql命令,加载数据
[root@cdh4 scripts]# cat loadData.sql
use iot_test;
LOAD DATA INPATH '/tmp/hive/data1.txt' INTO TABLE hive_table_test partition (subdir="10");
LOAD DATA INPATH '/tmp/hive/data2.txt' INTO TABLE hive_table_test partition (subdir="20");
LOAD DATA INPATH '/tmp/hive/data3.txt' INTO TABLE hive_table_test partition (subdir="30");

  • 验证
  • Hive生成包含timestamp的parquet表
    • 创建Parquet表

# 生成Parquet表语句如下,其中“statsdate”字段为TIMESTAMP类型
[root@cdh4 scripts]# cat genParquet.sql
use iot_test;
create table hive_table_parquet (
ordercoldaily BIGINT,
smsusedflow BIGINT,
gprsusedflow BIGINT,
statsdate TIMESTAMP,
custid STRING,
groupbelong STRING,
provinceid STRING,
apn STRING )
PARTITIONED BY ( subdir STRING )
STORED AS PARQUET;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table hive_table_parquet partition (subdir) select * from hive_table_test

  • 执行命令

./hivesql_exec.sh genParquet.sql



  • 执行命令,查看数据总数

select count(*) from hive_table_parquet;


  • 验证Parquet文件是否由Hive生成

[root@cdh4 scripts]# hdfs dfs -ls -R /user/hive/warehouse/iot_test.db/hive_table_parquet/

[root@cdh4 scripts]# parquet-tools meta hdfs://cdh3.macro.com:8020/user/hive/warehouse/iot_test.db/hive_table_parquet/subdir=10/000000_0
creator: parquet-mr version 1.5.0-cdh5.13.1 (build ${buildNumber})
file schema: hive_schema


  • 并发测试脚本准备
    • 脚本

# Impala负载均衡地址为:cdh4.macro.com:25003
[root@cdh4 scripts]# cat impala-test.sh
#!/bin/sh#Concurrency test
let i=1
while [ $i -le $1 ];
doimpala-shell -B -i cdh4.macro.com:25003 -u hive -f $2 -o log/${i}.out &let i=i+1
done
wait

  • SQL测试

SELECT nvl(A.TOTALGPRSUSEDFLOW,0) as TOTALGPRSUSEDFLOW, nvl(A.TOTALSMSUSEDFLOW,0) as TOTALSMSUSEDFLOW, B.USEDDATE AS USEDDATE
FROM ( SELECT SUM(GPRSUSEDFLOW) AS TOTALGPRSUSEDFLOW, SUM(SMSUSEDFLOW) AS TOTALSMSUSEDFLOW, cast(STATSDATE as timestamp) AS USEDDATE
FROM hive_table_parquet SIMFLOW
WHERE SIMFLOW.subdir = '10' AND SIMFLOW.CUSTID = '10099' AND cast(SIMFLOW.STATSDATE as timestamp) >= to_date(date_sub(current_timestamp(),7)) AND cast(SIMFLOW.STATSDATE as timestamp) RIGHT JOIN ( SELECT to_date(date_sub(current_timestamp(),7)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),1)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),2)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),3)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),4)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),5)) AS USEDDATE UNION ALLSELECT to_date(date_sub(current_timestamp(),6)) AS USEDDATE
) B on to_date(A.USEDDATE) = to_date(B.USEDDATE) ORDER BY B.USEDDATE

  • 测试Impala并发
    • 测试1个并发查询,以下共三次测试返回查询结果:


    • 测试10个并发查询,以下共三次测试返回查询结果:


  • 测试30个并发查询,以下共三次测试返回查询结果:





  • 随着并发查询数量的增多,Impala查询性能越差

123.2 问题分析


123.3 解决方法

方法一:


  • 去掉–convert_legacy_hive_parquet_utc_timestamps=true启动选项

方法二:


  • Parquet表用 Impala 生成

方法三:


  • Hive/Spark 产生 Parquet 表时使用STRING类型代表时间
    • 并且时间格式采用 yyyy-MM-dd HH:mm:ss.SSS 或者 yyyy-MM-dd HH:mm:ss
    • 这种方式下,使用 Impala 的date/time函数时, Impala 会自动将其转换成TIMESTAMP类型

大数据视频推荐:
CSDN
人工智能算法竞赛实战
AIops智能运维机器学习算法实战
ELK7 stack开发运维实战
PySpark机器学习从入门到精通
AIOps智能运维实战
大数据语音推荐:
ELK7 stack开发运维
企业级大数据技术应用
大数据机器学习案例之推荐系统
自然语言处理
大数据基础
人工智能:深度学习入门到精通


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
author-avatar
淡泊宁静1110
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有