参考文章: kudu 使用杂记
impala 和 kuduClient 的选择
- impala 的查询速度要快于 kuduClient 的 scan
- insert 的速度都很快 upsert/update/delete 如果用主键的话也都很快,但impala的并发性能比较差,所以这种操作尽量用 kuduClient 的原生 api 进行操作
- 原生api update、delete、upsert 只能根据主键操作,如果需要其他条件则需要拿到主键再进行操作,因此不如impala写sql方便。
使用impala和原生api操作kudu中遇到的一点问题
1. impala用sql操作 set version = version + 1 ,version 必须是 bigint,因为 version(int)+1 结果是bigint
2. json中的 ” 会被转义为 \” 而当作为sql存入的时候 \” 又会被反译 为 ” 所以,再取出来就不是规范的json格式了。。不过这个问题是所有拼接 sql 提交查询的共性问题
//所以把其中的 \ 替换为 \\ , " 替换为 \"
str = str.replaceAll("\\\\","\\\\\\\\").replaceAll("\"","\\\\\"");
// ps : replaceAll 的参数是正则,所以 \\\\ = 正则 \\ = 真正的 \
3. kudu 支持最大300列,每个字段不超过64K(包括String类型和二进制类型)。一般每列不建议超过1k,每行不建议超过100K。
4. impala 大小写不敏感,kudu 大小写敏感,Impala建表时的大小写除了表名其他的所有字段都会变成小写进入kudu
impala 会保存 kudu 的 schema,所以使用impala查询全程大小写混搭无所谓的,但用 kudu 原生api,要注意,表名区分大小写,列名全程小写。
5. impala 建一个数据库 wx ,建一个表 test,在kudu中没有 数据库的概念,impala会把它声明为, impala::db.tableName -> impala::wx.test
6. 使用原生kudu api upsert 时,除了传入主键的几个字段外,not null的字段也必须传入,否则更新不了,如果用 impala 写sql 就会报错的,但用原生 api 正常返回 OperationResponse 里面有错误信息,如果不主动检查是发现不了更新失败的。
7. 用原生 api 进行删除操作,只能set 主键作为条件,其他的字段都不能设置,会失败,在 OperationResponse 可以看到错误信息。但如果用 impala 的话,where 条件就无所谓了,更正常 sql 一样, impala 会处理。
参数设置
Kudu Tablet Server Block Cache Capacity
block_cache_capacity_mb 512M -> 1G
Kudu Tablet Server Hard Memory Limit
memory_limit_hard_bytes 默认 4G -> 30 G 这个参数尽量大,机器 80% 左右
来源:oschina
链接:https://my.oschina.net/u/4348352/blog/4278605