Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 设置Cassandra表扫描上的Spark任务数_Scala_Cassandra_Apache Spark_Spark Cassandra Connector - Fatal编程技术网

Scala 设置Cassandra表扫描上的Spark任务数

Scala 设置Cassandra表扫描上的Spark任务数,scala,cassandra,apache-spark,spark-cassandra-connector,Scala,Cassandra,Apache Spark,Spark Cassandra Connector,我有一个简单的Spark作业,它从一个5节点Cassandra集群读取500万行,该集群总是运行6个任务,这会由于每个任务的大小而导致写问题。我尝试过调整输入分割大小,但似乎没有效果。目前,我被迫重新分区表扫描,这是不理想的,因为它的昂贵 读了几篇文章后,我试图在我的启动脚本(如下)中增加num executors,尽管这没有效果 如果没有办法在Cassandra表扫描上设置任务数,那很好,我就去做。。但我总是有一种烦琐的感觉,我在这里错过了一些东西 Spark workers生活在C*节点上,

我有一个简单的Spark作业,它从一个5节点Cassandra集群读取500万行,该集群总是运行6个任务,这会由于每个任务的大小而导致写问题。我尝试过调整输入分割大小,但似乎没有效果。目前,我被迫重新分区表扫描,这是不理想的,因为它的昂贵

读了几篇文章后,我试图在我的启动脚本(如下)中增加num executors,尽管这没有效果

如果没有办法在Cassandra表扫描上设置任务数,那很好,我就去做。。但我总是有一种烦琐的感觉,我在这里错过了一些东西

Spark workers生活在C*节点上,这些节点是8核64gb服务器,每个服务器中有2TB SSD

...
val conf = new SparkConf(true).set("spark.cassandra.connection.host",
cassandraHost).setAppName("rowMigration")
  conf.set("spark.shuffle.memoryFraction", "0.4")
  conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  conf.set("spark.executor.memory", "15G")
  conf.set("spark.cassandra.input.split.size_in_mb", "32") //default 64mb
  conf.set("spark.cassandra.output.batch.size.bytes", "1000") //default
  conf.set("spark.cassandra.output.concurrent.writes", "5") //default

val sc = new SparkContext(conf)

val rawEvents = sc.cassandraTable(cassandraKeyspace, eventTable)
  .select("accountid", "userid", "eventname", "eventid", "eventproperties")
  .filter(row=>row.getString("accountid").equals("someAccount"))
  .repartition(100)

val object = rawEvents
  .map(ele => (ele.getString("userid"),
    UUID.randomUUID(),
    UUID.randomUUID(),
    ele.getUUID("eventid"),
    ele.getString("eventname"),
    "event type",
    UUIDs.unixTimestamp(ele.getUUID("eventid")),
    ele.getMap[String, String]("eventproperties"),
    Map[String, String](),
    Map[String, String](),
    Map[String, String]()))
  .map(row=>MyObject(row))

Object.saveToCassandra(targetCassandraKeyspace,eventTable)
启动脚本:

#!/bin/bash
export SHADED_JAR="Migrate.jar"
export SPARKHOME="${SPARKHOME:-/opt/spark}"
export SPARK_CLASSPATH="$SHADED_JAR:$SPARK_CLASSPATH"
export CLASS=com.migration.migrate
"${SPARKHOME}/bin/spark-submit" \
        --class "${CLASS}" \
        --jars $SHADED_JAR,$SHADED_JAR \
        --master spark://cas-1-5:7077  \
        --num-executors 15 \
        --executor-memory 20g \
        --executor-cores 4 "$SHADED_JAR" \
        --worker-cores 20 \
        -Dcassandra.connection.host=10.1.20.201 \
        -Dzookeeper.host=10.1.20.211:2181 \
编辑-遵循Piotr的回答:

我在sc.cassandraTable上设置了ReadConf.splitCount,如下所示,但是这不会改变生成的任务数,这意味着我仍然需要重新分区表扫描。我开始觉得我想的不对,重新分区是必要的。目前,这项工作大约需要1.5小时,将表扫描重新划分为1000个任务(每个任务大约10MB),将写入时间减少到了几分钟

val cassReadConfig = new ReadConf {
      ReadConf.apply(splitCount = Option(1000)
        )
    }

    val sc = new SparkContext(conf)

    val rawEvents = sc.cassandraTable(cassandraKeyspace, eventTable)
    .withReadConf(readConf = cassReadConfig)

似乎split.size_in_mb参数存在错误。代码可能将其解释为字节而不是兆字节,因此请尝试将32改为更大的值。参见答案中的示例。

自spark connector 1.3以来,分割尺寸是根据system.size\u estimates Cassandra表估算的,该表自Cassandra 2.1.5以来一直可用。此表由Cassandra定期刷新,在加载/删除新数据或加入新节点后不久,其内容可能不正确。检查估算值是否反映了您的数据量。这是一个相对较新的功能,因此也很可能存在一些bug

如果估计是错误的,或者您运行的是较旧的Cassandra,那么我们可以忽略自动分割大小调整。sc.cassandraTable接受ReadConf参数,您可以在其中设置splitCount,这将强制执行固定数量的拆分


至于split_size_in_mb参数,在项目源代码中确实存在一段时间的bug,但是在发布到maven的任何版本之前,它已经被修复。因此,除非您是从(旧)源代码编译连接器,否则不应该点击它

谢谢,虽然这个错误在我目前使用的1.4.0版本中已经修复。如果发生这种情况,我会发现运行的任务数量正好相反。谢谢你提供的信息!我已经测试了ReadConf参数的设置,因为我们目前正在使用C*2.1.4。不过,在此处调整splitCount或splitSizeInMB不会改变任务的数量。我将升级到2.1.5,看看system.size_esitmates表是否有任何效果。这对我也不起作用。我做的正是你做的。您能解释一下表格扫描的重新分区是什么意思以及如何进行吗?