在Hadoop YARN群集之上安装,配置和运行Spark

什么是Spark?

Spark是一种通用的集群计算系统。它可以在从单个节点到数千个分布式节点的集群上部署和运行并行应用程序。Spark最初设计用于运行Scala应用程序,但也支持Java,Python和R.

Spark可以作为独立的集群管理器运行,也可以利用Apache Hadoop YARNApache Mesos等专用集群管理框架。

准备

  • 按照我们的指南,了解如何安装和配置三节点Hadoop集群以设置YARN集群。主节点(HDFS NameNode和YARN ResourceManager)称为节点主节点,从节点(HDFS DataNode和YARN NodeManager)称为node1node2。 除非另有说明,否则从node-master运行本指南中的命令。
  • 确保您的hadoop用户可以使用没有密码的SSH密钥访问所有群集节点。
  • 请注意Hadoop安装的路径。本指南假定它已安装/home/hadoop/hadoop。如果不是,请相应地调整示例中的路径。
  • jps在每个节点上运行以确认HDFS和YARN正在运行。如果不是,请通过以下方式启动服务:
start-dfs.sh 
start-yarn.sh

注意: 本指南是为非root用户编写的。需要提升权限的命令带有前缀sudo。如果您不熟悉该sudo命令,请参阅“ 用户和组”指南。

下载并安装Spark Binaries

Spark下载页面提供了Spark二进制文件。调整下面的每个命令以匹配正确的版本号。

  • 从Spark下载页面获取下载URL,下载并解压缩。 对于带有Hadoop 2.7或更高版本的Spark 2.2.0,node-masterhadoop用户身份登录,然后运行:

cd /home/hadoop

wget https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz

tar -xvf spark-2.2.0-bin-hadoop2.7.tgz

mv spark-2.2.0-bin-hadoop2.7 spark

  • 将Spark二进制文件目录添加到您的PATH。编辑/home/hadoop/.profile并添加以下行: 对于Debian / Ubuntu系统: /home/hadoop/.profile1 PATH=/home/hadoop/spark/bin:$PATH对于RedHat / Fedora / CentOS系统: /home/hadoop/.profile1 pathmunge /home/hadoop/spark/bin

将Spark与YARN 集成

要与YARN资源管理器通信,Spark需要了解您的Hadoop配置。这是通过HADOOP_CONF_DIR环境变量完成的。该SPARK_HOME变量不是必需的,但在从命令行提交Spark作业时非常有用。

  1. 编辑hadoop用户配置文件/home/hadoop/.profile并添加以下行: /home/hadoop/.profile1 2 3 export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop export SPARK_HOME=/home/hadoop/spark export LD_LIBRARY_PATH=/home/hadoop/hadoop/lib/native:$LD_LIBRARY_PATH
  2. 通过注销并再次登录来重新启动会话。
  3. 重命名spark默认模板配置文件: mv $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
  4. 编辑$SPARK_HOME/conf/spark-defaults.conf并设置spark.masteryarn: $ SPARK_HOME / conf目录/火花defaults.conf1 spark.master yarn

现在,Spark已准备好与您的YARN群集进行交互。

了解客户端和群集模式

Spark作业可以在YARN上以两种模式运行:集群模式和客户端模式。了解两种模式之间的差异对于选择适当的内存分配配置以及按预期提交作业非常重要。

Spark作业由两部分组成:运行实际任务的Spark Executors和调度Executors的Spark Driver。

  • 集群模式:一切都在集群内部运行。您可以通过笔记本电脑开始工作,即使关闭计算机,作业也会继续运行。在此模式下,Spark驱动程序封装在YARN Application Master中。
  • 客户端模式Spark驱动程序在客户端上运行,例如您的笔记本电脑。如果客户端关闭,则作业失败。Spark Executors仍然在集群上运行,为了安排一切,创建了一个小的YARN Application Master。

客户端模式非常适合交互式作业,但如果客户端停止,应用程序将失败。对于长时间运行的作业,群集模式更合适。

配置内存分配

如果未正确配置内存分配,则在YARN容器中运行的Spark容器的分配可能会失败。对于RAM少于4G的节点,默认配置不充分,可能会触发交换和性能不佳,甚至由于内存不足导致应用程序初始化失败。

