📅  最后修改于: 2020-11-06 05:15:32             🧑  作者: Mango
SparkContext是任何Spark功能的入口点。当我们运行任何Spark应用程序时,将启动一个驱动程序,该驱动程序具有主要函数,并且您的SparkContext在此处启动。然后,驱动程序在工作者节点上的执行程序内部运行操作。
SparkContext使用Py4J启动JVM并创建JavaSparkContext 。默认情况下,PySpark的SparkContext可以作为‘sc’使用,因此创建新的SparkContext是行不通的。
以下代码块包含PySpark类的详细信息和SparkContext可以采用的参数。
class pyspark.SparkContext (
master = None,
appName = None,
sparkHome = None,
pyFiles = None,
environment = None,
batchSize = 0,
serializer = PickleSerializer(),
conf = None,
gateway = None,
jsc = None,
profiler_cls =
)
以下是SparkContext的参数。
Master-这是它连接到的集群的URL。
appName-您的工作名称。
sparkHome -Spark安装目录。
pyFiles-要发送到集群并添加到PYTHONPATH的.zip或.py文件。
环境-工作节点环境变量。
batchSize-表示为单个Java对象的Python对象的数量。设置1以禁用批处理,设置为0以根据对象大小自动选择批处理大小,或设置为-1以使用无限的批处理大小。
串行器-RDD串行器。
Conf -L {SparkConf}的对象,用于设置所有Spark属性。
网关-使用现有的网关和JVM,否则初始化新的JVM。
JSC -JavaSparkContext实例。
profiler_cls-用于执行概要分析的自定义Profiler类(默认为pyspark.profiler.BasicProfiler)。
在以上参数中,主要使用master和appname 。任何PySpark程序的前两行如下所示-
from pyspark import SparkContext
sc = SparkContext("local", "First App")
既然您对SparkContext足够了解,那么让我们在PySpark shell上运行一个简单的示例。在此示例中,我们将计算README.md文件中字符“ a”或“ b”的行数。因此,让我们说如果文件中有5行并且3行具有字符’a’,那么输出将是→ Line with a:3 。字符“ b”将执行相同的操作。
注–在以下示例中,我们不会创建任何SparkContext对象,因为默认情况下,当PySpark shell启动时,Spark会自动创建名为sc的SparkContext对象。如果尝试创建另一个SparkContext对象,则会收到以下错误– “ ValueError:无法一次运行多个SparkContext。”。
<<< logFile = "file:///home/hadoop/spark-2.1.0-bin-hadoop2.7/README.md"
<<< logData = sc.textFile(logFile).cache()
<<< numAs = logData.filter(lambda s: 'a' in s).count()
<<< numBs = logData.filter(lambda s: 'b' in s).count()
<<< print "Lines with a: %i, lines with b: %i" % (numAs, numBs)
Lines with a: 62, lines with b: 30
让我们使用Python程序运行相同的示例。创建一个名为firstapp.py的Python文件,然后在该文件中输入以下代码。
----------------------------------------firstapp.py---------------------------------------
from pyspark import SparkContext
logFile = "file:///home/hadoop/spark-2.1.0-bin-hadoop2.7/README.md"
sc = SparkContext("local", "first app")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print "Lines with a: %i, lines with b: %i" % (numAs, numBs)
----------------------------------------firstapp.py---------------------------------------
然后,我们将在终端中执行以下命令以运行此Python文件。我们将获得与上述相同的输出。
$SPARK_HOME/bin/spark-submit firstapp.py
Output: Lines with a: 62, lines with b: 30