我开发了一个基于hadoop的解决方案来处理二进制文件。这使用经典的hadoop MR技术。二进制文件大约为10GB,分为73个HDFS块,写入映射进程的业务逻辑对这73个块中的每一个进行操作。我们在Hadoop中开发了一个customInputFormat和CustomRecordReader,它将key(intWritable)和value(BytesWritable)返回给map函数。该值只是HDFS块(bianry数据)的内容。业务逻辑知道如何读取此数据。
现在,我想在spark中移植此代码。我是spark的首发,可以在spark中运行简单的例子(wordcount,pi示例)。但是,无法直接在spark中处理binaryFiles的示例。我看到这个用例有两种解决方案。首先,避免使用自定义输入格式和记录阅读器。在spark中找到方法(方法)为这些HDFS块创建RDD,使用类似地图的方法将HDFS块内容提供给业务逻辑。如果这是不可能的,我想重新使用自定义输入格式和自定义阅读器使用一些方法,如HadoopAPI,HadoopRDD等。我的问题: - 我不知道第一种方法是否可行。如果可能,任何人都可以提供一些包含示例的指针吗?我正在尝试第二种方法,但非常不成功。这是我使用的代码片段
package org {
object Driver {
def myFunc(key : IntWritable, content : BytesWritable):Int = {
println(key.get())
println(content.getSize())
return 1
}
def main(args: Array[String]) {
// create a spark context
val conf = new SparkConf().setAppName("Dummy").setMaster("spark://<host>:7077")
val sc = new SparkContext(conf)
println(sc)
val rd = sc.newAPIHadoopFile("hdfs:///user/hadoop/myBin.dat", classOf[RandomAccessInputFormat], classOf[IntWritable], classOf[BytesWritable])
val count = rd.map (x => myFunc(x._1, x._2)).reduce(_+_)
println("The count is *****************************"+count)
}
}
}
请注意main方法中的print语句打印73,即块数,而map函数内的print语句打印0。
有人能说出我在哪里做错了吗?我认为我没有以正确的方式使用API,但未能找到一些文档/用法示例。
答案 0 :(得分:1)
一目了然的几个问题。您可以定义myFunc
,但请致电func
。您的myFunc
没有返回类型,因此您无法拨打collect()
。如果您的myFunc
确实没有返回值,则可以foreach
代替map
。
collect()
将RDD中的数据提取给驱动程序,以允许您在本地(在驱动程序上)对其进行处理。
答案 1 :(得分:1)
我在这个问题上取得了一些进展。我现在正在使用以下功能完成工作
var hRDD = new NewHadoopRDD(sc, classOf[RandomAccessInputFormat],
classOf[IntWritable],
classOf[BytesWritable],
job.getConfiguration()
)
val count = hRDD.mapPartitionsWithInputSplit{ (split, iter) => myfuncPart(split, iter)}.collect()
然而,我发布了另一个错误,我在这里发布了详细信息 Issue in accessing HDFS file inside spark map function
15/10/30 11:11:39 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 40.221.94.235): java.io.IOException: No FileSystem for scheme: spark
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2584)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)