Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Apache spark spark中数据帧的重新分区不起作用_Apache Spark - Fatal编程技术网

Apache spark spark中数据帧的重新分区不起作用

Apache spark spark中数据帧的重新分区不起作用,apache-spark,Apache Spark,我有一个卡桑德拉数据库,有大量记录,大约400万条。我有三台从机和一个驱动器。我想将这些数据加载到spark内存中并对其进行处理。当我执行以下操作时,它读取一台从机(6 Gb中的300 mb)中的所有数据,而所有其他从机内存都未使用。我在数据帧上重新编写成3,但数据仍然在一台机器上。因此,由于每个作业都在一台机器上执行,因此处理数据需要花费大量时间。这就是我正在做的 val tabledf = _sqlContext.read.format("org.apache.spark.sql.cassa

我有一个卡桑德拉数据库,有大量记录,大约400万条。我有三台从机和一个驱动器。我想将这些数据加载到spark内存中并对其进行处理。当我执行以下操作时,它读取一台从机(6 Gb中的300 mb)中的所有数据,而所有其他从机内存都未使用。我在数据帧上重新编写成3,但数据仍然在一台机器上。因此,由于每个作业都在一台机器上执行,因此处理数据需要花费大量时间。这就是我正在做的

val tabledf = _sqlContext.read.format("org.apache.spark.sql.cassandra").options(Map( "table" -> "events", "keyspace" -> "sams")).load
        tabledf.registerTempTable("tempdf");
        _sqlContext.cacheTable("tempdf");
val rdd = _sqlContext.sql(query);   
val partitionedRdd = rdd.repartition(3)
        val count = partitionedRdd.count.toInt
当我在partitionedRdd上执行一些操作时,它只在一台机器上执行,因为所有数据都只存在于一台机器上

更新 我在配置中使用它--conf spark.cassandra.input.split.size_in_mb=32,但我的所有数据都加载到一个执行器中

更新
我使用的是spark 1.4版和spark cassandra connector 1.4版发布的

如果“查询”只访问一个C*分区键,您将只能获得一个任务,因为我们还没有办法(目前)自动并行获得一个cassandra分区。如果您正在访问多个C*分区,请尝试进一步缩小输入拆分大小(mb)。

您是否确定您的配置正确,并且没有
val conf=new SparkConf().setMaster(“local[*]”)和
位置?不,我正在群集模式下运行,web UI显示3台从机。另外,我正在运行这个配置spark.cassandra.input.split.size_in_mb=67108864,这就是我使用67108864Oh的原因,抱歉-现在是早上,我没有看到
rdd.repartition
。我想你应该增加分区的数量。我不知道您的从机是哪种类型的实例,但我猜它们有多个计算单元。分区数(您当前已设置为3)应至少为
numberOfSlaves*numberofcomputerunitsoneachslave
,以便您以最佳方式利用群集。我在slave上有双核8 gb计算机。计算机单元的数量是否等于内核的数量?是的,我正在使用单个分区密钥进行尝试。在数据帧加载到内存后,我尝试使用缓存对其进行重新分区,但没有帮助。是否有一种方法可以将数据分散到其他计算机,或者可以对特定列进行索引,以便对该列进行范围查询。要并行单个查询,您需要知道分区中的数据并执行并行范围查询如果单分区键创建了一个分区,那么如果我说10分区键将创建10分区,那么我没有错。那么为什么我们需要在变量配置中使用spark.xassandra.input.split.size_呢?是否有文档记载,单个分区键只能在spark中创建单个分区