大数据开发环境搭建系列三:Spark环境搭建
1. 写在前面最近学习推荐系统, 想做一个类似于企业上的那种推荐系统(采用的阿里天池赛的一个电商数据集, 然后基于大数据的Lambda架构, 实现离线和在线相结合的实时推荐系统), 这样可以熟悉一下真实环境中的推荐系统流程, 但是这里面需要大数据的开发环境, 所以这里的这个系列是记录自己搭建大数据开发环境的整个过程, 这里面会涉及到Hadoop集群,Spark, zookeeper, HBase,
1. 写在前面
最近学习推荐系统, 想做一个类似于企业上的那种推荐系统(采用的阿里天池赛的一个电商数据集, 然后基于大数据的Lambda架构, 实现离线和在线相结合的实时推荐系统), 这样可以熟悉一下真实环境中的推荐系统流程, 但是这里面需要大数据的开发环境, 所以这里的这个系列是记录自己搭建大数据开发环境的整个过程, 这里面会涉及到Hadoop集群,Spark, zookeeper, HBase, Hive, Kafka等的相关安装和配置,当然后面也会整理目前学习到的关于前面这些东西的相关理论知识和最终的那个推荐系统, 经过这一段时间的摸索学习, 希望能对大数据开发和工业上的推荐系统流程有个宏观的初识,这一块涉及到技术上的细节偏多, 所以想记录一下, 方便以后查看和回练, 开始 😉
上一篇文章已经把Hadoop集群环境搭建起来了, 目前是一台master节点和两台slaves节点。 下面开始搭建Spark环境, Spark是一个分布式的计算框架, 和Hadoop的MapReduce功能差不多,是负责大数据分布式环境下数据计算的, 而MapReduce的计算涉及到多次与硬盘数据交互,导致数据读写会有延迟,而Spark是在内存里面, 速度会快很多。 关于这些框架的理论知识,不过多的在这里整理了, 这里想整理一个实操系列。 当然想运行Spark的话不一定非得依赖Hadoop集群, Spark的Cluster Manager有三种运行模式,是完全可以在本地运行(且不用Hadoop)就能进行简单学习spark的,但是大数据环境下,一般数据是分布式存储, 所以常用的运行模式是Spark要从HDFS里面读取数据进行操作。而要运行HDFS,就必须搭建Hadoop集群了。 这就是为啥Spark要放到Hadoop后面介绍的原因。
这篇文章会记录Spark环境搭建全过程, 主要包括三种模式下的Spark运行及相关配置, 本地,Hadoop YARN模式以及Spark Standalone Cluster模式, 本地模式比较简单, 安装完spark就可以在本地进行运行, 然后进行使用,比较方便,适合做一些简单的测试,学习; Hadoop YARN是运行在这上面, 让YARN帮助进行多台机器资源的管理;Spark Standalone Cluster是Spark提供的Cluster管理模式,实现多台计算机并行计算,这个模式下也可以直接存取硬盘数据或者HDFS,如果没有Hadoop 多节点集群,可以搞一个这个。下面开始。
2. Spark的Cluster模式架构简介
在具体安装spark之前,先看一下Spark集群模式架构:
- DriverProgram: 程序员设计的Spark程序,在Spark程序中必须定义SparkContext,这是开发Spark应用程序的入口
- SparkContext通过Cluster Manager管理整个集群,集群中包含多个Worker Node,每个Worker Node都有Executor负责执行具体任务。
SparkContext通过Cluster Manager管理整个集群Cluster的好处是:所设计的Spark程序可以在不同的Cluster模式下运行,比如本地,Spark Standalone Cluster和Hadoop YARN等。下面我们就来看看这三种情况下的安装和配置情况。
开启三台虚拟机, 然后在master上操作。首先是安装Scala,这是Spark原生语言,和Spark的兼容最好,这个在第一篇里面已经安装完毕了。接下来就是安装Spark了。
3. Spark安装
这个和Java,Scala安装一样,下载好的Spark文件解压,然后移动到bigdata/spark下,然后环境配置即可。直接上命令了:
tar zxvf spark-2.2.0-bin-hadoop2.7.tgz
sudo mkdir /opt/bigdata/spark/
sudo mv spark-2.2.0-bin-hadoop2.7 /opt/bigdata/spark/spark2.2
配置环境, 第一篇文章已经做过了其实,这里再来看一下:
vi /etc/profile
# 里面加入
# 设置spark的安装目录
export SPARK_HOME=/opt/bigdata/spark/spark2.2
# 这个加入到path,在切换不同目录下都能运行spark-shell
export PATH=${SPARK_HOME}/bin:$PATH
source /etc/profile
这样就安装完了spark,可以直接在master的命令行输入Spark-shell运行Spark了, 但此时会默认显示很多信息,这个我们修改设置,把一些信息去掉,只保留警告,这样看起来清洁一些。命令如下:
# 复制log4j模板文件
cd /opt/bigdata/spark/spark2.2/conf
cp log4j.properties.template log4j.properties
gedit log4j.properties # 把log4j.rootCategory原本的INFO改为WARN即可
这时候再运行,就清爽多了。
4. 本地运行spark-shell程序
这是最简单的运行spark的方式, 首先我们开启Hadoop集群,这样spark可以使用HDFS上的数据, 执行start-all.sh
,然后输入
spark-shell --master local[4]
这样就开启了本地模式, loca[N]代表本地运行,N代表线程数,也就是可以同时N个程序,接下来可以读取本地文件,算个wordcount了。
这时候也可以读取HDFS文件的, 由于Hadoop集群搭建起来没有用过Hdfs,这里也用一下,首先,在HDFS上建立一个用户文件夹,然后建立一个icss用户文件夹,建立wordcount文件夹,建立input文件夹,把本地的上面那个文件传上去,然后用spark读取计算。
# 建立文件夹
hadoop fs -mkdir -p /user/icss/wordcout/input/
# 本地文件传上去
hadoop fs -put /opt/bigdata/spark/spark2.2/README.md /user/icss/wordcout/input/
hadoop fs -cat /user/icss/wordcout/input/README.md # 查看
# 读取计算
val textFile = sc.textFile("hdfs://master:9000/user/icss/wordcout/input/README.md") # hdfs://master:9000是安装Hadoop时在core-site.xml里面设置过的HDFS的存储目录
textFile.count
和上面一样的结果。
5. Hadoop YARN运行spark-shell
这个是在Hadoop YARN上运行Spark,让YARN帮助管理多台机器的资源, 只需要下面这命令即可启动:
spark-shell --master yarn --deploy-mode client
但是这句话之前,得需要先配置Yarn的配置文件目录,好让spark找到YARN, 这个配置在spark-env.sh
中,首先,执行下面命令:
cp /opt/bigdata/spark/spark2.2/conf/spark-env.sh.template /opt/bigdata/spark/spark2.2/conf/spark-env.sh
gedit /opt/bigdata/spark/spark2.2/conf/spark-env.sh
# 这里面加上:
export HADOOP_CONF_DIR=/opt/bigdata/hadoop/hadoop2.8/etc/hadoop
这样, 就可以在Hadoop YARN上运行spark-shell了。
6. 构建Spark Standalone Cluster执行环境
首先,我们需要先配置spark-env.sh
, 配置命令如下:
# 设置master的IP或服务器名称
export SPARK_MASTER_IP=master
# 设置每个Worker使用的CPU核心
export SPARK_WORKER_CORES=2
# 设置每个Worker使用内存, 内存不足的时候,设置小点
export SPARK_WORKER_MEMORY=2G
# 设置每个Worker实例 如果内存不足,设置为1
export SPARK_WORKER_INSTANCES=2
然后编辑slaves文件, 设置Spark Standalone Cluster有哪些服务器
gedit /opt/bigdata/spark/spark2.2/conf/slaves
里面加入slave01和slave02即可.
最后把spark程序复制到slave01和slave02上面去(注意,三台机器spark所在目录必须一致,因为master会登陆到worker上执行命令,master认为worker的spark路径与自己一样), 命令如下:
ssh slave01
sudo mkdir /opt/bigdata/spark
sudo chown icss:icss /opt/bigdata/spark
exit
sudo scp -r /opt/bigdata/spark/spark2.2 icss@slave01:/opt/bigdata/spark/
slave02和上面同理。这样, 每台机器上就都有spark程序了。
7. 在Spark Standalone运行spark-shell
启动Spark Standalone Cluster:
/opt/bigdata/spark/spark2.2/sbin/start-all.sh
这里竟然报了一个错:
/opt/bigdata/spark/spark2.2/sbin/start-master.sh:行65: /opt/biddata/spark/spark2.2/sbin/spark-daemon.sh: 没有那个文件或目录
/opt/bigdata/spark/spark2.2/sbin/start-slaves.sh:行46: /opt/biddata/spark/spark2.2/sbin/slaves.sh: 没有那个文件或目录
这个错又卡了我好久, 网上找了好久也没找到原因,而静下心来仔细看这个报错之后发现了后面的/biddata
, 并且master和salves同时报错,就知道了问题所在, 果然是在配置spark-env.sh
的时候把SPARK_HOME路径写错了。
这个错又浪费了20分钟的时间,真的是细心细心再细心啊。 抓紧三台机器把这里改过来, 结果OK了。
在Spark Standalone运行spark-shell程序
spark-shell --master spark://master:7077
这时候已经启动成功, 进入spark standalone 界面查看: http://master:8080/
这样就大功告成了, 当在cluster模式下运行时(yarn-client or Spark Standalone), 运行spark读取文本文件, 因为程序会分布在不同机器中执行, 所以如果是读取本地文件,要确保所有机器都必须有该文件, 否则会报错,比较稳妥的是把文件上传到HDFS上进行读取。
好了,关于spark环境搭建就到这里了, 停掉集群休息一下,然后继续Rush! 😉
# 停掉spark集群
/opt/bigdata/spark/spark2.2/sbin/stop-all.sh
# 停掉Hadoop
stop-all.sh
更多推荐
所有评论(0)