Spark(Python)学习(二)

提醒:若需要使用HDFS中的文件,则在使用Spark前需要启动Hadoop。

Spark部署模式

(1)单机模式:Local模式
Hadoop中的文件系统是HDFS,HDFS运行起来有两个核心组件,NameNode和DataNode。NameNode是管家节点,起到数据目录的功能,DataNode负责具体存储相关数据。通常一个继续采用一主多从架构,即一个NameNode,其他是DataNode。
当使用一台笔记本电脑安装Hadoop,并没有多个节点,这时就将NameNode和DataNode都放在一台电脑上,配置成伪分布式。
(2)集群模式:Standalone模式、YARN模式、Mesos模式
在上一篇的最后介绍了这三种模式的区别。

【本学习笔记是按照Spark单机模式, Hadoop为分布式模式进行实验操作】

pyspark

pyspark提供了简单的方式来学习Spark API,提供了Python交互式执行环境,可以实时、交互的方式来分析数据。
区别于Sparkshell,Sparkshell不是用python语言写的,而是scala语言,是为scala语言编程提供的交互式环境。

  • 进入pyspark交互式执行环境
pyspark --master 

Spark的运行模式取决于传递给SparkContext 的Master URL的值。Master URL可以是以下任一种形式:
(1)local
使用一个Worker线程本地化运行Spark(完全不并行)。
(2)local[*]
也是单机环境,但是不是单线程运行,而是使用逻辑CPU个数数量的线性来本地化运行Spark。逻辑CPU个数是所有物理CPU的个数来乘每个CPU的核数。(有一定并行程度)
(3)local[K]
K是具体值,如1、2、3…,指定使用K个Worker线程本地化运行Spark(理想情况下,K应该根据运行机器的CPU核数设定)
(4)spark://HOST:PORT
Spark采用集群模式,连接到指定的Spark standalone master,默认端口是7077。(使用集群自带的资源管理器)
例:

pyspark --master spark://localhost:7077

【直接输入pyspark,默认local[*]模式】
(5)yarn-client
以客户端模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR环境变量中找到。
该模式的Driver节点建在提交应用程序的机器上,存在的问题是该机器在程序运行中必须一直保持开启,一旦这台机器关机,那么程序宕机。
这种模式通常在开发者调试程序时使用。
(6)yarn-cluster
以集群模式链接YARN集群。集群的位置可以在HADOOP_CONF_DIR环境变量中找到。
该模式的Driver节点建在集群中的某个机器上,当应用程序被提交后,由整个集群运行,提交程序的机器可以自由关闭,充当Driver节点的机器负责把程序运行结束。
这种模式用于企业产品生产上线、发布。
【当单独的yarn,没有client或cluster时,默认按client执行】
(7)mesos://HOST:POST
连接到指定的Mesos集群,默认接口是5050。

pyspark --master mesos://HOST:5050

-在Spark中采用本地模式启动pyspark的命令主要包含以下参数
(1)–master
表示当前pyspark要连接到哪个master。
例如local[*]是使用本地模式启动pyspark,星号表示需要使用几个CPU核心,即启动几个线程模拟Spark集群。

$ cd 
$ ./bin/pyspark --master local[4]

(2)–jars
用于把相关JAR包添加到CLASSPATH中;如果有多个jar包,可以使用逗号分隔符连接。

$ cd 
$ ./bin/pyspark --master local[4] --jars code.jar
  • 查看pyspark中有哪些命令
    pyspark --help
    获取完整的选项列表

  • 进入(默认local[*])和退出当前交互式环境

$ cd 
$ ./bin/pyspark 
>>> exit()

开发Spark独立应用程序

编写程序

  • WordCount.py
    编写用于统计文本文件中包含 ‘a’ 的行的个数和 ‘b’ 的行的个数
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")	# 生成配置的上下文信息,master的url值为local,设置应用名称为My App
sc = SparkContext(conf = conf)	# 生成SparkContext对象,即生成一个名字为sc的指挥官
logFile = "file:///usr/local/spark/README.md"	# 如果是本地文件则使用"file:///"
logData = sc.textFile(logFile,2).cache()	# 加载文本文件生成一个RDD执行文件。得到一个包含很多元素的RDD,每一个元素对应README.md中的一行
numAs = logData.filter(lambda line: 'a' in line).count()
# filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
numBs = logData.filter(lambda line: 'b' in line).count()
print('Lines with a: %s, Lines with b:%s' % (numAs, numBs))

执行程序

$ cd 
$ python3 WordCount.py

Spark(Python)学习(二)_第1张图片
通过spark-submit提交应用程序

