本文共 1577 字,大约阅读时间需要 5 分钟。
在Spark Standalone集群中,资源调度主要由Master节点负责。然而,Spark也支持将资源调度交给YARN,这种方式的优势在于YARN支持动态资源调度。与YARN相比,Standalone模式的资源调度较为简单,仅支持固定资源分配策略。具体而言,每个任务预先分配固定数量的core,各个Job按顺序依次分配资源。在资源不足的情况下,任务会被排队等待。这种调度方式更适合单用户场景,但在多用户环境下,由于用户程序的差异较大,可能导致某些用户总是无法获得资源。而YARN的动态资源分配策略能够更好地解决这一问题。
除了为Spark提供调度服务,YARN作为通用的资源调度平台,还可以为其他系统(如Hadoop MapReduce、Hive)提供调度支持。这使得YARN能够统一管理集群上的所有计算负载,避免资源分配的混乱无序。
在Spark Standalone集群部署完成后,配置Spark支持YARN相对简单,主要包含以下两个步骤:
第一步,在conf/spark-env.sh文件中添加配置HADOOP_CONF_DIR,并指向Hadoop集群的配置文件目录,例如:
export HADOOP_CONF_DIR=/home/software/soft/hadoop-2.7.0/etc/hadoop
这一配置需要在所有节点上执行。
第二步,重启集群。
值得注意的是,即便没有部署Hadoop集群,Spark程序仍然可以访问HDFS文件。为此,只需添加相应的依赖jar文件,并在Spark程序中以hdfs://开头的完整路径访问HDFS文件即可。然而,这种方式存在一个明显缺点:HDFS与Spark节点是分离的,数据移动成本较高,大多数情况下远高于计算成本。因此,这种访问方式仅适用于小数据量的计算场景。
通过上述部署,Spark可以方便地访问HDFS文件,并在计算过程中尽量将计算任务分布在数据所在的节点上,从而减少因数据移动导致的网络IO开销。
Spark程序的运行调度方式取决于提交时的参数设置。以计算圆周率Pi的示例程序为例,提交方式如下:
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master spark://: \ lib/spark-examples*.jar \ 10
在这个命令中,--master参数决定了调度方式:如果参数值以spark://开头,Spark将使用自己的Master节点进行调度;如果参数值为yarn-client或yarn-cluster,则使用YARN进行调度,而YARN的地址信息将从Hadoop配置目录下的配置文件中获取。
YARN调度有两种模式:
yarn-cluster模式:YARN会在集群的某个节点上启动一个Master进程,Spark Driver程序运行在这个Master进程内部。客户端完成提交后可以立即退出,无需等待Spark程序运行完成。这是生产环境中非常适用的运行方式。
yarn-client模式:与yarn-cluster模式类似,但Driver程序不会运行在Master进程内部,而是在本地运行。通过Master节点申请资源,直到程序运行完成。这种模式适合需要交互的计算场景。
在实际应用中,yarn-cluster模式通常是更好的选择,因为它在集群内部运行Driver进程,基本上不占用本地资源。而yarn-client模式则会对本地资源造成一定压力。因此,建议在没有交互需求的情况下优先使用yarn-cluster模式。
转载地址:http://plmc.baihongyu.com/