首先,很抱歉在这里提出了基本的疑问,但仍然可以解释下面的问题。
我对scala和spark非常陌生,所以我的疑问是,如果我编写一个独立的scala程序,并在spark(1 master 3 worker)上执行它,scala程序是否会利用干扰/并行处理,或者我是否需要编写一个单独的程序来获得分布式处理的优势??
例如,我们有一个scala代码,它将一个特定的格式化文件处理成逗号分隔的文件,它将一个目录作为输入,解析所有文件,并将输出写入单个文件(每个文件通常为100-200MB)。所以这是代码。
import scala.io.Source
import java.io.File
import java.io.PrintWriter
import scala.collection.mutable.ListBuffer
import java.util.Calendar
//import scala.io.Source
//import org.apache.spark.SparkContext
//import org.apache.spark.SparkContext._
//import org.apache.spark.SparkConf
object Parser {
def main(args:Array[String]) {
//val conf = new SparkConf().setAppName("fileParsing").setMaster("local[*]")
//val sc = new SparkContext(conf)
var inp = new File(args(0))
var ext: String = ""
if(args.length == 1)
{ ext = "log" } else { ext = args(1) }
var files: List[String] = List("")
if (inp.exists && inp.isDirectory) {
files = getListOfFiles(inp,ext)
}
else if(inp.exists ) {
files = List(inp.toString)
}
else
{
println("Enter the correct Directory/File name");
System.exit(0);
}
if(files.length <=0 )
{
println(s"No file found with extention '.$ext'")
}
else{
var out_file_name = "output_"+Calendar.getInstance().getTime.toString.replace(" ","-").replace(":","-")+".log"
var data = getHeader(files(0))
var writer=new PrintWriter(new File(out_file_name))
var record_count = 0
//var allrecords = data.mkString(",")+("\n")
//writer.write(allrecords)
for(eachFile <- files)
{
record_count += parseFile(writer,data,eachFile)
}
writer.close()
println(record_count +s" processed into $out_file_name")
}
//all func are defined here.
}使用scala.io文件(Source.fromFile).getLines读取特定目录中的文件
所以我怀疑上面的代码(独立的prg)可以在分布式spark系统上执行吗?我会得到并行处理的优势吗??
好的,如果使用sc读取文件,它会使用分布式处理吗?
val conf = new SparkConf().setAppName("fileParsing").setMaster("local[*]")
val sc = new SparkContext(conf)
...
...
for(eachFile <- files)
{
record_count += parseFile(sc,writer,data,eachFile)
}
------------------------------------
def parseFile(......)
sc.textFile(file).getLines因此,如果我编辑顶部代码来使用sc,那么它是否会在分布式spark系统上进行处理。
发布于 2016-04-27 00:38:30
不,不会的。要使用Spark进行分布式计算,你需要使用SparkContext。
发布于 2016-04-27 00:05:55
如果您使用spark-submit运行您提供的应用程序,那么您将根本不会使用集群。您必须重写它才能使用SparkContext。请通读Spark Programming Guide。
发布于 2016-05-05 18:42:41
在Youtube上观看一些介绍性视频对于了解Apache Spark的一般工作原理非常有帮助。
例如,这些:https://www.youtube.com/watch?v=7k4yDKBYOcw https://www.youtube.com/watch?v=rvDpBTV89AM&list=PLF6snu5Jy-v-WRAcCfWNHks7lcNO-zrTI&index=4
理解它对于使用Spark是非常重要的。
“分布式处理的优势”
使用Spark可以为您提供在多服务器集群上分布处理的优势。因此,如果您打算稍后将应用程序移动到集群中,那么使用Spark模型和相应的API开发应用程序是有意义的。
您可以在本地计算机上运行Spark应用程序,但在这种情况下,您将无法获得Spark所能提供的所有优势。
无论如何,正如前面所说,Spark是一个特殊的框架,它有自己的开发库。所以你必须使用Spark context和Spark API重写你的应用程序,也就是像RDDs或Dataframe这样的特殊对象和相应的方法。
https://stackoverflow.com/questions/36869984
复制相似问题