本文汇总了Kudu使用时的常见问题。
- 在哪里查看Kudu的日志文件?
- Kudu支持的分区方式有哪些?
- 如何访问Kudu WebUI?
- Kudu客户端连接报错NonRecoverableException
- 如何查看社区FAQ?
- 报错Bad status: Network error: Could not obtain a remote proxy to the peer.: unable to resolve address for <hostname>: Name or service not known
- 报错Bad status: I/O error: Failed to load Fs layout: could not verify integrity of files: <目录>, <数字> data directories provided, but expected <数字>
- 报错pthread_create failed: Resource temporarily unavailable (error 11)
- 启动Kudu失败,该如何处理?
- 报错Service unavailable: RunTabletServer() failed: Cannot initialize clock: timed out waiting for clock synchronisation: Error reading clock. Clock considered unsynchronized
- 报错Rejecting Write request: Soft memory limit exceeded
在哪里查看Kudu的日志文件?
Kudu日志文件路径在/mnt/disk1/log/kudu下。
Kudu支持的分区方式有哪些?
Kudu支持Range分区方式以及Hash分区方式,两种分区方式可以嵌套使用,详情请参见Apache Kudu Schema Design。
如何访问Kudu WebUI?
因为Kudu WebUI与Knox还没有集成,所以不能通过Knox查看Kudu WebUI。您可以通过隧道的方式访问Kudu的WebUI,详情请参见通过SSH隧道方式访问开源组件Web UI。
Kudu客户端连接报错NonRecoverableException
- 报错详情报错详细信息,如下所示。
org.apache.kudu.client.NonRecoverableException: Could not connect to a leader master. Client configured with 1 master(s) (192.168.0.10:7051) but cluster indicates it expects 3 master(s) (192.168.0.36:7051,192.168.0.11:7051,192.168.0.10:7051)
- 问题原因
此问题主要是因为在设置Master节点时,只设置了一个Master节点的信息,程序会找不到主Master节点。
- 解决方法
您在进行此配置时,需要配置所有Master节点的信息。
如何查看社区FAQ?
可以查看社区的Apache Kudu Troubleshooting。
报错Bad status: Network error: Could not obtain a remote proxy to the peer.: unable to resolve address for <hostname>: Name or service not known
- 问题原因:无法解析
<hostname>
,导致kudu tablet的raft server不能获取自己的peer机器类型,不清楚是否存活,所以终止。 - 解决方法:
- 在/etc/hosts中手动添加解析。
- 如果
<hostname>
所代表的机器已经被释放了,可以在/etc/hosts中添加解析到随便一个IP上,无论该IP是否可以访问,之后kudu tserver走Replica恢复的流程。
报错Bad status: I/O error: Failed to load Fs layout: could not verify integrity of files: <目录>, <数字> data directories provided, but expected <数字>
该问题是由于-fs_data_dirs
设置的磁盘数目与-fs_metadata_dir
记录的元数据不一致。直接将-fs_data_dirs
的磁盘数目修改为与元数据匹配的即可。
报错pthread_create failed: Resource temporarily unavailable (error 11)
该问题是因为没有资源了,导致线程创建失败。
- 没有资源
需要通过
ulimit -a
确认下max user processes的值,是否是比较小的一个值。如果比较小,则需要修改/etc/security/limits.conf或者增加一个/etc/security/limits.d/kudu.conf文件,在其中增加对max user processes值的修改。 - 混部的情况下,使用了Kudu client 0.8版本
根据KUDU-1453,Spark executor使用kudu client 0.8可能会造成线程泄漏,先考虑升级到0.9及以上是否能够解决。
- 线程泄漏
- Trino导致的问题
主要是由于Trino退出的时候,shutdown hook里面等待blocking queue的take方法有返回,shutdown hook线程不会被interrupt,而EMR管控又会不断的发SIGTERM创建出来新的SIGTERM Handler线程,因此导致了线程的耗尽。
需要Trino侧解决,或者直接执行
Kill -9
命令。 - Jindo SDK导致的问题
这是由于Spark在执行Write Job的时候会用到JindoOssCommitter这个类,这个类会创建JindoOssMagicCommitter,并在其中生成一个名为oss-committer-pool的线程池。该线程池并不是static的,并且也没有被手动shutdown。因此,在不断的创建JindoOssMagicCommitter的过程中,会不断的产生新的线程池,而老的线程池因为各种原因,也没有被释放,因此会使用过量的线程。如果此时您使用的是Spark Streaming或Structure Streaming,则可能使得系统资源耗尽。
您可以设置以下参数解决。spark.sql.hive.outputCommitterClass=org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter spark.sql.sources.outputCommitterClass=org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
- 排查工具通过执行以下threads_monitor.sh脚本,来查找系统中使用最多线程的进程是什么,然后再解决问题。
#!/bin/bash total_threads=0 max_pid=-1 max_threads=-1 for tid in `ls /proc` do if [[ $tid != *self && -f /proc/$tid/status ]]; then num_threads=`cat /proc/$tid/status | grep Threads | awk '{print $NF}'` ((total_threads+=num_threads)) if [[ ${max_pid} -eq -1 || ${max_threads} -lt ${num_threads} ]]; then max_pid=${tid} max_threads=${num_threads} fi # echo "Thread ${pid}: ${num_threads}" fi done echo "Total threads: ${total_threads}" echo "Max threads: ${max_threads}, pid is ${max_pid}" ps -ef | grep ${max_pid} | grep -v grep
- Trino导致的问题
启动Kudu失败,该如何处理?
kudu-tserver
为kudu-master
。/usr/lib/b2monitor-current/bin/monictrl -stop kudu-tserver
/usr/lib/b2monitor-current/bin/monictrl -start kudu-tserver
报错Service unavailable: RunTabletServer() failed: Cannot initialize clock: timed out waiting for clock synchronisation: Error reading clock. Clock considered unsynchronized
- 报错详情日志中可能会有如下错误信息。
E1010 10:37:54.165313 29920 system_ntp.cc:104] /sbin/ntptime ------------------------------------------ stdout: ntp_gettime() returns code 5 (ERROR) time e6ee0402.2a452c4c Mon, Oct 10 2022 10:37:54.165, (.165118697), maximum error 16000000 us, estimated error 16000000 us, TAI offset 0 ntp_adjtime() returns code 5 (ERROR) modes 0x0 (), offset 0.000 us, frequency 187.830 ppm, interval 1 s, maximum error 16000000 us, estimated error 16000000 us, status 0x2041 (PLL,UNSYNC,NANO), time constant 6, precision 0.001 us, tolerance 500 ppm,
- 问题原因:机器上的ntpd无法连接到所配置的ntp server。
- 解决方法:请尝试重启解决。
报错Rejecting Write request: Soft memory limit exceeded
- 报错原因:超过Soft memory limit。
- 解决方法您可以进行以下操作:
- 设置参数memory_limit_hard_bytes,整体调大内存使用量,默认值是0,代表根据系统自动设置,也可以调整为-1,则表示不做任何限制。
- 设置参数memory_limit_soft_percentage,表示可使用内存的比例,默认值是80。