Apache spark之pyspark【一、环境搭建】

背景:
昨天和同事在讨论djl的价值时,同事提出了djl的广告语。很多人会疑问这玩意儿和spark有什么关系。先给djl打个广告。


djl的优势

PS:djl = DeepJavaLibrary,宣传的是:


为什么要用Java进行深度学习

其实也是对各个训练框架,通过jni做了一层皮,和python的做法一致。我的个人看法是意义真的不是特别大。而且这玩意需要靠这个单一社区的力量,而python的皮是各个训练框架直接原生提供的,嫡出和庶出的差别(好像连庶出都算不上啊,我查查字典去)
至少列出来的这几个对于我个人而言都没有什么吸引力。当然仁者见仁智者见智,说不定过几年是一个大爆点呢。


不多说废话,切入正题。因为上文中提到:


优势之一:轻松集成Apache Spark

我的印象中Apache Spark是支持多语言的,但是没有深入了解过,借此契机进行深入了解一下:

第一招:看前人的经验

性能篇:

参考 Apache Spark: Scala vs. Java v. Python vs. R vs. SQL — mindful machines

看了很多文章,都是从测试性能角度来对比的python和scala,但python的本身的性能都是很差的。
python可以说所有的高性能库都是其他语言实现的so,然后用python做一层皮。

这些文章中的对比相当于拿python的短处和scala的长处做对比了。假设,UDF进行超大矩阵的乘法,是不是可以说scala又不如使用了numpy的python了呢?当然,scala也可以写jni【此处狗头】

架构篇:

参考 PySpark源码解析,教你用Python调用高效Scala接口,搞定大规模数据分析 - 腾讯云开发者社区-腾讯云 (tencent.com)

工作时,如果有UDF,则需要启动python进行执行
需要用到UDF的场景中
  • 一、如果不使用UDF

则性能一致,因为pyspark就是一个客户端,实际干活的还是scala。

  • 二、使用了UDF的场景

则会出现两个需要考虑的参数量,第一个是python daemon和spark worker的通讯成本(这段还是挺有意思的,建议去看看原文),第二个是python通过pandas和numpy带来的执行效率的提升,毕竟numpy里面有很多的极致优化,比如SIMD优化(CPU/SIMD Optimizations — NumPy v1.23 Manual),这点是目前jvm还在讨论的地方(java vector)。

第二招:自己摸石头过河

第一步:下载

Index of /apache/spark (tsinghua.edu.cn)

第二步:conda准备环境(conda安装自行找文章啊)
$ conda create -n pyspark python=3.8
$ conda activate pyspark
$ pip install pyspark
第三步:启动
  • 启动master
$ cd spark-3.3.0-bin-hadoop3-scala2.13
$ ./sbin/start-master.sh
$ grep master logs/spark-xxxxxxx-org.apache.spark.deploy.master.Master-1-xxxxxx.out
# 找到这句
22/07/15 08:49:57 INFO Master: Starting Spark master at spark://xxxxxxx:7077
  • 启动worker
$ cd spark-3.3.0-bin-hadoop3-scala2.13
# 需要在conda pyspark环境内运行
$ conda activate pyspark
$ ./sbin/start-worker.sh spark://xxxxxxxx:7077
第四步:测试环境
$ cd spark-3.3.0-bin-hadoop3-scala2.13
# 需要在conda pyspark环境内运行
$ conda activate pyspark
$ ./bin/pyspark --master spark://xxxxx:7077
Python 3.8.13 (default, Mar 28 2022, 11:38:47)
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
22/07/15 09:47:37 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.3.0
      /_/

Using Python version 3.8.13 (default, Mar 28 2022 11:38:47)
Spark context Web UI available at http://xxxxxx:4040
Spark context available as 'sc' (master = spark://xxxxxx:7077, app id = app-20220715094739-0001).
SparkSession available as 'spark'.
>>> myRDD = sc.parallelize(range(6), 3)
>>> sc.runJob(myRDD, lambda part: [x * x for x in part])
[0, 1, 4, 9, 16, 25]
>>>

下一篇:跑个python版本的UDF试试,稍等下周了。先去搬砖了。

你可能感兴趣的:(Apache spark之pyspark【一、环境搭建】)