使用Custom Hadoop输入格式在Spark中处理二进制文件

时间:2015-10-27 16:51:55

标签: scala hadoop apache-spark

我开发了一个基于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​​,但未能找到一些文档/用法示例。

2 个答案:

答案 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)