Spark
简介
spark: 一个基于内存的,分布式的大数据处理框架(计算引擎)
中文官网: http://spark.apachecn.org/docs/cn/2.2.0/
比较Hadoop
中间结果的存储,spark优先使用内存,hadoop 使用磁盘
spark的容错性更高。RDD,底层实现不一样 DAG
spark更加通用,mapreduce只有两个API map reduce,
spark提供了更丰富的编程API map flatMap filter 等
支持的语言更多, spark: scala, java, python, R
**注意**spark并不是替代hadoop,而是替代了mapreduce编程模型,可以兼容hadoop
优点
速度快(基于内存)
易用性
4种语言的api,scala,python,java,R
通用性
一站式解决方案, 离线处理 结构化数据处理,实时处理, mllib,图计算等
兼容性
spark可以和大数据生态圈中的一些组件无缝对接
四种部署模式
- Local模式
- standalone模式
- Spark on yarn
- Spark on mesos(mesos也是一个资源调度平台,同yarn )
安装
# 解压
tar -zxvf spark-2.2.0-bin-hadoop2.7
#########################################################################
# 修改配置文件
cd spark-2.2.0-bin-hadoop2.7/conf
mv spark-env.sh.template spark-env.sh
vi spark-env.sh
#添加变量信息
export JAVA_HOME=/usr/local/jdk
#指定spark-master 所在主机
export SPARK_MASTER_HOST=linux11
#指定spark-master 所在主机rpc端口,默认为7077
export SPARK_MASTER_HOST=7077
##########################################################################
#指定woker所在主机,方便使用脚本sbin/start-all.sh启动集群
mv slaves.template slaves
vi slaves #确保删除里面所有内容
linux12
linux13 #三台worker主机
linux14
########################################################################
#将配置同步到其他几台服务器
for i in 2 3 4 ;
do
scp -r spark-2.2.0-bin-hadoop2.7/ linux1$i:$PWD ;
done
启动并验证
第一种(单个启动)
#启动master ./sbin/start-master.sh #启动slaves ./sbin/start-slaves.sh
第二种(一键启动)
./sbin/start-all.sh
访问:http://linux11:8080 查看页面验证
提交spark任务命令
#第一种(练习使用,交互式命令)
./sbin/spark-shell --master spark://linux11:7077
#第二种
./sbin/spark-submit --master spark://linux11:7077 --class com.xxx.Main /root/xxx.jar args
官网测试程序example,计算圆周率
./sbin/spark-submit –master spark://linux11:7077 –class org.apache.spark.examples.SparkPi /root/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 1000
第一个Spark程序(wordcount)
/**
* 统计词频
*/
object WordCount{
def main(args:Array[String]){
if (args.length != 2) {
println("Usage : ScalaWordCount <input> <output>")
sys.exit(1)
}
val Array(input, output) = args
val conf = new SparkConfig()
//.setMaster("local[*]") //local模式下使用
//.setAppName(this.getClass.getSimpleName)
//创建sprkcontext实例
val sc:SparkContext = new SparkContext(conf)
//获取文件内容
val file: RDD[String] = sc.textFile(input)
val splitedrdd: RDD[String] = file.flatMap(_.split(" "))
// 组装
val wordWithOne: RDD[(String, Int)] = splitedrdd.map((_, 1))
//统计词频
val result: RDD[(String, Int)] = wordWithOne.reduceByKey(_ + _)
// 排序
val finalRes: RDD[(String, Int)] = result.sortBy(-_._2)
// 把结果数据写入到hdfs中
finalRes.saveAsTextFile(output)
//关闭资源
sc.stop()
}
}
#上传到集群上面运行
spark-submit --master spark://linux11:7077 --class com.test.WordCount /root/wordcount.jar hdfs://linux11:9000/wordcount/input hdfs://linux11:9000/wordcount/output