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改回来。点击应用,再点击确定。
其实这是更新虚拟机网络配置的过程。
上一篇: 加火冒三丈
下一篇: Nexus和Maven安装配置