在编辑Spark内存设置之前,请务必了解Hadoop YARN如何管理内存分配,以便您的更改与YARN群集的限制兼容。

注意:有关管理YARN群集内存的更多详细信息,请参阅“ 安装和配置3节点Hadoop群集”指南的内存分配部分。

为您的YARN容器提供最大允许内存

如果请求的内存高于允许的最大值,YARN将拒绝创建容器,并且您的Spark应用程序将无法启动。

  1. 获得yarn.scheduler.maximum-allocation-mbin 的价值$HADOOP_CONF_DIR/yarn-site.xml。这是单个容器的最大允许值(MB)。
  2. 确保在以下部分中配置的Spark内存分配值低于最大值。

本指南将使用1536for 的示例值yarn.scheduler.maximum-allocation-mb。如果您的设置较低,请使用您的配置调整样本。

在群集模式配置Spark驱动程序内存分配

在群集模式下,Spark驱动程序在YARN Application Master中运行。Spark在初始化时请求的内存量可以在spark-defaults.conf命令行中配置,也可以通过命令行配置。

spark-defaults.conf

  • 通过spark.driver.memory(此值默认为1G)设置在群集模式下分配给Spark Driver的默认内存量。要将其设置为512MB,请编辑该文件: $ SPARK_HOME / conf目录/火花defaults.conf1 spark.driver.memory 512m

从命令行

  • 使用该--driver-memory参数指定请求的内存量spark-submit。请参阅以下有关示例的应用程序提交的部分。 注意从命令行给出的值将覆盖已设置的值spark-defaults.conf

在客户端模式配置Spark应用程序主内存分配

在客户端模式下,Spark驱动程序不会在群集上运行,因此上述配置将不起作用。仍然需要创建YARN Application Master来安排Spark执行程序,并且可以设置其内存要求。

