impala的调优以及导数
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

impala的调优以及导数

yuc
yuc
2024-04-24 / 最后修改: 2025-08-12 07:12 / 0 评论 / 7 阅读 / 正在检测是否收录...
优化问题
交换内存调优
vm.swappiness = 0
内存大小

内存最少128G,256G更佳,内存的大小直接影响了查询和导入数据,在cdh5.5版本后取消了内存溢出写入磁盘,查询或者倒数时内存溢出会立即错误

硬盘空间

硬盘一定要足够,在正式环境中,我们需要使用默认设置复制快为3,那么存储空间需求为三倍

hdfs块大小、列存储

hdfs调整数据块大小,在使用parquet列式存储时候,大块文件对性能提升非常大,反之小文件会增加hdfs寻块的时间,推荐的块大小为1G

合适的字段分区

字段分区能够极大提升查询性能,但也需要遵从一定限制,过多的分区有可能会导致数据分布不均,某些块可能非常小,导致查询时间变长

导入数据的压缩格式

压缩能够减少存储空间的使用,但是牺牲了cpu的性能,不论是在查询,还是在导入的时候,都需要把数据进行解压,会消耗更多的cpu时间,对于cpu密集型的工作负载,可以关闭压缩功能,同时,官方测试不使用压缩比压缩查询稍快,使用snappy性能优于gzip压缩

集群负载类型和网络

cdh又分为网络工作负载,cpu工作负载,内存工作负载等类型,所以不仅仅内存需要满足一定需求。磁盘IO,网络带宽(内网10G/s)也都需要满足需求

raid类型

磁盘不需要使用raid,因为hdfs本来就是使用大量廉价机器来提升性能,但raid1明显违背了这一点,raid0数据不可靠,当一个节点宕机,此节点所有的磁盘数据丢失,如果真的需要使用raid来提升性能,那么使用raid5+0,raid1+0,官方推荐方式是jbod,这种方式性能比raid0差不太多,但是可靠性更高,当一块盘损坏时,hdfs会自动重建该盘的数据到其他磁盘,我们只需要替换该盘即可。且官方提到raid0受制于最慢的那块盘,如果最慢的磁盘数据没有写入,其他磁盘无论多块也是不完整的数据,特别是raid0在使用时间过长后损坏的几率以及变慢的几率变高

查看表的信息统计
show table stats TABLE_NAME
查看表的分区
show partitions TABLE_NAME
对表进行信息统计
compute stats TABLE_NAME
关闭压缩
set compression_codec=none;
缓存表
hdfs cacheadmin -addPool 'impala_pool' -owner impala -limit 40000000000
alter table TABLE_NAME set cached in 'impala_pool' with replication=3
alter table TABLE_NAME set uncached
数据导入问题
字段支持类型

impala支持的字段类型有区别于mysql或者oracle等关系型数据库,其中NUMBER改为DECIMAL,VARCHAR2改为VARCHAR,DATE改为TIMESTAMP

数值类型的精度问题

如果在导入数据的时候提示 Error converting column: 34 to DECIMAL(10,0),则表明数据类型不对,可以查看oracle数据库的对应字段的数值精度,再修改即可

数据导入流程和分隔符

先根据原表创建表结构,然后导出数据,这里选择好分隔符field=\"0x1c\" record=\"0x1e\",再根据导出数据时的分隔符创建impala普通表,然后创建parquet表,把普通表导入parquet表,或者先对parquet表进行分区后再导入,最后对导入的数据使用compute stats进行优化

分隔符问题 通过修改impala导入时默认的lines terminated换行符和escape取消转义,原因可能是impala默认换行符\n也能匹配到被取消转义后的oracle换行符

oracle导入数据到impala

这个脚本是之前从oracle导出数据并且导入到impala中,最后转换为parquet表

#!/bin/bash
#
#列出需要导入的表名,可以是一张表,也可以是多张表
tables="F_BRLXJJB_NEW F_BASY_DBZ F_BASY_JBQK f_basy_jbqk_gx F_BASY_ZZY F_BASY_SSFL F_BASY_FY F_BASY_BFBZ F_BASY_BACX F_FJZL_NEW F_BASY_CYBR F_YBCYRS_NEW F_YBCYRS_NEW_NB"
#删除历史的一些遗留文件,或者异常退出产生的遗留文件等
rm -rf /tmp/files/*
hadoop fs -rm -r -f /tmp/files/*
mkdir /tmp/files
hadoop fs -mkdir /tmp/files
chmod 777 /tmp/files
#抽取oracle中的数据
for i in `echo $tables`;do
 su - oracle -c "sqluldr user=USER/PASS@SID query=\"select * from ${i}\" file=/tmp/files/${i}.txt field=\"0x1c\" record=\"0x1e\" serial=true charset=utf8 safe=yes" &
 while true;do
 n=`ps -ef | grep sqluldr | grep -v grep | wc -l`
 if [ ${n} -lt 3 ];then
 break
 else
 sleep 60s
 fi
 done
done
while true;do
 n=`ps -ef | grep sqluldr | grep -v grep | wc -l`
 if [ ${n} -eq 0 ];then
 break
 else
 sleep 60s
 fi
done
#把抽取的数据上传到hdfs
for i in `echo $tables`;do
 hadoop fs -put /tmp/files/${i}.txt /tmp/files &
 while true;do
 n=`ps -ef | grep "\-put /tmp/files" | grep -v grep | wc -l`
 if [ ${n} -lt 3 ];then
 break
 else
 sleep 60s
 fi
 done
done
while true;do
 n=`ps -ef | grep "hadoop fs -put" | grep -v grep | wc -l`
 if [ ${n} -eq 0 ];then
 break
 else
 sleep 60s
 fi
done
sleep 1200s
#删除原来的表,这里的库名根据实际情况修改,然后创建表
for i in `echo $tables`;do
 impala-shell -q "drop table if exists default.txt_${i}"
 impala-shell -f tables/${i}
done
#修改上传文件的权限
hadoop fs -chmod -R 777 /tmp/files
#加载数据到普通的表中
for i in `echo $tables`;do
 impala-shell -q "load data inpath '/tmp/files/${i}.txt' into table default.txt_${i}"
done
#设置不压缩表,貌似在这里设置没有效果
impala-shell -q "set compression_codec=none"
#加载数据到parquet表,上面没有删除parquet表,所以这里是加载数据的语句
for i in `echo $tables`;do
 impala-shell -f psql/${i}
done
#对parquet表进行元数据更新操作
for i in `echo $tables`;do
 impala-shell -q "compute stats default.${i}"
done
0

评论

博主关闭了当前页面的评论