Spark DataFrame 在 yarn-client 模式下丢失字符串数据

Spark DataFrame losing string data in yarn-client mode

由于某种原因,如果我要添加新列、将字符串附加到现有 data/column 或从代码创建新的 DataFrame,它会误解字符串数据,因此 show() 无法正常工作,过滤器(例如如 withColumn、where、when 等)在 ether 上不起作用。

示例代码如下:

object MissingValue {
  def hex(str: String): String = str.getBytes("UTF-8").map(f => Integer.toHexString((f&0xFF)).toUpperCase).mkString("-")

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("MissingValue")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val list = List((101,"ABC"),(102,"BCD"),(103,"CDE"))
    val rdd = sc.parallelize(list).map(f => Row(f._1,f._2))
    val schema = StructType(StructField("COL1",IntegerType,true)::StructField("COL2",StringType,true)::Nil)
    val df = sqlContext.createDataFrame(rdd,schema)
    df.show()

    val str = df.first().getString(1)
    println(s"${str} == ${hex(str)}")

    sc.stop()
  }
}

如果我 运行 它处于本地模式,那么一切都会按预期进行:

+----+----+
|COL1|COL2|
+----+----+
| 101| ABC|
| 102| BCD|
| 103| CDE|
+----+----+

ABC == 41-42-43

但是当我在 yarn-client 模式下 运行 相同的代码时,它会产生:

+----+----+
|COL1|COL2|
+----+----+
| 101| ^E^@^@|
| 102| ^E^@^@|
| 103| ^E^@^@|
+----+----+

^E^@^@ == 5-0-0

此问题仅存在于字符串值,因此第一列(整数)没问题。

此外,如果我从数据帧创建 rdd,那么一切都很好 i.e. df.rdd.take(1).apply(0).getString(1)

我正在使用来自 CDH 5.5.2 的 Spark 1.5.0

编辑: 似乎当驱动程序内存和执行程序内存之间的差异太大时会发生这种情况 --driver-memory xxG --executor-memory yyG 即当我减少执行程序内存或增加驱动程序内存时问题就消失了。

这是一个与执行程序内存和 Oops 大小相关的错误:

https://issues.apache.org/jira/browse/SPARK-9725
https://issues.apache.org/jira/browse/SPARK-10914
https://issues.apache.org/jira/browse/SPARK-17706

已在 Spark 1.5.2 版本中修复