Spark学习笔记

以下是读Learning Spark Lightning-Fast Big Data Analysis时做的翻译或笔记
持续更新...(先开个头,以后有没有时间再说...)
1.数据分析工具Spark介绍
2.下载Spark并尝试使用
7.在集群中运行Spark (用sbt打包Spark应用)



   使用机器环境:
   操作系统:Windows7
    scala:2.11.4
   

    这个章节我们将下载Spark并用本地模式(local mode)在单机上运行。这个章节适合任何初学者阅读,当然包括数据科学家和工程师。
    你可以用Python、Java或Scala编写Spark应用,要看懂本教程中的代码你不需要精通某一种语言,但是你应该了解一种语言的基本语法。我们将尽可能用包含这三种语言版的例子(译者注:以下将主要翻译Scala版,以节约时间)。
    Spark本身是用Scala语言编写的,运行在Java虚拟机上,所以要运行Spark你需要先安装Java 6(或更新的版本)。如果你想用Python API编写Spark应用你还需要安装Python运行环境(2.6版本或更新),注意Spark不支持Python3。
   
   
下载Spark
        首先我们需要下载Spark并解压。这里将下载一个已编译好的最新版本。用浏览器访问http://spark.apache.org/downloads.html,  选择包类型为 “Pre-build for Hadoop2.4 and later",然后选择”Direct Download“,点击下面链接开始下载一个名为 spark-1.2.0-bin-hadoop2.4.tgz的压缩包。(译者注:当前最新版本已是1.3.0,下载的压缩包名为spark-1.3.0-bin-hadoop2.4.tgz)


        小贴士:
        如果你要在Windows系统上安装Spark,请不要安装在带有空格的目录下。
        不安装Hadoop也可以运行Spark,如果你已经安装了Hadoop,那么你需要选择与你安装Hadoop版本对应的Spark下载包。
       如果你的操作系统不支持解压TAR包,你可以在网络上选择支持解压TAR包的免费工具,如:Windows环境下的7-zip。

        下载好后解压,并进入解压目录,你将看到如下文件(目录):
         README.md
                包含如何运行Spark的简短教程。
         bin
                包含一些操作Spark的可执行文件(例如:我们将在稍后介绍的Spark Shell)
        core,streaming,python,...
                包含Spark组件的源码。
        examples
                包含一些有用的Spark standalone方式的例子,你可以运行这些例子以学习相关API。

        不要被这么多文件吓到,不要急,我们将在后续章节慢慢介绍。现在,让我们开始尝试使用Spark Shell运行一些例子,然后我们再自己编写,编译,运行一个简单的Spark应用。
        本章节的所有例子将使用Spark本地模式(local mode)运行,不是分布式运行,只需要一台机器。Spark支持多种运行模式,除了本地模式还可以运行在Apache Mesos、Hadoop Yarn上,还有Spark提供的Standalone Scheduler 模式。我们在第7章详细这几种运行模式。

        Spark Shell介绍:
        Spark Shell可以用于即席数据分析,如果你用过其他Shell如R、Python、Scala或者操作系统Shell如Bash、Windows命令行你会发现Spark Shell与这些有些类似,不同的是这些Shell只能操作单台机器上内存和磁盘而通过Spark Shell你可以操作多台机器的内存和磁盘——Spark会自动把这些处理任务分发到多台机器执行。
        Spark通过将数据加载到Worker节点内存中运行,这样多个甚至一个集群就可以在几秒中内处理分布在多台机器上的TB级别的数据。这样才使Spark Shell很适合做迭代、即席、统计分析。Spark提供Python和Scala两种Shell并且都支持机器操作。

        小贴士
         本教程的大多数例子都有Python、Scala、Java版本,但Spark Shell相关的只有Python、Scala版本。通过Spark Shell可以很好的学习Spark API,我们建议您选择Python或Scala学习。

        领略Spark Shell的最简单方式是用它做一个简单的数据分析。可以参考Spark官网的 Quick Start Guide.
        运行bin/spark-shell启动Spark Scala Shell 或者运行 bin/pyspark启动Spark Python Shell。Shell启动需要几秒钟的时间,运行过程中会显示出很多日志信息。启动画面:

小贴士
    如果你觉得打印出的日志太多太乱,你可以在/conf目录下复杂log4j.properties.template到log4j.properties,并修改其中的log4j.rootCategory=INFO,console为:
    log4j.rootCategory=WARN,console
    再次启动Shell日志就少多了。
    Windows如果报Failed to initialize compiler: object scala.runtime in compiler mirror not found.  可以修改bin/spark-class2.cmd 的92~96行(当前版本为Spark1.3.0 版本不同可能会有差异)添加-Dscala.usejavacp=true,修改后的内容为:


    在Spark中我们通过操作弹性分布式数据集(RDDs)在分布式环境中进行运算。RDDs是Spark对分布式数据计算的抽象。

    在介绍RDDs前我们先通过Spark Shell和本地文本文件创建一个RDDs并做些简单的即席分析。在Shell中输入:

你可以按Ctrl+D退出Shell。


