欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Spark集群运行详解

程序员文章站 2022-07-03 22:54:55
Spark集群权威指南 Spark运行模式 Spark部署模式主要有四种:最简单就是Local模式(单机本地模式)、当然 Spark 还有自带的Standalone模式(使用Spark自带...

Spark集群权威指南

Spark运行模式

Spark部署模式主要有四种:最简单就是Local模式(单机本地模式)、当然 Spark 还有自带的Standalone模式(使用Spark自带的简单集群管理器)。还有单机伪分布式模式,复杂的则运行在集群中,目前能很好的运行在 YARN模式(使用YARN作为集群管理器)和Mesos模式(使用Mesos作为集群管理器)中。对于大多数情况 Standalone 模式就足够了,如果企业已经有 Yarn 或者 Mesos 环境,也是很方便部署的。需要说明的是,当安装好Spark以后,里面就自带了scala环境。

local(本地模式):常用于本地开发测试,本地还分为local单线程和local-cluster多线程;

standalone(集群模式):典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持ZooKeeper来实现 HA

on yarn(集群模式): 运行在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算

on mesos(集群模式): 运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算

on cloud(集群模式):比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3;Spark 支持多种分布式存储系统:HDFS 和 S3

分布式部署方式比较

standalone模式自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统从一定程度上说,该模式是Mesos和YARN模式的基础

Spark On Mesos模式。这是很多公司采用的模式,官方推荐这种模式。

Spark On YARN模式。这是一种最有前景的部署模式。

上面涉及到Spark的许多部署模式,究竟哪种模式好这个很难说,需要根据你的需求,如果你只是测试Spark Application,你可以选择local模式。而如果你数据量不是很多,Standalone 是个不错的选择。当你需要统一管理集群资源(Hadoop、Spark等),可以选择Yarn或mesos,但是这样维护成本就会变高。

在集群模式中会遇到的概念:

应用(Application):构建在Spark上的用户程序,包括驱动程序和集群上的执行器;

应用jar包(Application jar):一个包含用户的Spark应用的jar文件。在一些情况下用户可能会创建一个超级jar包(Uber jar),来包含应用和依赖。用户的jar包不要包含Spark和Hadoop的依赖,这些会在运行时添加;

驱动程序(Driver program):就是执行应用中的main方法并创建SparkContext的进程;

集群管理器(Clustermanager):一个可以在集群上获得资源的外部组件(比如standalone,Mesos和YARN);

部署模式(Deploy mode):部署模式用来分别驱动程序在哪里运行。在集群(cluster)模式,框架将驱动程序启动在急群众。在客户端(client)模式,驱动程序在集群外启动;

工作器节点(Worker node):集群中任何可以运行应用的节点;

执行器(Executor):在工作器节点上运行应用的进程,可以执行任务,保存数据。每个应用都有自己的执行器;

任务(Task):发送给一个执行器的一组计算;

工作(Job):由一组执行Spark行动操作的任务构成的并行计算,可以在驱动程序的日志中看到这个术语;

阶段(Stage):每一个工作分解为若干个小的一组任务叫做阶段(和MapReduce中的map阶段和reduce阶段类似)。

解压并安装Spark

解压Spark

该部分的安装需要在 Hadoop 已经成功安装的基础上,并且要求 Hadoop 已经正常启动。我们将 Spark 安装在 HadoopMaster 节点上。所以下面的所有操作都在HadoopMaster 节点上进行。

Spark版本spark-2.1.1

命令:

sudotar –zxvf /home/hadoop/Desktop/ spark-2.1.1-bin-hadoop2.7.tgz

命令:ll 查看Spark包含文件

给hadoop用户赋予读写权限

配置系统和spark-env环境变量

配置系统环境变量:

命令:vim .profile

在下面添加如下代码:

exportHADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

exportHDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop

exportYARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

使配置文件生效

配置spark-env环境变量

验证 Spark 安装

在集群中运行应用程序JAR包

其中的 --master yarn-cluster表明以Yarn-Cluster模式运行

也可用--master yarn-client,表明以Yarn-Client模式运行。

区别就在于Yarn-Cluster的Driver运行在Worker节点,而Yarn-Client的Driver运行在Client节点。

进入Spark安装目录,执行下面的命令(下面是一行代码)

./bin/spark-submit--class

org.apache.spark.examples.SparkPi--master yarn-cluster --num-executors 3 --driver-memory 1g

--executor-memory1g --executor-cores 1 examples/jars/spark-examples*.jar 10

如图所示,执行报错显示:

Namenode is in safe mode.

解决方案是:关闭安全模式

hadoop dfsadmin -safemode leave

重新执行该命令后出现如下界面:

查看执行结果需要在计算节点上。执行下面代码

sshslave 进入以下路径,查看stdout文件输出。(具体路径参照上图tracking URL)进入到slave节点userlogs文件下的相关路径。

显示下面结果表示Spark安装正常(结果可能会有微小差别)

也可以复制结果地址到浏览器,点击查看Logs,再点击stdout,即可查看结果

启动Spark

切换回master,在bin目录下执行命令 ./spark-shell

注意: spark-shell命令及其常用的参数如下:

./bin/spark-shell --master

Spark的运行模式取决于传递给SparkContext的Master URL的值。Master URL可以是以下任一种形式:

* local 使用一个Worker线程本地化运行SPARK(完全不并行)

* local[*] 使用逻辑CPU个数数量的线程来本地化运行Spark

* local[K] 使用K个Worker线程本地化运行Spark(理想情况下,K应该根据运行机器的CPU核数设定)

* spark://HOST:PORT 连接到指定的Spark standalone master。默认端口是7077.

* yarn-client 以客户端模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。

* yarn-cluster 以集群模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。

* mesos://HOST:PORT 连接到指定的Mesos集群。默认接口是5050。

在Spark中采用本地模式启动Spark Shell的命令主要包含以下参数:

--master:这个参数表示当前的Spark Shell要连接到哪个master,如果是local[*],就是使用本地模式启动spark-shell,其中,中括号内的星号表示需要使用几个CPU核心(core);

--jars: 这个参数用于把相关的JAR包添加到CLASSPATH中;如果有多个jar包,可以使用逗号分隔符连接它们;

s

比如,要采用本地模式,在4个CPU核心上运行spark-shell:

./bin/spark-shell–master local[4]./bin/spark-shell --master local[4]

可以执行“spark-shell --help”命令,获取完整的选项列表,具体如下:

./bin/spark-shell–help

下面正式使用命令进入spark-shell环境,可以通过下面命令启动spark-shell环境:

该命令省略了参数,这时,系统默认是“bin/spark-shell --master local[*]”,也就是说,是采用本地模式运行,并且使用本地所有的CPU核心。

./bin/spark-shell

现在,你就可以在里面输入scala代码进行调试了。

比如,下面在命令提示符后面输入一个表达式7*8+9 然后回车,就会得到结果

最后,可以使用命令“:quit”退出Spark Shell。

在集群中运行spark-shell

也可以用spark-shell连接到独立集群管理器上。

请登录Linux系统,打开一个终端,在Shell中输入如下命令进入spark-shell:

./bin/spark-shell--master yarn

打开浏览器,http://master:4040/,查看运行界面:

安装部署Hive

该部分的安装需要在 Hadoop 已经成功安装的基础上,并且要求 Hadoop 已经

正常启动。Hadoop 正常启动的验证过程如下:

查看HDFS

使用下面的命令,看可否正常显示 HDFS 上的目录列表hdfs dfs -ls /

使用浏览器查看相应界面http://master:50070

http://master:18088

该页面的结果跟 Hadoop 安装部分浏览器展示结果一致。如果满足上面的两个条件, 表示 Hadoop正常启动。我们将 Hive 安装在 HadoopMaster 节点上。所以下面的所有操作都在HadoopMaster 节点上进行。

解压并安装 Hive

在/usr/local/下新建Hive文件夹,

并赋予权限:sudo chmod 777 /usr/local/Hive

命令tar –zxvf /home/hadoop/Desktop/apache-hive-1.2.1-bin.tar.gz

执行一下 ll 命令会看到下面的图片所示内容,这些内容是 Hive 包含的文件

安装配置MySQL

注意:安装和启动 MySQL 服务需要 root 权限,切换成 root 用户,命令如下:su root

在/usr/local/下新建Mysql文件夹,并赋予权限:sudo chmod 777 /usr/local/Mysql

使用以下命令即可进行mysql安装

命令:apt-get install mysql-server

启动mysql服务器命令:service mysql start

关闭mysql服务器命令:service mysql stop

确认是否启动成功,mysql节点处于LISTEN状态表示启动成功:

命令:sudo netstat –tap | grep mysql

进入mysql shell界面:

解决利用sqoop导入MySQL中文乱码的问题(可以插入中文,但不能用sqoop导入中文)导致导入时中文乱码的原因是character_set_server默认设置是latin1,如下图。

可以单个设置修改编码方式setcharacter_set_server=utf8;但是重启会失效,建议按以下方式修改编码方式。

1、编辑配置文件。sudo vim/etc/mysql/mysql.conf.d/mysqld.cnf

2、在[mysqld]下添加一行character_set_server=utf8。如下图

3、 重启MySQL服务。service mysql restart

4、 登陆MySQL,并查看MySQL目前设置的编码。show variables like"char%";

5、 下载mysqljdbc 包,

创建相关目录,将mysql解压到目录下:

tar –zxvf mysql-connector-java-5.1.40.tar.gz –C /usr/local/Mysql

将java connector包复制到hive的lib下

启动并登陆mysql shell

service mysql start #启动mysql服务

mysql –u root –p #登录shell界面

新建hive数据库

这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据

6、配置mysql允许hive接入:

grant all on *.* to hive@localhost identified by 'hive';

#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码

flush privileges; #刷新mysql系统权限关系表

6. 启动hive

启动hive之前,请先启动hadoop集群。

start-all.sh启动Hadoop

hive 启动hive

启动hive报错

关闭Hadoop安全模式

重新启动hive

使用mysql作为元数据库时登陆,启动成功。

解决Hive启动,Hive metastore database is not initialized的错误。出错原因:重新安装Hive和MySQL,导致版本、配置不一致。在终端执行如下命令:

schematool-dbType mysql -initSchema

Hive 分布现在包含一个用于 HiveMetastore 架构操控的脱机工具,名为 schematool.此工具可用于初始化当前 Hive 版本的Metastore 架构。此外,其还可处理从较旧版本到新版本的架构升级。

(4)配置 SparkSQL

把 Hive 的 conf 下的 hive-site.xml 复制到 Spark 的安装目录下:

cp hive-site.xml/usr/local/Spark/spark-2.1.1-bin-hadoop2.7/conf/

把放在 Hive 的 lib 目录下的 mysql-connector-java-5.1.27-bin.jar 复制

到 Spark的 jars 目录下:

cpmysql-connector-java-5.1.40-bin.jar/usr/local/Spark/spark-2.1.1-bin-hadoop2.7/jars/

重启MySQL 服务。

servicemysql restart

(5)验证 SparkSQL

进入 Spark 安装主目录, 执行下面的命令

./bin/spark-sql--master yarn

直到出现spark-sql表示验证成功

日志文件的设置:

进入conf目录下,执行如下命令:

mvlog4j.properties.templatelog4j.properties

vim log4j.properties

把 log4j.rootCategory=INFO,console 改为

log4j.rootCategory=WARN,console

可以发现:原先Spark日志文件打印了INFO信息

现在日志文件去info信息成功

原先在集群中运行应用程序JAR包

现在也不显示info信息

网络问题

在启动hadoop时遇到了No routeto host网络问题:

当我们通过ssh登录到从机节点遇到了No routeto host网络问题:

解决办法:

更新虚拟网络编辑器

原先默认的子网IP配置

更改子网ip 如更改为192.168.212.0,点击应用,再点击确定。

然后再把子网ip改回来。点击应用,再点击确定。

其实这是更新虚拟机网络配置的过程。