在具有cassandra和Java的较差系统中使用Apache Spark

时间:2018-11-02 06:51:09

标签: java apache-spark cassandra apache-spark-sql spark-cassandra-connector

我想在由5个不良系统组成的集群上使用Apache Spark。首先,我在节点上实现了cassandra 3.11.3,并且所有节点都正常。

此后,我在不使用Spark的情况下使用JAVA api在节点中插入了10万条记录,一切都OK。

现在,我想执行一个简单的查询,如下所示:

select * from myKeySpace.myTbl where field1='someValue';

由于我的节点硬件薄弱,所以我想从myTbl那里获取一些记录,如下所示:

select * from myKeySpace.myTbl where field1='someValue' limit 20;

我已经测试了这个(A),但是它非常慢(我不知道原因):

Dataset<Row> df1 = sparkSession.sql("select * from myKeySpace.myTbl where field1='someValue' limit 20");

还有(B)我认为Spark会获取所有数据,然后使用限制功能,这不是我的目标:

Dataset<Row> df1 = sparkSession.sql("select * from myKeySpace.myTbl where field1='someValue'").limit(20);

我想我也可以使用Spark核心(C)。我也知道在cassandra 3.6及更高版本(D)中实现了一种名为perPartitionLimit的方法。

您知道,由于我的节点很弱,所以我不想从cassandra表中获取所有记录,然后再使用limit函数或类似的方法。我只想从表中获取少量记录,以便我的节点可以处理这些记录。

那么最好的解决方案是什么?

更新:

我已经完成了@AKSW在评论中给出的建议:

SparkConf conf = new SparkConf()
                .setAppName("SparkTest")
                .set("spark.cassandra.connection.host","192.168.107.100");
long limit=20;
JavaSparkContext jsc = new JavaSparkContext(conf);

CassandraJavaRDD<CassandraRow> rdd1 = javaFunctions(jsc)
                    .cassandraTable("myKeySpace", "myTbl")
                    .select("id").perPartitionLimit(limit);

System.out.println("Count: " + rdd1.count()); //output is "Count: 100000" which is wrong!
jsc.stop();

perPartitionLimit(limit)认为limit=20不起作用,并且所有记录都已提取!

0 个答案:

没有答案