Apache Spark需要5到6分钟才能从Cassandra中简单计算1个亿行

kar*_*iya 3 java cassandra apache-spark spark-cassandra-connector

我正在使用Spark Cassandra连接器.从Cassandra表获取数据需要5-6分钟.在Spark中,我在日志中看到了许多任务和Executor.原因可能是Spark在许多任务中划分了这个过程!

下面是我的代码示例:

public static void main(String[] args) {

    SparkConf conf = new SparkConf(true).setMaster("local[4]")
            .setAppName("App_Name")
            .set("spark.cassandra.connection.host", "127.0.0.1");

    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<Demo_Bean> empRDD = javaFunctions(sc).cassandraTable("dev",
            "demo");
    System.out.println("Row Count"+empRDD.count());
}
Run Code Online (Sandbox Code Playgroud)

kar*_*iya 8

在Google上搜索后,我喜欢最新的spark-cassandra-connector中的问题.参数spark.cassandra.input.split.size_in_mb Default值为64 MB,在代码中被解释为64字节.所以试试吧 spark.cassandra.input.split.size_in_mb = 64 * 1024 * 1024 = 67108864

听到就是一个例子:

public static void main(String[] args) {

    SparkConf conf = new SparkConf(true).setMaster("local[4]")
            .setAppName("App_Name")
            .set("spark.cassandra.connection.host", "127.0.0.1")
            .set("spark.cassandra.input.split.size_in_mb","67108864");


    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<Demo_Bean> empRDD = javaFunctions(sc).cassandraTable("dev",
            "demo");
    System.out.println("Row Count"+empRDD.count());
}
Run Code Online (Sandbox Code Playgroud)


Jim*_*yer 6

为了加快速度,您可以在创建SparkConf时尝试设置spark.cassandra.input.split.size_in_mb.

可能是执行程序试图立即将所有行读入内存.如果它们都不合适,可能会导致它将RDD分页到磁盘,从而导致时间过长.通过指定拆分大小,它将计算块中的行,然后丢弃它们而不是分页到磁盘.

您可以在此处查看如何设置拆分大小的示例.