前奏

为了实现一个spark的客户端访问服务端的python访问,折腾了好几天,现在终于解决了,查了网上的很多人写的文章,都没解决,跟着他们说的改,也没解决问题。有篇文章提点的很好就是 看spark的错误日志,看日志报错的具体问题。 Java gateway process exited before sending its port number这个问题有很多种情况引起,看日志是根据解决途径。下面就介绍windows pyspark连接linux spark服务的注意问题。这里先感谢这个连接的中的大牛回答,为资源不足(WARN TaskSchedulerImpl: Initial job has not accepted any resources;check your cluster UI to ensure that workers are registered and have sufficient resources)问题提供了解决方案。

方法论

这里不说linux服务端的事,服务端集群配置我都会在后面补一篇文章。说win10作为客户端连接服务端。
win10准备什么?
1.windows中的Java环境版本一定和服务端环境一致,至少保证大版本一致!
2.windows版的Hadoop(带without-hadoop的没测试,如果不用带hadoop的,能正常运行,但会报错,hadoop网上找找是有的就是bin目录加hadoop.dll、winutils.exe之类的)
3.python的版本也要和服务端的版本一致,不然也会出现报错!至少保证大版本(小数点后一位)一致!
4.windows的python安装pyspark版本和spark的版本一致
5.在环境变量中设置JAVA_HOME,用户环境、系统环境二选一就可以了,是通的

win10不需要准备什么?
1.千万不要用spark包,就安装pypark就行
2.不需要特意安装py4j
3.除了JAVA_HOME其他不要设置环境变量,JAVA_HOME也可以不用设置,见代码。

代码

跑个pyspark就这么复杂,没办法,太娇气了。

from pyspark import SparkConf, SparkContext
import os
# os.environ['JAVA_HOME'] = r'C:\Program Files\Java\jdk1.8.0_131' #----环境变量没有就打开
# # os.environ['SPARK_HOME']='D:\Root\wslware\spark-2.4.6-bin-hadoop2.7' #---不需要,删除它
# os.environ['PYTHONPATH']='D:\Root\wslware\spark-2.4.6-bin-hadoop2.7\py4j.zip' #---不需要,删除它
os.environ['HADOOP_HOME']='D:\Root\wslware\hadoop-2.7.6' #--环境变量没设置,这里就要设置它,都不设置也行,就是报错不好看
conf = SparkConf().setMaster("spark://172.26.59.55:7077").setAppName("ttest").set("spark.driver.host", "172.24.128.1")  
# 这是全文的重点, 这句话是重点,setMaster的参数要搞对,ip和端口要能通,spark.driver.host是windows的ip,没这个就报错,什么原因,自己咨询spark开发者,我只是调包者,也没精力研究这些,也不是搞运维非要弄清楚这个

sc = SparkContext(conf=conf) #这里开始到下面只是做测试用的,相对于环境来说无足轻重
print(sc.version)
list_test = [1, 2, 3]
x = sc.parallelize(list_test)
y = x.map(lambda x: x * 2)
print(x.collect())
print(y.collect())
print(333)
sc.stop()

总结

搞了一周,就这破事。注意3点:1.版本一致性,2.配置正确性,3.有错看日志,别盲目百度。

Logo

大数据从业者之家,一起探索大数据的无限可能!

更多推荐