使用Jupyter Notebook 加速PySpark开发

目前我们系统的整体架构大概是: Spark Standalone Cluster + NFS FileServer. 自然, 这些都是基于Linux系统.

Windows在开发PySpark程序的时候, 大部分情况都没有什么问题. 但是有两种情况就比较蛋疼了:

读取NFS文件

Windows底下, 一旦涉及到NFS的文件路径, 就歇菜了: 因为NFS的文件路径都是比如 /mnt/nfs/xxx 这种, 而Windows上面完全无法实现.

消耗性能

虽然作为client, 理论上不需要太强悍的性能, 但是有的事情并不合适Spark. 这个时候, 能有一个强力的client, 就美滋滋了!

关于NFS的解决方案, 一种很简单的解决方案就是起一个虚拟机. 我这边选择的方案:

基于Docker的JupyerNotebook 作为pyspark的开发工具.

PS: 笔者在这里就不对比两种方案的优劣了. 各位看官可以根据自己的需求进行选取.

安装Docker

这个网上已经很多教程了.

在这里推荐一个: 安装· Docker —— 从入门到实践 – yeasy – GitBook

基础环境

基础镜像

因为我们主力是python语言, 有时候还需要做一些AI/ML Task.

我选取的是TensorFlow的镜像: Pull的命令: docker pull tensorflow/tensorflow

mount NFS

首先安装nfs-common. 以ubuntu为例: apt install -y nfs-common

mount命令:

sudo mount -t nfs remote_server:remote_dir /mnt/nfs3

启动docker:

[code lang=bash]
# 注意: 一定要加上 –net=host –pid=host -e TINI_SUBREAPER=true
sudo docker run –name spark-learn -d\
–net=host –pid=host -e TINI_SUBREAPER=true\
-p 8888:8888 -v /notebooks:/notebooks\
-v /mnt/nfs3:/mnt/nfs3\
tensorflow/tensorflow
[/code]

否则在后面运行spark脚本之后, 会遇到很诡异的提示”资源不足”

配置环境

这个时候, 已经可以直接打开notebook写python了. 所以,有的操作我就放python代码了.

修改APT源 (使用163)

[code lang=bash]
# ipython notebook之中表示执行命令
!cp /etc/apt/sources.list /etc/apt/sources.list.bak

import os
source = '''
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
'''

with open('/etc/apt/sources.list', 'w') as f :
f.write(source)

!apt update
[/code]

安装JDK

直接APT安装openjdk 不要太方便啊, 比手动安装oracle-jdk 方便多了. 而且目前看来, spark对他的兼容性也是得到保证的.

!apt-get install openjdk-8-jre -y

安装Maven

有时候, pyspark需要依赖其他的包的时候, 需要使用maven下载.

使用APT安装还是最方便的 :

apt-get install maven -y

修改pip源 + 安装pyspark

因为pyspark比较大, 网络不好的同学建议修改pip源.

修改pip源, 推荐我的小工具: https://github.com/RangerWolf/pip-ex

使用很简单:

[code lang=python]
mkdir_p(pip_config_dir)
change("tsinghua") # 我的网络发现清华的镜像比阿里云还要快!
[/code]

之后pip安装飞起来了! 安装pyspark就一句话: pip install pyspark

其他说明:

实时查看Spark运行日志

Spark的运行log并不会直接在notebook上面显示. 需要使用docker logs命令才能看到.

如果我们需要在命令自动显示最新的log, 而不需要我们每次手动输入, 可以使用下面的命令:

docker logs -f --tail 100 spark-learn

网络速度监控

第一次运行Spark程序的时候, 我发现一个很简单的命令也没有执行弯成. 以为是网络IO太久了.

想看看是不是网络卡, 我发现下面这个神器:

[code lang=bash]
# 安装
sudo apt-get install speedometer

# 运行
speedometer -rx eth0 -tx eth0

# docker环境下, 可以多试几个
# 可以使用ifconfig 查看
speedometer -rx docker0 -tx docker0
speedometer -rx eno0 -tx eno0
[/code]

 

 

在命令行就直接显示出这种图片, 真是太牛了

结语

感谢您的观看,如有不足之处,欢迎批评指正。

如果有对大数据感兴趣的小伙伴或者是从事大数据的老司机可以加群:

658558542    

欢迎大家交流分享,学习交流,共同进步。(里面还有大量的免费资料,帮助大家在成为大数据工程师,乃至架构师的路上披荆斩棘!)

最后祝福所有遇到瓶颈的大数据程序员们突破自己,祝福大家在往后的工作与面试中一切顺利。

