关于Spark Shell的使用

    Spark 带有交互式的Shell,可在Spark Shell中直接编写Spark任务,然后提交到集群与分布式数据进行交互,并且可以立即查看输出结果。Spark Shell 提供了一种学习Spark API的简单方式,可以使用Scala或Python 语言进行程序的编写。

一、Spark Shell简介
Spark Shell 是Spark提供的交互式命令行工具,支持Scala(默认)和Python(PySpark Shell),无需编写完整项目即可:

(1)快速测试Spark API
(2)调试数据处理逻辑
(3)验证分布式计算效果
二、启动Spark Shell

2.1 基础启动命令

执行下列命令进入Spark-Shell交互环境:
spark-shell--master
--master表示指定当前连接的Master节点。

参数名称 相关说明
local 使用一个Worker线程本地化运行Spark
local[ * ] 本地运行Spark,工作线程数量与本机CPU逻辑核心数量相同

local[N]

使用N个Worker线程本地化运行Spark
spark: //host: port Standalone模式下,连接到指定的Spark集群,默认端口 7077
yarn-client 以客户端模式连接Yarn集群,集群位置可在HADOOP_CONF_DIR环境变量中配置
yarn-cluster 以集群模式连接Yarn集群,集群位置可在HADOOP_CONF_DIR 环境变量中配置
mesos: //host: port 连接到指定的Mesos集群。默认接口是5050

    从Spark Shell 启动过程的输出信息中可以看出,Spark Shell启动时创建了一个名为sc 的变量,该变量为类SparkContext的实例,可以在Spark Shell 中直接使用。SparkContext 存储Spark上下文环境,是提交Spark应用程序的入口,负责与Spark集群进行交互。
    若启动命令不添加--master参数,则默认是以本地(单机)模式启动的,即所有操作任务只是在当前节点,而不会分发到整个集群。
    然后,Spark启动了一个名为Spark Shell 的应用程序(如果 Spark Shell 不退出,该应用程序就一直存在)。这说明,实际上 Spark Shell 底层调用了 spark-submit进行应用程序的提交。与spark-submit 不同的是,Spark Shell 在运行时会先进行一些初始参数的设置,并且Spark Shell是交互式的。
若需退出Spark Shell,则可以执行以下命令:
scala>:quit

2.2 常用参数

参数 示例 说明
--master --master yarn 集群模式
--executor-memory --executor-memory 4G 每个Executor内存 
--driver-memory --driver-memory 2G  Driver进程内存 
--packages --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4.4  添加依赖库(如Kafka连接器) 
--jars   --jars /path/to/custom.jar 添加自定义JAR包
--conf --conf spark.sql.shuffle.partitions=200 覆盖配置项

三、Spark Shell交互操作

3.1 Scala Shell基础操作

// 1. 创建RDD(弹性分布式数据集)
val data = sc.parallelize(1 to 100)  // 生成1-100的RDD

// 2. 执行转换操作
val doubled = data.map(_ * 2)         // 每个元素乘以2
val filtered = data.filter(_ % 3 == 0) // 筛选3的倍数

// 3. 执行动作操作(触发计算)
println(filtered.collect().mkString(", ")) // 输出: 3, 6, 9, ..., 99

// 4. 使用Spark SQL
val df = spark.createDataFrame(Seq(
  ("Alice", 28), ("Bob", 35), ("Cathy", 22)
)).toDF("name", "age")
df.show()

3.2 PySpark Shell基础操作

# 1. 创建RDD
rdd = sc.parallelize([1, 2, 3, 4, 5])

# 2. 执行转换操作
squared = rdd.map(lambda x: x ** 2)

# 3. 执行动作操作
print(squared.collect())  # 输出: [1, 4, 9, 16, 25]

# 4. 使用Spark SQL
from pyspark.sql import Row
df = spark.createDataFrame([
    Row(name="Alice", age=28),
    Row(name="Bob", age=35)
])
df.createOrReplaceTempView("people")
result = spark.sql("SELECT name, age FROM people WHERE age > 30")
result.show()

3.3 常用Shell技巧
(1)Tab补全:输入部分变量名后按Tab键自动补全
(2)历史命令:按↑/↓键浏览历史命令
(3)多行编辑:在Scala Shell中按:paste进入粘贴模式(支持复制多行代码)
(4)退出Shell:Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)

四、集群模式使用示例
4.1 YARN集群模式

# 启动Spark Shell并提交到YARN集群
./bin/spark-shell \
  --master yarn \
  --deploy-mode client \
  --executor-memory 8G \
  --num-executors 10 \
  --queue production


验证集群运行

1.访问YARN ResourceManager UI(默认端口8088)
2.查看Application ID对应的任务详情
4.2 Kubernetes集群模式

# 需提前配置kubectl和Spark on Kubernetes
./bin/spark-shell \
  --master k8s://https://:6443 \
  --deploy-mode cluster \
  --name spark-shell-demo \
  --conf spark.kubernetes.container.image=spark-py:3.4.4 \
  --conf spark.executor.instances=5

五、调试与分析

5.1 日志调试

// 1. 调整日志级别(Scala Shell)
import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)  // 仅显示WARN及以上日志

// 2. 查看Driver日志(集群模式)
yarn logs -applicationId 

5.2 性能分析

// 1. 启用Spark事件日志(需提前配置spark-defaults.conf)
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode:8020/spark-events

// 2. 使用Spark History Server查看历史任务
# 启动History Server
./sbin/start-history-server.sh
# 访问 http://:18080

六、Spark Shell的使用总结

核心优势:

1.零构建成本:无需创建Maven/Gradle项目,直接启动即可测试Spark功能
2.即时反馈:交互式命令行支持代码逐行执行,快速验证逻辑正确性
3.多语言支持:提供Scala(默认)和PySpark(Python)两种Shell版本
4.无缝集成:可直接访问HDFS、Hive、Delta Lake等大数据生态组件

    Spark Shell是Spark开发者的基础,通过合理使用可大幅缩短从需求到验证的周期。建议结合生产环境配置(如Kerberos认证、资源队列)进行全链路测试,同时建立Shell代码片段库,将常用操作封装为可复用的函数或脚本。

你可能感兴趣的:(spark,大数据,分布式)