Hadoop(十)spark环境搭建

本篇使用 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自带的例子

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集群

进入到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完成。

猜你喜欢

转载自blog.csdn.net/mingyunxiaohai/article/details/80642907