在客户端模式下设置分配给Application Master的内存量spark.yarn.am.memory(默认为512M

$ SPARK_HOME / conf目录/火花defaults.conf

1

spark.yarn.am.memory 512m

无法从命令行设置此值。

配置Spark Executors的内存分配

Spark Executors的内存分配基于以下两个参数计算$SPARK_HOME/conf/spark-defaults.conf

  • spark.executor.memory:设置计算中使用的基本内存
  • spark.yarn.executor.memoryOverhead:被添加到基本内存中。它默认为基本内存的7%,最小值为384MB

注意:确保Executor请求的内存(包括开销内存)低于YARN容器的最大大小,否则Spark应用程序将不会初始化。

示例:对于spark.executor.memory1Gb,所需内存为1024 + 384 = 1408MB。对于512MB,所需内存为512 + 384 = 896MB

要将执行程序内存设置为512MB,请编辑$SPARK_HOME/conf/spark-defaults.conf并添加以下行:

$ SPARK_HOME / conf目录/火花defaults.conf

1

spark.executor.memory 512m

如何将Spark应用程序提交到YARN群集

使用该spark-submit命令提交应用程序。Spark安装包包含示例应用程序,例如Pi的并行计算,您可以运行它来练习启动Spark作业。

要运行示例Pi计算,请使用以下命令:

spark-submit --deploy-mode client \
               --class org.apache.spark.examples.SparkPi \
               $SPARK_HOME/examples/jars/spark-examples_2.11-2.2.0.jar 10

第一个参数,--deploy-mode指定要使用的模式,clientcluster

要在群集模式下运行相同的应用程序,请替换--deploy-mode client--deploy-mode cluster

监控您的Spark应用程序

提交作业时,Spark Driver会自动在端口上启动Web UI,4040以显示有关应用程序的信息。但是,执行完成后,Web UI将被应用程序驱动程序解除,并且无法再访问。

Spark提供了一个历史记录服务器,它从HDFS收集应用程序日志并将其显示在持久Web UI中。以下步骤将在HDFS中启用日志持久性:

  1. 编辑$SPARK_HOME/conf/spark-defaults.conf并添加以下行以启用Spark作业以登录HDFS: $ SPARK_HOME / conf目录/火花defaults.conf1 2 spark.eventLog.enabled true spark.eventLog.dir hdfs://node-master:9000/spark-logs
  2. 在HDFS中创建日志目录: hdfs dfs -mkdir /spark-logs
  3. 配置History Server相关属性$SPARK_HOME/conf/spark-defaults.conf: $ SPARK_HOME / conf目录/火花defaults.conf1 2 3 4 spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider spark.history.fs.logDirectory hdfs://node-master:9000/spark-logs spark.history.fs.update.interval 10s spark.history.ui.port 18080您可能希望使用与默认值不同的更新间隔10s。如果指定更大的间隔,则在历史记录服务器中看到的内容与应用程序的实时状态之间会有一些延迟。如果使用较短的间隔,则会增加HDFS的I / O.
  4. 运行历史记录服务器: $SPARK_HOME/sbin/start-history-server.sh
  5. 重复上一节中的步骤以启动作业,spark-submit这将在HDFS中生成一些日志:
  6. 通过在Web浏览器中导航到http:// node-master:18080来访问History Server :

运行Spark Shell

Spark shell提供了一种检查和处理数据的交互方式。

  1. 将一些数据放入HDFS进行分析。此示例使用Gutenberg项目中的Alice In Wonderland文本: cd /home/hadoop wget -O alice.txt https://www.gutenberg.org/files/11/11-0.txt hdfs dfs -mkdir inputs hdfs dfs -put alice.txt inputs
  2. 启动Spark shell: spark-shell var input = spark.read.textFile("inputs/alice.txt") // Count the number of non blank lines input.filter(line => line.length()>0).count()

Scala Spark API超出了本指南的范围。您可以在官方Apache Spark文档中找到官方文档

接下来做什么?

既然您有一个正在运行的Spark集群,您可以:

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

更多教程请前往腾讯云+社区学习更多知识。


参考文献:《https://www.linode.com/docs/databases/hadoop/install-configure-run-spark-on-top-of-hadoop-yarn-cluster/

本文的版权归 阿小庆 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

Python3环境通过JDBC访问非Kerberos环境的Hive

在前面Fayson介绍了在Python2的环境下《如何使用Python Impyla客户端连接Hive和Impala》,本篇文章Fayson主要介绍在Pytho...

2051
来自专栏牛肉圆粉不加葱

Spark Streaming + Kakfa 编程指北

本文简述如何结合 Spark Streaming 和 Kakfa 来做实时计算。截止目前(2016-03-27)有两种方式:

1044
来自专栏数据和云

深入学习:In Memory Undo

黄玮(Fuyuncat) 资深 Oracle DBA,从事 Oracle 数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、开发与维护方面的经验。个人网...

3208
来自专栏Hadoop实操

如何获取Hive正在执行或者已结束的的MapReduce作业的SQL语句

当我们提交Hive SQL语句到YARN后,有时如果我们想监控某个SQL的执行情况,需要查看具体SQL语句,如果这个SQL语句比较长,无论是通过YARN的808...

8655
来自专栏Hadoop实操

如何使用R连接Hive与Impala

继之前的文章讲述如何在Redhat中配置R环境和如何在Redhat中安装R的包及搭建R的私有源后,那我们如何使用R连接CDH集群中的Hive和Impala进行数...

6026
来自专栏灯塔大数据

每周学点大数据 | No.64 配置Hadoop

NO.64 配置Hadoop 在开始使用Hadoop 之前,先要对Hadoop 进行配置。Hadoop 的配置分为单机模式、完全分布式、伪分布式三种。单机模式一...

35210
来自专栏祝威廉

StreamingPro 支持Spark Structured Streaming

Structured Streaming 的文章参考这里: Spark 2.0 Structured Streaming 分析。2.0的时候只是把架子搭建起来了...

1063
来自专栏美团技术团队

【技术博客】Spark性能优化指南——基础篇

前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、...

5216
来自专栏加米谷大数据

ZooKeeper在Hadoop中的应用

2042
来自专栏Hadoop实操

如何使用Oozie API接口向非Kerberos环境的CDH集群提交Java作业

前面Fayson介绍了《如何使用Oozie API接口向非Kerberos环境的CDH集群提交Spark作业》,本篇文章主要介绍如何使用Oozie Client...

3547

扫码关注云+社区

领取腾讯云代金券