Apache Spark 需要 5 到 6 分钟才能从 Cassandra 简单地计算 10 亿行

Apache Spark taking 5 to 6 minutes for simple count of 1 billon rows from Cassandra

我正在使用 Spark Cassandra 连接器。 从 Cassandra table 获取数据需要 5-6 分钟。在 Spark 中,我在日志中看到了很多任务和执行器。原因可能是 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());
}

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

可能是执行程序试图一次将所有行读入内存。如果它们不适合,可能会导致将 RDD 分页到磁盘,从而导致时间变慢。通过指定分割大小,它会以块的形式计算行数,然后丢弃它们而不是分页到磁盘。

您可以查看如何设置拆分大小的示例 here

在 Google 上搜索后,我喜欢最新的 spark-cassandra-connector 中的问题。 参数 spark.cassandra.input.split.size_in_mb 默认值为 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());
}