Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 从Spark RDD读取Kryo文件_Apache Spark_Kryo - Fatal编程技术网

Apache spark 从Spark RDD读取Kryo文件

Apache spark 从Spark RDD读取Kryo文件,apache-spark,kryo,Apache Spark,Kryo,我是Spark&Scala新手 我需要读取和分析Spark中的一个文件,该文件已在我的scala代码中使用Kryo序列化编写: import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.io.Output val kryo:Kryo = new Kryo() val output:Output = new Output(new FileOutputStream("filename.ext",true)) //

我是Spark&Scala新手

我需要读取和分析Spark中的一个文件,该文件已在我的scala代码中使用Kryo序列化编写:

import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.io.Output

val kryo:Kryo = new Kryo()
val output:Output = new Output(new FileOutputStream("filename.ext",true))

//kryo.writeObject(output, feed) (tested both line)
kryo.writeClassAndObject(output, myScalaObject)
这是一个伪代码,用于创建一个序列化了my对象(myScalaObject)的文件,这是一个复杂对象

该文件似乎写得很好,但当我在Spark RDD中阅读它时遇到了问题

Spark中的伪代码:

val conf = new SparkConf()
    .setMaster("local")
    .setAppName("My application")
    .set("spark.executor.memory", "1g")


conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrator", "myScalaObject")

val sc = new SparkContext(conf)

val file=sc.objectFile[myScalaObject]("filename.ext")

val counts = file.count()
当我尝试执行它时,我收到以下错误:

org.apache.spark.SparkException: 
Job aborted: Task 0.0:0 failed 1 times (most recent failure: 
Exception failure: java.io.IOException: file: filename.ext not a SequenceFile)
可以在Spark中读取这种类型的文件吗

如果此解决方案不可行,那么对于创建复杂的文件结构以在Spark中读取,什么是好的解决方案


谢谢

如果您想使用
对象文件
阅读,请使用
保存对象文件
写出数据

val myObjects: Seq[MyObject] = ...
val rddToSave = sc.parallelize(myObjects) // Or better yet: construct as RDD from the start.
rddToSave.saveAsObjectFile("/tmp/x")
val rddLoaded = sc.objectFile[MyObject]("/tmp/x")
或者,如
zsxwing
所述,您可以创建文件名的RDD,并使用
map
读取每个文件名的内容。如果要将每个文件读入单独的分区,请将文件名并行化为单独的分区:

def loadFiles(filenames: Seq[String]): RDD[Object] = {
  def load(filename: String): Object = {
    val input = new Input(new FileInputStream(filename))
    return kryo.readClassAndObject(input)
  }
  val partitions = filenames.length
  return sc.parallelize(filenames, partitions).map(load)
}

objectFile
用于加载保存为包含序列化对象的SequenceFile的
RDD
。为什么不使用Kryo读取对象并使用
parallel
生成
RDD
?@zsxwing谢谢,好主意,我试试。但是我有很多小文件(5-20mb),不想并行化文件的内容。有没有办法并行化文件名,然后每个服务器读取其文件?创建一个带有文件名的RDD,并使用
map
读取内容?@zsxwing我已经创建了一个带有文件名的RDD并并行化了,工作正常。谢谢,您现在也可以使用
sc.wholeTextFiles
。我得找个时间更新答案。