我一直在尝试在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()
答案 0 :(得分:1)
所以,正如我发表评论一样 - 我认为你指的是没有打印的print语句,如果是这样的话,你会犯这样一个经典的错误:忘记你的println
命令被执行了工作人员 - 不在您的驱动程序上 - 因此您不会在驱动程序上看到它。查看工作人员的日志文件,您将看到您的打印语句;-)
答案 1 :(得分:0)
我觉得你在找错了地方! println将打印到本地输出。因此,由于第一个打印在驱动程序上运行,您可能会在启动的控制台上看到它。但是,在地图内部并非如此,代码正在群集上的某个位置运行。您需要检查本地日志。
或者,停止使用println,然后使用记录器。这会将所有内容记录到共享日志环境中。您仍然不会在群集模式下看到这一点,但至少所有内容都会集中整理到您的位置,从而节省您确定代码运行位置的工作。