spark groupBy操作挂起于199/200

时间:2017-03-06 10:29:21

标签: scala apache-spark apache-spark-2.0

我有一个带有master和两个执行器的spark独立集群。我有一个RDD[LevelOneOutput],下面是LevelOneOutput

class LevelOneOutput extends Serializable {

  @BeanProperty
  var userId: String = _

  @BeanProperty
  var tenantId: String = _

  @BeanProperty
  var rowCreatedMonth: Int = _

  @BeanProperty
  var rowCreatedYear: Int = _

  @BeanProperty
  var listType1: ArrayBuffer[TypeOne] = _

  @BeanProperty
  var listType2: ArrayBuffer[TypeTwo] = _

  @BeanProperty
  var listType3: ArrayBuffer[TypeThree] = _

  ...
  ...

  @BeanProperty
  var listType18: ArrayBuffer[TypeEighteen] = _

  @BeanProperty
  var groupbyKey: String = _
}

现在我想基于userId,tenantId,rowCreatedMonth,rowCreatedYear对此RDD进行分组。为此我做了这个

val levelOneRDD = inputRDD.map(row => {
  row.setGroupbyKey(s"${row.getTenantId}_${row.getRowCreatedYear}_${row.getRowCreatedMonth}_${row.getUserId}")
  row
})

val groupedRDD = levelOneRDD.groupBy(row => row.getGroupbyKey)

这会将密钥中的数据设为String,将值设为Iterable[LevelOneOutput]

现在我想为该组密钥生成一个LevelOneOutput的单个对象。为此我做了类似下面的事情:

val rdd = groupedRDD.map(row => {
  val levelOneOutput = new LevelOneOutput
  val groupKey = row._1.split("_")

  levelOneOutput.setTenantId(groupKey(0))
  levelOneOutput.setRowCreatedYear(groupKey(1).toInt)
  levelOneOutput.setRowCreatedMonth(groupKey(2).toInt)
  levelOneOutput.setUserId(groupKey(3))

  var listType1 = new ArrayBuffer[TypeOne]
  var listType2 = new ArrayBuffer[TypeTwo]
  var listType3 = new ArrayBuffer[TypeThree]
  ...
  ...
  var listType18 = new ArrayBuffer[TypeEighteen]

  row._2.foreach(data => {
    if (data.getListType1 != null) listType1 = listType1 ++ data.getListType1
    if (data.getListType2 != null) listType2 = listType2 ++ data.getListType2
    if (data.getListType3 != null) listType3 = listType3 ++ data.getListType3
    ...
    ...
    if (data.getListType18 != null) listType18 = listType18 ++ data.getListType18
  })

  if (listType1.isEmpty) levelOneOutput.setListType1(null) else levelOneOutput.setListType1(listType1)
  if (listType2.isEmpty) levelOneOutput.setListType2(null) else levelOneOutput.setListType2(listType2)
  if (listType3.isEmpty) levelOneOutput.setListType3(null) else levelOneOutput.setListType3(listType3)
  ...
  ...
  if (listType18.isEmpty) levelOneOutput.setListType18(null) else levelOneOutput.setListType18(listType18)

  levelOneOutput
})

这对于小尺寸的输入正常工作,但是当我尝试运行更大的输入数据集时,按操作分组会在199/200停止并且我没有看到任何特定错误或stdout / stderr中的警告

有人可以指出为什么工作没有进一步......

1 个答案:

答案 0 :(得分:0)

我没有使用groupBy操作,而是创建了如下所示的配对RDD

val levelOnePairedRDD = inputRDD.map(row => {
  row.setGroupbyKey(s"${row.getTenantId}_${row.getRowCreatedYear}_${row.getRowCreatedMonth}_${row.getUserId}")
  (row.getGroupByKey, row)
})

并更新了处理逻辑,解决了我的问题。