我有一个Cassandra集群和一个位于同一位置的Spark集群,我可以通过编译它们、复制它们并使用来运行常见的Spark作业/spark提交脚本。我写了一个小作业,接受SQL作为命令行参数,将其作为Spark SQL提交给Spark,Spark针对Cassandra运行该SQL,并将输出写入csv文件。
现在我觉得我在兜圈子,试图弄清楚是否可以通过JDBC连接中的Spark SQL直接查询Cassandra(例如从Squirrel SQL)。Spark SQL文档中说
Connect through JDBC or ODBC.
A server mode provides industry standard JDBC and ODBC connectivity for
business intelligence tools.
Spark SQL编程指南说
Spark SQL can also act as a distributed query engine using its JDBC/ODBC or
command-line interface. In this mode, end-users or applications can interact
with Spark SQL directly to run SQL queries, without the need to write any
code.
所以我可以运行Thrift Server,并向其提交SQL。但我不明白的是,如何让Thrift服务器连接到Cassandra?我只是在Thrift Server类路径上弹出Datastax Cassandra连接器吗?如何告诉Thrift服务器我的Cassandra集群的IP和端口?有人已经这样做了吗?可以给我一些建议吗?
在spark-default.conf文件中配置这些属性
spark.cassandra.connection.host 192.168.1.17,192.168.1.19,192.168.1.21
# if you configured security in you cassandra cluster
spark.cassandra.auth.username smb
spark.cassandra.auth.password bigdata@123
使用spark-cassandra连接器依赖项和mysql连接器依赖项启动您的旧款服务器,并通过JDBC或Squirrel连接一些端口。
sbin/start-thriftserver.sh --hiveconf hive.server2.thrift.bind.host 192.168.1.17 --hiveconf hive.server2.thrift.port 10003 --jars <shade-jar>-0.0.1.jar --driver-class-path <shade-jar>-0.0.1.jar
要获取cassandra表,请运行类似的Spark SQL查询
CREATE TEMPORARY TABLE mytable USING org.apache.spark.sql.cassandra OPTIONS (cluster 'BDI Cassandra', keyspace 'testks', table 'testtable');
为什么不使用spark-cassandra连接器和cassandra驱动核心?只需添加依赖项,在spark上下文中指定主机地址/登录名,然后就可以使用sql读取/写入cassandra。