本篇使用 Spark 2.3.0
Apache Spark是一个快速且通用的集群计算系统。它提供Java,Scala,Python和R中的高级API以及支持通用执行图的优化引擎。它还支持一组丰富的更高级别的工具,包括 Spark SQL , MLlib, GraphX,Spark Streaming.。
Spark运行在Java 8+,Python 2.7 + / 3.4 +和R 3.1+上。对于Scala API,Spark 2.3.0使用Scala 2.11。
下载地址 http://spark.apache.org/downloads.html
下载完上传到Linux服务器上解压
配置环境变量,在 Yarn 上运行 Spark 需要配置 HADOOP_CONF_DIR、 YARN_CONF_DIR 和 HDFS_CONF_DIR 环境变量
vim /etc/profile
export SPARK_HOME=/home/chs/software/spark-2.3.0-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
source /etc/profile
Spark带有几个示例程序。Scala,Java,Python和R例子都在 examples/src/main目录中。
./bin/run-example SparkPi 10
其内部调用了更通用的 spark-submit 脚本来启动应用程序
例子是启动10个任务来计算pi,最后可以看到
2018-06-10 16:27:12 INFO DAGScheduler:54 - ResultStage 0 (reduce at SparkPi.scala:38) finished in 4.646 s
2018-06-10 16:27:13 INFO DAGScheduler:54 - Job 0 finished: reduce at SparkPi.scala:38, took 10.371892 s
Pi is roughly 3.1405471405471403
运行shell
./bin/spark-shell --master local[2]
–master选项指定分布式群集的 主URL,或者local使用一个线程local[N]在本地运行,或者使用N个线程在本地运行
运行后可以看到
Spark context Web UI available at http://master:4041
Spark context available as 'sc' (master = local[*], app id = local-1528620165516).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.0
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_172)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Spark是使用Scala语言编写的,不过支持使用java,pyhon,scala等编写应用程序。这里使用Scala做下练习。
Spark的主要抽象是一个称为数据集的分布式项目集合。数据集可以通过Hadoop InputFormats(例如HDFS文件)或通过转换其他数据集来创建。下面从Spark源目录中的自述文件中创建一个新的数据集
从新起个命令台,把spark解压目录下面的README.md文件上传到hdfs上
[root@master spark-2.3.0-bin-hadoop2.7]# hadoop fs -mkdir /user/root/
[root@master spark-2.3.0-bin-hadoop2.7]# hadoop fs -put README.md /user/root/
创建一个数据集
scala> val textFile = spark.read.textFile("README.md")
2018-06-10 17:08:08 WARN ObjectStore:6666 - Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
2018-06-10 17:08:08 WARN ObjectStore:568 - Failed to get database default, returning NoSuchObjectException
2018-06-10 17:08:09 WARN ObjectStore:568 - Failed to get database global_temp, returning NoSuchObjectException
textFile: org.apache.spark.sql.Dataset[String] = [value: string]
textFile 就是我们创建的数据集,我们可以对它操作,比如查看行数,查看第一行
scala> textFile.count()
res2: Long = 103
scala> textFile.first()
res3: String = # Apache Spark
scala>
下面将这个数据集转换成一个新的数据集。我们调用filter返回一个新的数据集,过滤出来含有“Spark”的行
scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark: org.apache.spark.sql.Dataset[String] = [value: string]
查看一下行数
scala> linesWithSpark.count()
res4: Long = 20
找到一行最多有多少个单词
scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
res5: Int = 22
Spark还支持将数据集拉入集群范围的内存中缓存。
scala> linesWithSpark.cache()
res6: linesWithSpark.type = [value: string]
scala> linesWithSpark.count()
res7: Long = 20
scala> linesWithSpark.count()
res8: Long = 20
上面的例子中,我们设置了缓存,运行linesWithSpark.count()
的时候,可以明显的看到第二次比第一次快很多。
上面是在一台机器上运行的 现在搭建spark集群
进入到spark解压目录下的conf文件夹下 配置slaves文件 ,将 slaves.template 拷贝到 slaves
cp slaves.template slaves
slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成从节点
slave
slave2
配置spark-env.sh文件,将 spark-env.sh.template 拷贝到 spark-env.sh
cp spark-env.sh.template spark-env.sh
编辑spark-env.sh,添加如下内容:
export SPARK_DIST_CLASSPATH=$(/home/chs/hadoop-2.7.3/bin/hadoop classpath)
export HADOOP_CONF_DIR=/home/chs/hadoop-2.7.3/etc/hadoop
export SPARK_MASTER_IP=192.168.1.76
SPARK_MASTER_IP 指定 Spark 集群 Master 节点的 IP 地址;
配置完成后将spark解压文件分别复制道从节点slave 和 slave2上
scp -r spark-2.3.0-bin-hadoop2.7 slave:/home/chs/sortware
scp -r spark-2.3.0-bin-hadoop2.7 slave2:/home/chs/sortware
启动Hadoop集群,启动Spark集群前,要先启动Hadoop集群。
start-all.sh
启动Master节点 , 在Master节点主机上运行如下命令
sbin/start-master.sh
在Master节点上运行jps命令,可以看到多了个Master进程:
6374 ResourceManager
6184 SecondaryNameNode
8440 Jps
6826 Master
5963 NameNode
启动所有Slave节点 , 在Master节点主机上运行如下命令:
sbin/start-slaves.sh
分别在slave、slave2节点上运行jps命令,可以看到多了个Worker进程
4202 DataNode
5450 Jps
4333 NodeManager
5374 Worker
这个地方运行sbin/start-slaves.sh
的时候开始出了个错误 JAVA_HOME is not set
解决办法:
进入 sbin 目录 编辑 spark-config.sh文件
在里面加入 export JAVA_HOME=/home/chs/java/jdk1.8.0_172
在运行就好了
在浏览器上查看Spark独立集群管理器的集群信息
在master主机上打开浏览器,访问http://master:8080,如下图:
OK配置完毕!
关闭集群
sbin/stop-master.sh
sbin/stop-slaves.sh
stop-all.sh
在集群上运行spark自带的demo
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster examples/jars/spark-examples_2.11-2.3.0.jar
bin/spark-submit
–class org.apache.spark.examples.SparkPi //class后面是需要运行的程序主类 应用程序的入口
–master yarn-cluster //master 可以使用spark自带的管理器 这里使用yarn平台管理
examples/jars/spark-examples_2.11-2.3.0.jar //应用程序jar包
控制台我们可以看到下面的输出
2018-06-14 14:34:42 INFO Client:54 -
client token: N/A
diagnostics: N/A
ApplicationMaster host: N/A
ApplicationMaster RPC port: -1
queue: default
start time: 1528958081043
final status: UNDEFINED
tracking URL: http://master:18088/proxy/application_1528950862529_0002/
user: root
把上面的tracking URL 复制到浏览器可以追踪任务的进度和日志
“`
OK完成。