<think>好的,用户之前已经问过PB级数据和Jupyter Notebook处理的问题,现在他想知道如何结合SparkJupyter里处理PB级数据。我需要先回顾之前的回答,确保这次回答的一致性,同时更具体地指导Spark的整合步骤。 首先,用户可能已经了解Jupyter本身处理不了PB数据,需要分布式计算框架。这次的问题是具体到Spark使用。我需要详细说明在Jupyter中配置Spark环境的不同方法,比如本地模式、独立集群或者云服务,比如EMR或Databricks。 用户可能对Spark不太熟悉,所以步骤需要清晰,从安装配置开始。比如安装findspark包,如何初始化SparkSession,以及如何读取数据。要强调集群的重要性,单机可能不够,需要多节点。 还要注意代码示例的正确性,比如正确使用master的地址,或者读取不同格式的数据。另外,需要提到优化技巧,比如分区数、内存设置、持久化等,这些对处理大数据很关键。 可能用户的实际场景是处理日志数据或机器学习,所以举例时可以提到这些应用。同时,需要指出Jupyter在这里的角色是作为前端,实际计算在集群上运行,避免内存问题。 最后,总结最佳实践,比如使用云平台、参数调优、数据格式选择,以及交互式分析的技巧。确保用户明白整合的关键点,并且有可行的步骤去实施。</think>--- ### 分步指南:Jupyter Notebook结合Spark处理PB级数据的完整方案 --- #### **1. 核心原理:SparkJupyter的协同模式** - **Spark分布式能力**:通过多节点集群并行处理数据,突破单机内存限制。 - **Jupyter定位**:作为交互式前端,提交任务到Spark集群并可视化结果,**不直接存储/计算PB数据**。 - **关键优势**: - 使用`PySpark` API在Jupyter中编写代码 - 通过`Spark UI`实时监控任务进度(默认端口4040) --- #### **2. 环境搭建(3种典型场景)** **场景1:本地开发测试(伪分布式)** ```bash # 安装依赖 pip install jupyter pyspark findspark ``` ```python # Jupyter初始化本地Spark import findspark findspark.init() # 自动探测Spark路径 from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("local[*]") \ # 使用所有CPU核心 .appName("PB_Processing") \ .config("spark.driver.memory", "8g") \ .getOrCreate() ``` ⚠️ 限制:仅适合小数据测试,无法处理真实PB级负载 --- **场景2:连接独立Spark集群** ```python # 集群模式配置(需提前部署Spark Standalone/YARN集群) spark = SparkSession.builder \ .master("spark://master-node:7077") \ # 集群主节点地址 .appName("PB_Production") \ .config("spark.executor.memory", "16g") \ .config("spark.executor.cores", "4") \ .config("spark.executor.instances", "100") \ # 根据集群规模调整 .getOrCreate() ``` ✅ 优势: - 数据存储在HDFS/S3,计算分布到多节点 - 支持动态扩展计算资源 --- **场景3:云托管服务(推荐生产使用)** - **AWS**:EMR Notebook + S3存储 ```python spark = SparkSession.builder \ .config("spark.hadoop.fs.s3a.access.key", "YOUR_ACCESS_KEY") \ .config("spark.hadoop.fs.s3a.secret.key", "YOUR_SECRET_KEY") \ .getOrCreate() df = spark.read.parquet("s3a://bucket-name/pb-data/") ``` - **Databricks**:直接使用托管版Jupyter --- #### **3. 数据处理关键代码示例** **步骤1:读取PB级数据** ```python # 从HDFS读取(需预先配置Hadoop环境) df = spark.read.format("parquet").load("hdfs:///path/to/pb-data") # 从S3读取(推荐云环境使用) df = spark.read.parquet("s3a://bucket/pb-data/year=2023/month=*/") # 流式处理(适用于持续输入的PB数据) stream_df = spark.readStream \ .schema(schema) \ .format("kafka") \ .option("subscribe", "pb-topic") \ .load() ``` **步骤2:分布式计算** ```python # 典型PB级处理操作 result = df \ .filter(df.value > 1000) \ # 过滤 .groupBy("category") \ # 分组 .agg({"amount": "sum"}) \ # 聚合 .repartition(1000) \ # 调整并行度 .persist(StorageLevel.MEMORY_AND_DISK) # 持久化策略 # 机器学习(MLlib库) from pyspark.ml.classification import LogisticRegression model = LogisticRegression().fit(df) ``` **步骤3:结果输出** ```python # 写回分布式存储(避免单点瓶颈) result.write.mode("overwrite").parquet("s3a://output-bucket/results/") # 抽样展示(Jupyter中不要collect()全量数据) result.sample(0.001).show(5) ``` --- #### **4. 性能优化技巧** | 优化方向 | 具体方法 | |-------------------|--------------------------------------------------------------------------| | **数据分区** | 按时间/空间分桶存储(如`s3://data/year=2023/month=03/day=15`) | | **内存管理** | 设置`spark.executor.memoryOverhead`(通常为总内存的10-15%) | | **并行度控制** | 调整`spark.sql.shuffle.partitions`(建议为CPU核数×2×executor数量) | | **数据格式** | 优先使用Parquet/ORC(列式存储,自带压缩和谓词下推) | | **缓存策略** | 对复用数据集调用`.persist()`,避免重复读取PB数据 | --- #### **5. 典型问题排查** - **OOM错误**: - 检查`spark.executor.memory`配置 - 使用`df.rdd.getNumPartitions()`确认分区是否足够 - **数据倾斜**: ```python # 检测倾斜 df.groupBy("key").count().orderBy("count", ascending=False).show() # 解决方案:添加随机前缀分桶处理 df.withColumn("salt", (rand() * 100).cast("int")).groupBy("salt", "key") ``` - **慢任务(Straggler)**: - 启用`spark.speculation=true`自动重启慢任务 - 使用`Spark UI`分析Stage耗时 --- #### **6. 架构示意图** ``` Jupyter Notebook ↓ 提交PySpark代码 Spark Cluster (Master + Workers) ↓ 分布式执行 分布式存储系统(HDFS/S3/Hive) ↑↓ 数据交互 监控系统(Spark UI/Grafana) ``` --- #### **7. 成本与效率平衡建议** - **冷数据处理**:对历史PB数据采用Spot Instance(AWS)或Preemptible VM(GCP)降低成本 - **交互查询**:结合Alluxio进行缓存加速 - **资源回收**:在Jupyter使用`spark.stop()`及时释放集群资源 --- 通过上述方法,Jupyter Notebook可作为PB级数据处理的交互式入口,而实际计算负载由Spark集群承担。这种组合既能保留Jupyter的易用性,又能发挥分布式计算的扩展能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值