spark-submit
 --master 
 --deploy-mode 	# 部署模式
 ... #其他参数
 	# Python代码文件
 [application-arguments]	# 传递给主类的主方法的参数

获取spark-submit 的完整选项列表

$ cd /usr/local/spark
$ ./bin/spark-submit --help

通过spark-submit 提交WordCount.py到Spark 中运行

$ /usr/local/spark/bin/spark-submit /WordCount.py

或在命令中间使用""符号,把一行完整命令断开输入

$ /usr/local/spark/bin/spark-submit \
> /WordCount.py

在这里插入图片描述
执行后在众多调试信息中找出了结果
在这里插入图片描述
为了避免其他多余信息对运行结果干扰,可以修改log4j的日志信息显示级别
将 log4j.rootCategory=INFO, console
改为 log4j.rootCategory=ERROR, console
Log4j 配置

Spark集群

使用3台机器搭建一个集群
Spark(Python)学习(二)_第2张图片
Spark+HDFS运行架构
Hadoop集群中有两大核心组件:NameNode和DateNode
下面这个一主多从架构有一个NameNode(NN)和三个DataNode(DN);
下面这个Spark集群中有一个Driver和三个WorkerNode。
Spark和Hadoop都使用这三台机器搭建的集群,两集群是重合的。由于WorkerNode负责任务计算,又由于任务计算都遵循数据的本地化处理(数据在哪,WorkerNode在哪),所以HDFS集群里DataNode都和Spark中的WorkerNode共存,实现数据本地化计算。
Spark(Python)学习(二)_第3张图片
启动Spark集群
【以下命令在Master节点主机上运行】
首先启动Hadoop集群

$ cd 
$ sbin/start-all.sh

启动Master节点,在Master节点主机上运行如下命令

$ cd 
$ sbin/start-master.sh

启动所有Slave节点,在Master节点主机上运行如下命令

$ sbin/start-slaves.sh

启动后,在Master主机上打开浏览器,访问 ”http://master:8080“,查看Spark独立集群管理器的信息。

关闭Spark集群
关闭Master节点

$ sbin/stop-master.sh

关闭Worker节点

$ sbin/stop-slaves.sh

关闭Hadoop集群

$ cd 
$ sbin/stop-all.sh

在集群上运行Spark应用程序

【以下命令在Master节点主机上运行】
启动Hadoop集群

$ cd 
$ sbin/start-all.sh

启动Spark的Master节点和所有Slaves节点

$ cd 
$ sbin/start-master.sh
$ sbin/start-slalves.sh

在集群中运行应用程序JAR包
使用spark-submit命令向集群提交程序,来计算pi的值(3.1415926)

$ cd 
$ bin/spark-submit \
> --master spark://master:7077 \
> <求pi的程序”pi.py“的目录>/pi.py 2>&1 | grep "Pi is roughly"

“spark://master:7077” 表示使用自带的Standalon模式(独立集群模式)
由于输出信息中有大量的调试信息,所以使用 “ 2>&1 | grep “Pi is roughly” ”,来把输出信息中包含“Pi is roughly”的值输出。详细内容参考Shell 输入/输出重定向
输出结果

Pi is roughly 3.1415926

在集群中运行交互式执行环境pyspark

$ cd 
$ bin/pyspark --master spark://master:7077

以Standalone模式进入交互式执行环境,这样就可以以集群方式交互式执行所提交的代码。
下面运行测试代码

>>> textFile = 
sc.textFile("hdfs://master:9000/README.md")
>>> textFile.count()
105
>>> textFile.first()
'#Apache Spark'

sc.textFile——加载底层文件生成RDD
hdfs://master:9000——表示加载的是一个分布式文件系统HDFS中的文件。(注意HDFS是两个斜杠,加载本地文件是三个斜杠)
textFile.count()——统计文件中有多少行
textFile.first()——取出第一行

用户在独立集群管理Web界面查看应用的运行情况
在浏览器中输入 “http://master:8080”

向Hadoop YARN集群管理器提交应用

$ cd 
$ bin/spark-submit \
> --master yarn-client \
> /usr/local/spark/example/src/main/python/pi.py

使用yarn模式需要保证hadoop集群已经启动
运行后,根据在Shell中得到输出的结果地址“tracking URL”,将地址拷贝进浏览器中,查看当前执行状态。

使用pyspark连接到采用YARN作为集群管理器的集群

$ bin/pyspark --master yarn
>>> textFile = 
sc.textFile("hdfs://master:9000/README.md")
>>> textFile.count()
105
>>> textFile.first()
'# Apache Spark'

在Hadoop YARN集群管理Web界面查看所有应用的运行情况
在浏览器输入“http://master:8080/cluster”

你可能感兴趣的:(Spark)