使用集群在RDD中映射

时间:2017-04-19 05:02:20

标签: scala apache-spark yarn

我一直在尝试在SPARK中使用master作为YARN Cluster执行以下语句,但结果却没有。然而,如果我在Local中执行相同的操作,它的运行没有任何问题。有人可以在这里提出错误吗?

在此过程中,输入为带有AVRO文件的HDFS目录

val rdd = sc.newAPIHadoopFile(inAvro,
  classOf[AvroKeyInputFormat[PolicyTransaction]],
  classOf[AvroKey[PolicyTransaction]],
  classOf[NullWritable],
  sc.hadoopConfiguration
)

println(rdd.count())// This works with Local and Cluster

val avroObj = rdd.map(record => {
  Try
  {
     val combineRecords = new PolicyTransaction

        println(record._1.datum().getPolicyNumber)// This doesn't work with Local and Cluster
        combineRecords.setPolicyNumber(record._1.datum().getPolicyNumber)
        combineRecords.setLOBCd(record._1.datum().getLOBCd)
        combineRecords.setPolicyVersion(record._1.datum().getPolicyVersion)
        combineRecords.setStatStateProvCd(record._1.datum().getStatStateProvCd)
        combineRecords.setTransactionEffectiveDt(record._1.datum().getTransactionEffectiveDt)
        combineRecords.setTransactionProcessedDt(record._1.datum().getTransactionProcessedDt)
        combineRecords.setQuoteOrPolicy(record._1.datum().getQuoteOrPolicy.get(0))

    combineRecords
  }
  match
  {
    case Success(map) => Right(map)
    case Failure(map) => Left(map)
  }
}
).cache()

2 个答案:

答案 0 :(得分:1)

所以,正如我发表评论一样 - 我认为你指的是没有打印的print语句,如果是这样的话,你会犯这样一个经典的错误:忘记你的println命令被执行了工作人员 - 在您的驱动程序上 - 因此您不会在驱动程序上看到它。查看工作人员的日志文件,您将看到您的打印语句;-)

答案 1 :(得分:0)

我觉得你在找错了地方! println将打印到本地输出。因此,由于第一个打印在驱动程序上运行,您可能会在启动的控制台上看到它。但是,在地图内部并非如此,代码正在群集上的某个位置运行。您需要检查本地日志。

或者,停止使用println,然后使用记录器。这会将所有内容记录到共享日志环境中。您仍然不会在群集模式下看到这一点,但至少所有内容都会集中整理到您的位置,从而节省您确定代码运行位置的工作。

相关问题