了解spark前应学习hadoop体系和scala语言
1. 概念
Spark是一种快速、通用、可扩展的大数据分析引擎
spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLlib等子项目
**2.**Spark特点
2.1****快
与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。
2.2****易用
Spark支持Java、Python和Scala的API,还支持超过80种高级算法
2.3****通用
Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。
2.4****兼容性
Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器
**3.**执行Spark程序
3.1****spark-submit 可以提交任务到 spark 集群执行
该算法是利用蒙特·卡罗算法求PI
/usr/local/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/usr/local/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar \
100
spark-submit**/shell** 详细参数说明
参数名 | 参数说明 |
---|---|
–master | master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local |
–deploy-mode | 在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client |
–class | 应用程序的主类,仅针对 java 或 scala 应用 |
–name | 应用程序的名称 |
–jars | 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下 |
–packages | 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标 |
–exclude-packages | 为了避免冲突 而指定不包含的 package |
–repositories | 远程 repository |
–conf PROP=VALUE | 指定 spark 配置属性的值, 例如 -conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m" |
–properties-file | 加载的配置文件,默认为 conf/spark-defaults.conf |
–driver-memory | Driver内存,默认 1G |
–driver-java-options | 传给 driver 的额外的 Java 选项 |
–driver-library-path | 传给 driver 的额外的库路径 |
–driver-class-path | 传给 driver 的额外的类路径 |
–driver-cores | Driver 的核数,默认是1。在 yarn 或者 standalone 下使用 |
–executor-memory | 每个 executor 的内存,默认是1G |
–total-executor-cores | 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用 |
–num-executors | 启动的 executor 数量。默认为2。在 yarn 下使用 |
–executor-core | 每个 executor 的核数。在yarn或者standalone下使用 |
3.2****启动Spark Shell
/usr/local/spark-1.6.1-bin-hadoop2.6/bin/spark-shell \
--master spark://node01:7077 \
--executor-memory 2g \
--total-executor-cores 2
与spark submit同
4. spark shell编写WordCount程序
1.首先启动hdfs
2.向hdfs上传一个文件到hdfs://node01:9000/words.txt
3.在spark shell中用scala语言编写spark程序
sc.textFile("hdfs://node01:9000/words.txt").flatMap(_.split(" "))
.map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://node01:9000/out")
4.使用hdfs命令查看结果
hdfs dfs -ls hdfs://node01:9000/out/p*
5.spark程序 WC
//scala编写
object SparkWC {
def main(args: Array[String]): Unit = {
// 首先创建SparkConf 配置文件对象
// SetAPPName 表示设置应用程序名字
// local 用一个线程来模拟集群运行
// local[2] 用两个线程来模拟集群运行
// local[*] 用所有的空闲线程模拟集群运行
// 将任务打包到集群进行运行。 将setMaster去掉,表示不是本地运行
val conf = new SparkConf().setAppName("SparkWC")
// 创建SparkContext上下文,也就是集群的执行入口
val sc = new SparkContext(conf)
// 读取本地文件, 如果我们不传入分区数的话,底层将默认分配两个分区
val lines: RDD[String] = sc.textFile(args(0))
// 进行单词的统计,首先调用flatMap算子,进行切分压平
val words: RDD[String] = lines.flatMap(_.split(" "))
// 调用map算子 ,进行单词的统计
val wc: RDD[(String, Int)] = words.map((_,1))
// 进行聚合操作
val reduces: RDD[(String, Int)] = wc.reduceByKey(_+_)
// 进行数据排序(按照value值排序)
val sortwc: RDD[(String, Int)] = reduces.sortBy(_._2,false)
// 将数据结果打印
//println(sortwc.collect().toBuffer)
// 将数据结果保存到hdfs上面
sortwc.saveAsTextFile(args(1))
// 关闭程序
sc.stop()
}
}