提醒:若需要使用HDFS中的文件,则在使用Spark前需要启动Hadoop。
(1)单机模式:Local模式
Hadoop中的文件系统是HDFS,HDFS运行起来有两个核心组件,NameNode和DataNode。NameNode是管家节点,起到数据目录的功能,DataNode负责具体存储相关数据。通常一个继续采用一主多从架构,即一个NameNode,其他是DataNode。
当使用一台笔记本电脑安装Hadoop,并没有多个节点,这时就将NameNode和DataNode都放在一台电脑上,配置成伪分布式。
(2)集群模式:Standalone模式、YARN模式、Mesos模式
在上一篇的最后介绍了这三种模式的区别。
【本学习笔记是按照Spark单机模式, Hadoop为分布式模式进行实验操作】
pyspark提供了简单的方式来学习Spark API,提供了Python交互式执行环境,可以实时、交互的方式来分析数据。
区别于Sparkshell,Sparkshell不是用python语言写的,而是scala语言,是为scala语言编程提供的交互式环境。
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()
编写程序
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-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 配置
使用3台机器搭建一个集群
Spark+HDFS运行架构
Hadoop集群中有两大核心组件:NameNode和DateNode
下面这个一主多从架构有一个NameNode(NN)和三个DataNode(DN);
下面这个Spark集群中有一个Driver和三个WorkerNode。
Spark和Hadoop都使用这三台机器搭建的集群,两集群是重合的。由于WorkerNode负责任务计算,又由于任务计算都遵循数据的本地化处理(数据在哪,WorkerNode在哪),所以HDFS集群里DataNode都和Spark中的WorkerNode共存,实现数据本地化计算。
启动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
【以下命令在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”