Kudu优化

导入数据

  • 全量导入kudu
    先用sqoop把关系数据库数据导入临时表,再用impala从临时表导入kudu目标表

注意:由于sqoop从关系型数据直接以parquet格式导入hive会有问题,这里默认hive的表都是text格式;每次导完到临时表,需要做invalidate metadata 表操作,不然后面直接导入kudu的时候会查不到数据

客户端

  • 除了查询,建议所有impala操作都在impala-shell而不在hue上面执行

参数

  • memory_limit_hard_bytes:impala并发写入kudu的时候,数据量比较大的时候,kudu配置参数 memory_limit_hard_bytes能大点就大点,因为kudu写入首先保存再内存里面,到一定阀值才溢写到磁盘,这个是直接最能提高写的方法;
  • maintenance_manager_num_threads:当然不是所有机器都有那么多资源,可以把maintenance_manager_num_threads 这个参数稍微调大,需要调试,提高数据从内存写入磁盘的效率

impala查询kudu

  • 首先所有表做完全量的ETL操作,必须得执行compute stats 表名,不然impala执行sql生成的计划执行数评估的内存不准确,容易评估错误导致实际执行不了

  • kudu表最好不要做任何压缩,保证原始扫描性能发挥最好;假如对查询性能要求比存储要求高的话;大部分企业对实时查询效率要求高,而且存储成本毕竟低;

  • kudu针对大表要做好分区,最好range和hash一起使用,前提是主键列包含能hash的id,但range分区一定要做好,经验告诉我一般是基于时间;

  • 查询慢的sql,一般要拿出来;方便的话做下explain,看下kudu有没有过滤部分数据关键字kudu predicates;假如sql没问题,那在impala-shell执行这个sql,最后执行summray命令,重点查看单点峰值内存和时间比较大的点,对相关的表做优化,解决数据倾斜问题

数据删除

  • 大表不要delete,不要犹豫直接drop,在create吧;磁盘空间会释放的

impala-kudu对比impala-parquet

  • 首先两个解决的场景不一样,kudu一般解决实时,hive解决的是离线(通常是T + 1或者 T -1)
  • hive基于hdfs,hdfs已经提供一套较为完善的存储机制,底层数据和文件操作便利;安全性,可扩展性都比kudu强很多,最重要parquet + impala效率要比kudu高,数仓首选是它
  • kudu最大优势是能做类似关系型数据库一样的操作,insert, update, delete,这样热点的数据可以存储在kudu里面并随时做更新

Kudu主键的限制

  • 表创建后主键不可更改;
  • 一行对应的主键内容不可以被Update操作修改。要修改一行的主键值,需要删除并新增一行新数据,并且该操作无法保持原子性;
  • 主键的类型不支持DOUBLE、FLOAT、BOOL,并且主键必须是非空的(NOT NULL);
  • 自动生成的主键是不支持的;
  • 每行对应的主键存储单元(CELL)最大为16KB。

Kudu列的限制

  • MySQL中的部分数据类型,如DECIMAL, CHAR, VARCHAR, DATE, ARRAY等不支持;
  • 数据类型以及是否可为空等列属性不支持修改;
  • 一张表最多有300列。

Kudu表的限制

  • 表的备份数必须为奇数,最大为7;
  • 备份数在设置后不可修改。
  • Kudu单元(Cells)的限制
  • 单元对应的数据最大为64KB,并且是在压缩前。

Kudu分片的限制

  • 分片只支持手动指定,自动分片不支持;
  • 分片设定不支持修改,修改分片设定需要”建新表-导数据-删老表”操作;
  • 丢掉多数备份的Tablets需要手动修复。

Kudu容量限制

  • 建议tablet servers的最大数量为100;
  • 建议masters的最大数量为3;
  • 建议每个tablet server存储的数据最大为4T(此处存疑,为何会有4T这么小的限制?);
  • 每个tablet server存储的tablets数量建议在1000以内;
  • 每个表分片后的tablets存储在单个tablet server的最大数量为60。

Kudu其他使用限制

  • Kudu被设计为分析的用途,每行对应的数据太大可能会碰到一些问题;
  • 主键有索引,不支持二级索引(Secondary indexes);
  • 多行的事务操作不支持;
  • 关系型数据的一些功能,如外键,不支持;
  • 列和表的名字强制为UTF-8编码,并且最大256字节;
  • 删除一列并不会马上释放空间,需要执行Compaction操作,但是Compaction操作不支持手动执行;
  • 删除表的操作会立刻释放空间。
发布了146 篇原创文章 · 获赞 25 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39680564/article/details/104063743