Spark RDD不会在多个节点中处理

时间:2017-05-29 07:42:17

标签: apache-spark

我有一个用例,我在hive表中创建rdd。我编写了一个业务逻辑,可以在hive表的每一行上运行。我的假设是,当我创建rdd并跨越它的地图进程时,它会利用我所有的火花执行器。但是,我在日志中看到的只有一个节点处理rdd,而我的5个节点的其余部分处于空闲状态。这是我的代码

$(document).ready(function () {
   bindGrid('','');
        $("#btnID").click(function () {
            try {
                var parameter1 = $('#txtFromDate').val();
                var parameter2 = $('#txtToDate').val();
                bindGrid(parameter1,parameter2);
            } catch (e) {
            }

        });
});

function bindGrid(parameter1,parameter2) {
$('#formdata4').dataTable({
...
 "sAjaxSource": "dataTable.php",
        "fnServerParams": function (aoData) {
            aoData.push({ "name": "FromDate", "value": parameter1 },{"name":"ToDate","value":parameter2});
            perm = aoData;
        },
...
});
}

我出错的任何线索?

2 个答案:

答案 0 :(得分:1)

您的数据可能会出现偏差吗?

要排除这种可能性,请执行以下操作并重新运行代码。

val flow = hiveContext.sql("select * from humsdb.t_flow").repartition(200)
var x = flow.rdd.map { row =>
    < do some computation on each row>
 }

此外,如果您的地图逻辑中依赖于特定列,则可以在下面执行

val flow = hiveContext.sql("select * from humsdb.t_flow").repartition(col("yourColumnName"))
var x = flow.rdd.map { row =>
    < do some computation on each row>
 }

好的分区列可以是日期列

答案 1 :(得分:1)

由@jaceklaskowski指定enter image description here

  

默认情况下,为每个HDFS分区创建一个分区   默认值为64MB(来自Spark的编程指南)。

如果输入数据小于64MB(并且您使用的是HDFS),则默认情况下只会创建一个分区。

Spark在使用大数据

时会使用所有节点