在集群上提交pyspark开发的spark应用

在集群上提交pyspark开发的spark应用,就是通过如下方式提交代码:

spark-submit --master spark://192.168.153.6:7077 --py-files /root/wordcount.zip /root/wordcount.py

其中  --master 指出了集群的地址和ip, --py-files指定了要执行的代码的zip压缩包,最后1个参数指定了要执行python代码的入口文件。

在下面提交代码的过程中,遇到最大的问题是 python版本的问题。

另外,下面的代码是没办法在python环境中运行的,因为缺少pyspark包 和 py4j 模块,只能在spark环境中运行。

1、编写代码


from __future__ import print_function

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("wordcount").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

textFile = spark.sparkContext.textFile("hdfs://192.168.153.6:9000/data/wordcount.txt")
 
wordCount = textFile.flatMap(lambda line: line.split(" ")).map(lambda word: (word,1)).reduceByKey(lambda a, b : a + b)

for x in wordCount.collect():
        print(x)

2、解决代码报错问题

(1)与pyspark上运行代码的区别

上面的代码需要现在pyspark上运行通过,但是代码会有点差别,因为登录pyspark环境后,会自动创建spark对象,所以

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("wordcount").getOrCreate()

这两步就不需要了。

(2) python版本导致print报错

由于Linux预先安装的是python 2.7.5:

[root@Slave01 ~]# python -V
Python 2.7.5

所以本来代码中是这么输出运行结果的:wordCount.foreach(print), 但是报错了。

为了正确调用print来打印,需要引入 from __future__ import print_function 来调用python3版本中的print,这样就不报错了。

(3)不显示输出结果

是由于代码在集群上运行,为了在master主机上显示结果,必须要把输出语句改为 wordCount.collect().foreach(print) 。 

但是改完后又报错 list 没有foreach方法。。。

通过把代码改为下面的方式,就不报错了:

for x in wordCount.collect():
        print(x)

3、运行结果

[root@Master ~]# spark-submit --master spark://192.168.153.6:7077 --py-files /root/wordcount.zip /root/wordcount.py
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/spark/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
19/11/07 11:40:56 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
(u'flume', 1)                                                                   
(u'slave', 1)
(u'python', 1)
(u'scikit-learn', 1)
(u'hive', 1)
(u'thrid', 1)
(u'second', 1)
(u'master', 1)
(u'storm', 1)
(u'spark', 2)
(u'hbase', 1)
(u'flink', 1)
(u'kafka', 1)
(u'hadoop', 2)
(u'first', 1)
(u'spark-streaming', 1)

为了让运行结果中不显示无关的INFO信息,可以把 spark安装目录中 conf目录的 log4j.properties.template 文件复制一份,名称改为 log4j.properties ,把文件中的 INFO, CONSOLE 改为 WARN, CONSOLE,这样只有是警告级别的消息,才会打印。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值