我正在使用 Apache Spark 将数据写入 Cassandra 集群。该部署基于 kubernetes,并使用 cassandra helm Chart。我偶尔会遇到导致工作流产的
SparkException
,详情如下:
...
Caused by: com.datastax.oss.driver.api.core.servererrors.UnauthorizedException: Unable to perform
authorization of permissions: Unable to perform authorization of super-user permission: Cannot
achieve consistency level QUORUM
有关 Cassandra 集群的其他详细信息:
数据中心:数据中心1
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.x.x.x 10.98 GiB 256 64.7% blahblah-c2e0509a03 rack1
UN 10.x.x.x 12.17 GiB 256 69.7% blahblah-a617-4dfbcdb999aa rack1
UN 10.x.x.x 12.6 GiB 256 65.6% blahblah-9d4f-9111f4ae55a3 rack1
我已经确保 system_auth 键空间被复制到所有这些节点。然而,该问题仍然间歇性地出现。如果您能深入了解为什么会发生这种情况以及如何解决它,我将不胜感激。
这是使用内置管理员角色时的一个众所周知的问题 - 对于此角色,Cassandra 在读取身份验证数据时始终使用
QUORUM
,并且可能会出现只有一个节点可用而其他节点正在执行垃圾收集或其他活动的情况并且不承担任何责任。
您可以创建 另一个用户并为其授予必要的权限(包括填充管理员权限) - 对于此用户,将使用
ONE
而不是 QUORUM
。
CREATE ROLE dba WITH SUPERUSER = true AND LOGIN = true AND PASSWORD = 'password';
附注甚至建议禁用内置超级用户,请参阅链接文档了解详细信息。