spark数据分析
Spark是一个新兴的大数据分析解决方案,旨在使用内存处理实现高效的群集计算。 它的目标使用模型包括那些包含迭代算法的模型(即那些可以从将数据保留在内存中而不是推送到更高延迟的文件系统中受益的模型)。 在完成这些练习之前,请确保您完全了解用于集群计算的Spark方法及其与Hadoop的区别。 在最近的配套文章Spark中了解Spark的背景和用法,Spark 是快速数据分析的替代方法 。
这些练习可为您提供以下方面的练习:
这套练习需要Linux®的一些基本知识,包括安装新应用程序的能力。 了解Scala语言是有益的,但不是必需的。 您必须按顺序执行这些练习,因为它们说明了必要软件包的安装。
首先安装Scala语言。 根据您的平台,安装Scala的过程会有所不同。 在最坏的情况下,您可以下载源代码树并执行构建和安装。
安装完毕后,启动斯卡拉解释(本文的姊妹篇,“星火,用于快速数据分析替代方案,”在展示相关信息 ),尝试一些例子(从人数1至3 ),并确认结果。
Scala的一个有趣功能是它的集合库。 Scala中的集合是零个其他事物的容器,例如列表,集合或地图。 这个概念与Spark有关,因为它的分布式数据集可以像本地集合一样进行操作。 您可以在Scala 2.8 Collections API中了解有关Scala集合的更多信息。 仔细阅读本参考资料,以了解如何创建数组和列表集合。
执行以下步骤:
int
数组,并对其应用reverse
方法以反转其内容。 下载最新版本的Spark。 最简单的方法是通过git
:
$ git clone git://github.com/mesos/spark.git
此命令行将导致一个名为./spark的新子目录。 cd
进入此子目录。 现在,使用简单的构建工具( sbt
)更新和编译发行sbt
:
$ sbt/sbt update compile
这样做会导致除了编译大量Scala源代码外还下载了几个软件包。 要完成配置,请进入./spark/conf子目录,将spark- env.sh -template重命名为spark-env.sh,然后添加以下行:
export SCALA_HOME=/opt/scala-2.9.1.final
还要记住将SCALA_HOME / bin添加到您的PATH中。
现在已经安装了Spark,在本地主机上使用一个线程运行SparkPi示例程序。 使用随附的文章作为完成此任务的指南。 (参见文章,“星火,用于快速数据分析替代方案,” 相关主题 。)
本练习探讨了多线程和Spark的区别。 使用SparkPi示例程序,您可以更改与特定执行关联的线程数。
使用参考文章作为指南,在本地上下文中试验threads
参数,并注意执行时间的差异。
Spark支持多种配置元素,可实现更高的性能。 考虑带有Mesos的Spark的集群配置:
根据您的Scala和Spark版本,某些输出可能会有所不同。
执行Scala的安装,然后尝试一些示例(如清单1所示 )。 在“ 相关主题 ”中的随附文章“ Spark,快速数据分析的替代方法”中,您可以了解如何从其分发版本安装Scala并使其易于访问。 您可以将导出添加到您的环境中以使其持久化。
$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
$ sudo tar xvfz scala-2.9.1.final.tgz --directory /opt
$ export SCALA_HOME=/opt/scala-2.9.1.final
$ export PATH=$SCALA_HOME/bin:$PATH
$ echo $PATH
/opt/scala-2.9.1.final/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$
$ scala
Welcome to Scala version 2.9.1.final (OpenJDK Client VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def square(x: Int) = x*x
square: (x: Int)Int
scala> square(3)
res0: Int = 9
scala> square(res0)
res1: Int = 81
scala> :quit
$
对于这些示例,请使用Scala解释器来验证您的结果。 清单2提供了数组练习的解决方案。
scala> val numbers = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
numbers: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> numbers.reverse
res1: Array[Int] = Array(9, 8, 7, 6, 5, 4, 3, 2, 1)
scala>
清单3提供了清单练习的解决方案。
scala> val animals = List("dog", "cat", "mouse")
animals: List[java.lang.String] = List(dog, cat, mouse)
scala> animals foreach println
dog
cat
mouse
scala> for (elem <- animals) println(elem)
dog
cat
mouse
scala>
您可以通过./run
命令执行SparkPi测试,并指定应用程序和主机/切片。 清单4中执行了此任务。
$ ./run spark.examples.SparkPi local
12/01/23 20:55:33 INFO spark.CacheTrackerActor: Registered actor on port 7077
12/01/23 20:55:33 INFO spark.MapOutputTrackerActor: Registered actor on port 7077
12/01/23 20:55:33 INFO spark.SparkContext: Starting job...
12/01/23 20:55:33 INFO spark.CacheTracker: Registering RDD ID 0 with cache
12/01/23 20:55:33 INFO spark.CacheTrackerActor: Registering RDD 0 with 2 partitions
12/01/23 20:55:33 INFO spark.CacheTrackerActor: Asked for current cache locations
12/01/23 20:55:33 INFO spark.LocalScheduler: Final stage: Stage 0
12/01/23 20:55:33 INFO spark.LocalScheduler: Parents of final stage: List()
12/01/23 20:55:33 INFO spark.LocalScheduler: Missing parents: List()
12/01/23 20:55:33 INFO spark.LocalScheduler: Submitting Stage 0, has no missing parents
12/01/23 20:55:33 INFO spark.LocalScheduler: Running task 0
12/01/23 20:55:33 INFO spark.LocalScheduler: Size of task 0 is 1481 bytes
12/01/23 20:55:34 INFO spark.LocalScheduler: Finished task 0
12/01/23 20:55:34 INFO spark.LocalScheduler: Running task 1
12/01/23 20:55:34 INFO spark.LocalScheduler: Completed ResultTask(0, 0)
12/01/23 20:55:34 INFO spark.LocalScheduler: Size of task 1 is 1481 bytes
12/01/23 20:55:34 INFO spark.LocalScheduler: Finished task 1
12/01/23 20:55:34 INFO spark.LocalScheduler: Completed ResultTask(0, 1)
12/01/23 20:55:34 INFO spark.SparkContext: Job finished in 0.3042134 s
Pi is roughly 3.13768
$
使用local
(主机)参数可以轻松地指定使用不同线程数执行SparkPi测试程序。 指定的数字是与运行关联的线程数。 当然,这取决于系统中硬件线程的数量,其运行方式有所不同。 清单5中的解决方案说明了一个和两个线程的执行。
如图所示,第一次使用一个线程运行需要0.59秒,而第二次使用两个线程则需要0.9秒。 您的速度可能会有所不同。
$ ./run spark.examples.SparkPi local[1]
12/01/24 18:50:41 INFO spark.CacheTrackerActor: Registered actor on port 7077
12/01/24 18:50:41 INFO spark.MapOutputTrackerActor: Registered actor on port 7077
12/01/24 18:50:41 INFO spark.SparkContext: Starting job...
12/01/24 18:50:41 INFO spark.CacheTracker: Registering RDD ID 0 with cache
12/01/24 18:50:41 INFO spark.CacheTrackerActor: Registering RDD 0 with 2 partitions
12/01/24 18:50:41 INFO spark.CacheTrackerActor: Asked for current cache locations
12/01/24 18:50:41 INFO spark.LocalScheduler: Final stage: Stage 0
12/01/24 18:50:41 INFO spark.LocalScheduler: Parents of final stage: List()
12/01/24 18:50:41 INFO spark.LocalScheduler: Missing parents: List()
12/01/24 18:50:41 INFO spark.LocalScheduler: Submitting Stage 0, has no missing parents
12/01/24 18:50:41 INFO spark.LocalScheduler: Running task 0
12/01/24 18:50:41 INFO spark.LocalScheduler: Size of task 0 is 1481 bytes
12/01/24 18:50:42 INFO spark.LocalScheduler: Finished task 0
12/01/24 18:50:42 INFO spark.LocalScheduler: Running task 1
12/01/24 18:50:42 INFO spark.LocalScheduler: Size of task 1 is 1481 bytes
12/01/24 18:50:42 INFO spark.LocalScheduler: Completed ResultTask(0, 0)
12/01/24 18:50:42 INFO spark.LocalScheduler: Finished task 1
12/01/24 18:50:42 INFO spark.LocalScheduler: Completed ResultTask(0, 1)
12/01/24 18:50:42 INFO spark.SparkContext: Job finished in 0.595091783 s
Pi is roughly 3.12736
$ ./run spark.examples.SparkPi local[2]
12/01/24 18:50:46 INFO spark.MapOutputTrackerActor: Registered actor on port 7077
12/01/24 18:50:46 INFO spark.CacheTrackerActor: Registered actor on port 7077
12/01/24 18:50:46 INFO spark.SparkContext: Starting job...
12/01/24 18:50:46 INFO spark.CacheTracker: Registering RDD ID 0 with cache
12/01/24 18:50:46 INFO spark.CacheTrackerActor: Registering RDD 0 with 2 partitions
12/01/24 18:50:46 INFO spark.CacheTrackerActor: Asked for current cache locations
12/01/24 18:50:46 INFO spark.LocalScheduler: Final stage: Stage 0
12/01/24 18:50:46 INFO spark.LocalScheduler: Parents of final stage: List()
12/01/24 18:50:46 INFO spark.LocalScheduler: Missing parents: List()
12/01/24 18:50:46 INFO spark.LocalScheduler: Submitting Stage 0, has no missing parents
12/01/24 18:50:46 INFO spark.LocalScheduler: Running task 0
12/01/24 18:50:46 INFO spark.LocalScheduler: Running task 1
12/01/24 18:50:46 INFO spark.LocalScheduler: Size of task 0 is 1481 bytes
12/01/24 18:50:46 INFO spark.LocalScheduler: Size of task 1 is 1481 bytes
12/01/24 18:50:46 INFO spark.LocalScheduler: Finished task 1
12/01/24 18:50:46 INFO spark.LocalScheduler: Finished task 0
12/01/24 18:50:46 INFO spark.LocalScheduler: Completed ResultTask(0, 0)
12/01/24 18:50:46 INFO spark.LocalScheduler: Completed ResultTask(0, 1)
12/01/24 18:50:46 INFO spark.SparkContext: Job finished in 0.098092002 s
Pi is roughly 3.14388
$
请注意,您可以提供一个要连接的Mesos主机,而不是local
,以支持节点群集,而不是单个节点上的多个线程(性能更高的选项)。
要弄清楚您可能如何使用硬件线程(虚拟CPU),请运行以下命令行:
$ grep processor /proc/cpuinfo
尽管Spark配置文件(./conf/spark-env.sh)定义了环境的关键元素,但一个选项( SPARK_MEM
)指定了每个节点的Java™虚拟机支持多少内存。 鉴于Spark专注于内存数据集,更多的内存将导致性能提高(取决于工作负载)。
根据Spark常见问题解答中的定义,某些数据集可能无法完全容纳在内存中。 发生这种情况时,Spark会重新计算不适合的分区(默认),或者如果已配置,则将该分区缓存到磁盘。 要将分区溢出到磁盘而不是重新计算,请使用spark.DiskSpillingCache
属性。
翻译自: https://www.ibm.com/developerworks/opensource/library/l-sparkdataanalysis/index.html
spark数据分析