Spark主要概念介绍
    我们已经用Spark Shell运行了我们第一个Spark程序,接下来我们需要了解更多的细节。
    简单的说每个Spark应用都包含一个用来在集群上启动多个并行操作的Driver程序(driver program)。Driver程序包含应用的主函数并定义了数据集怎么在集群上分布。在 上个例子中Driver程序就是Spark Shell,你只需要输入些操作让它执行。
    Driver程序通过SparkContext对象访问Spark集群,在Shell中会自动创建SparkContext对象,并赋值给sc变量。
    有了SparkContext你就可以创建RDDS了。在上面的例子中我们调用sc.textFile()创建了一个包含文本文件中所有行的RDD。然后我们可以对这个RDD执行很多操作,如count();Driver程序为了运行这些操作管理了很多计算节点,这些节点被称为executors。例如,当我们执行count()操作时,可能有很多台机器在同时计算文件的不同区域的行数。因为我们是本地模式运行Shell的所以只有一个机器在计算,当然你可以用Shell链接集群以并行分析数据。下图显示exector在集群上的分布情况:



写一个独立的(不用Spark Shell的)应用

    你可以用Java、Scala或者Python编写独立的Spark应用,与用Shell编写不同的是你需要自己创建SparkContext,其它的都一样。

1.首先创建项目目录 SparkFirst (路径中最好不要包含中文或空格)
2.进入项目目录 创建src/main/scala/spark/learn/first/WordCount.scala文件,并编写代码:

package spark.learn.first

/*引入相关的类*/
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._

object WordCount{
def main(args:Array[String]) {
    val inputFile = args(0);//文件路径 在运行时传入
    val conf = new SparkConf().setMaster("local").setAppName("wordCount");
    val sc = new SparkContext(conf);
  
    val input = sc.textFile(inputFile);//根据传入的文件路径读取文件
    //分别计算文件中包含字母A和B的字数
    val numAs = input.filter(line=>line.contains("a")).count()
    val numBs = input.filter(line=>line.contains("b")).count()
    println("Lines with a:%s,Lines with b:%s".format(numAs,numBs))

}

}

这种应该是创建SparkContext的最简单方式,只需要设置俩个参数:
    集群URL:这里我们传人的是local,local表明是在本机上以单线程方式运行的Spark,而不是集群方式。
    应用名称:这里命名为My App。这个用于在Spark管理界面中区分不同的应用。

3.在项目目录下新建build.sbt文件(用于设置SBT构建时相关参数及项目依赖),内容为:
name := "learning-spark-mini-example"  //设置构建的Jar包名称

version := "0.0.1" //项目版本号

scalaVersion := "2.11.4" //所用scala版本号

libraryDependencies ++= Seq( //设置项目依赖   这里需要用到spark-core包
"org.apache.spark" % "spark-core_2.11" % "1.3.0" % "provided"
)

//添加Maven仓库配置,最好添加上,因为默认的国外地址访问很慢的,你懂的
resolvers += Resolver.mavenLocal

resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"

resolvers += "oschina nexus" at "http://maven.oschina.net/content/groups/public/"
4.在项目根目录下运行 sbt clean package 开始构建Jar包
构建完成后就可以在项目目录/target/scala-xxxx/下找到生成的jar包
5.复制上一步生成的jar包到 Spark根目录下,并在此目录下运行

.\bin\spark-submit --class spark.learn.first.WordCount .\learning spark-mini-example_2.11-0.0.1.jar "README.md"

运行成功后输出:


D:\spark\spark-1.3.0-bin-hadoop2.4\spark-1.3.0-bin-hadoop2.4>.\bin\spark-submit
.\learning-spark-mini-example_2.11-0.0.1.jar "README.md"
15/04/05 16:16:33 WARN NativeCodeLoader: Unable to load native-hadoop library fo
r your platform... using builtin-java classes where applicable
15/04/05 16:16:36 WARN SizeEstimator: Failed to check whether UseCompressedOops
is set; assuming yes
Lines with a:60,Lines with b:29


小贴士:
        如果构建过程中提示字符乱码问题 ,可以去除程序及配置文件中的中文
        如果运行过程中提示:
        15/04/05 15:11:55 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.NullPointerException
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010)
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:445)
        at org.apache.hadoop.util.Shell.run(Shell.java:418)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:
650)
        at org.apache.hadoop.fs.FileUtil.chmod(FileUtil.java:873)
        at org.apache.hadoop.fs.FileUtil.chmod(FileUtil.java:853)
        at org.apache.spark.util.Utils$.fetchFile(Utils.scala:442)
        at org.apache.spark.executor.Executor$$anonfun$org$apache$spark$executor
$Executor$$updateDependencies$5.apply(Executor.scala:374)
        at org.apache.spark.executor.Executor$$anonfun$org$apache$spark$executor
$Executor$$updateDependencies$5.apply(Executor.scala:366)
       
解决方法可以参考:
         http://download.csdn.net/detail/yirenhe/8188513
         http://blog.csdn.net/congcong68/article/details/4204309

总结
    这一章我们下载了Spark并在笔记本上以local模式运行。我们还大致了解下核心概念:Driver程序创建SparkContext和RDDs,然后以并行的方式操作RDDs.。在接下来的章节更深入的介绍RDDs操作。














猜你喜欢

转载自huanqinghappy-yahoo-cn.iteye.com/blog/2198173