spark:仿写案例--30

最近在仿写spark官方的例子,希望能获得提高,不积跬步无以至千里

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.BroadcastTest:测试Broadcast,Broadcast是共享变量的广播变量,只读属性

package llf

import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by sendoh on 2015/4/20.
 */
object BroadcastTest { 
  def main(args: Array[String]): Unit ={
    val bcName = if (args.length > 2) args(2) else "Http" //定义分块名称
    val blockSize = if (args.length > 3) args(3) else "4096" //定义分块大小
    val conf = new SparkConf().setAppName("BroadcastTest").setMaster("local[2]").setSparkHome("/usr/local/spark-1.2.0-bin-hadoop2.4")
      .set("spark.broadcast.factory", s"org.apache.spark.broadcast.${bcName}BroadcastFactory")
      .set("spark.broadcast.blockSize", blockSize)
    val sc = new SparkContext(conf)

    val slices = if (args.length > 0) args(0).toInt else 2 //分割大小
    val num = if (args.length > 1) args(1).toInt else 1000000 //分割数量

    val arr1 = (0 until num).toArray //定义arr1为0到最大分割数的数组

    for (i <- 0 until 3){ //012
      println("Iteration" + i)
      println("============")
      val startTime = System.nanoTime //定义启动时间
      val barr1 = sc.broadcast(arr1) //对arr1进行广播
      val observedSizes = sc.parallelize(1 to 10, slices).map(_ => barr1.value.size) //观测量大小,10行平行
      observedSizes.collect().foreach(i => println(i))
      println("Iteration %d took %.0f milliseconds".format(i, (System.nanoTime - startTime) / 1E6))
    }
    sc.stop()
  }

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.DriverSubmissionTest

package llf
import org.apache.spark.util.Utils
import scala.collection.JavaConversions._
/**
 * Created by sendoh on 2015/4/20.
 */
object DriverSubmissionTest {
  def main(args: Array[String]): Unit ={ //args初始化形参的值
    if (args.length < 1){
      println("Usage: DriverSubmissionTest <seconds-to-sleep>")
      System.exit(0)
    }
    val numSecondsToSleep = args(0).toInt
    val env = System.getenv() //从环境中取字符串,获取环境变量的值
    val properties = Utils.getSystemProperties() //工具获取系统特性
    println("Environment variables containing SPARK_TEST:")
    env.filter{case (k, v) => k.contains("SPARK_TEST")}.foreach(println)
    println("System properties containing spark.test:")
    properties.filter{case (k, v) => k.toString.contains("spark.test")}.foreach(println)
    for (i <- 1 until numSecondsToSleep) {
      println(s"Alive for $i out of $numSecondsToSleep seconds")
      Thread.sleep(1000)
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3.ExceptionHandingTest:抛出异常测试
package llf

import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by sendoh on 2015/4/22.
 */
object ExceptionHandlingTest {  //异常处理测试
  def main(args: Array[String]): Unit ={
    val conf = new SparkConf().setAppName("ExceptionHandlingTest").setMaster("local[2]")
    val sc = new SparkContext(conf)
    sc.parallelize(0 until sc.defaultParallelism).foreach{ i => //sc的平行值为0~默认值,对于每个元素来说,如果随机产生的值(0-1.0)大于0.75 发送新的异常
      if (math.random > 0.75){                             //random产生随机数
        throw new Exception("Testing Exception Handling") //throw用于发送异常
      }
    }
    sc.stop()
  }

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4.GroupByTest:测试根据键值分组

package llf

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.SparkContext._
import scala.util.Random

/**
 * Created by sendoh on 2015/4/22.
 */
object GroupByTest {
  def main(args: Array[String]): Unit ={
    val conf = new SparkConf().setAppName("GroupByTest").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val numMappers = if (args.length > 0) args(0).toInt else 2  //args形参数组要通过命令行运行的时候赋值,将形参的第一个值赋值给numMappers
    val numKVPairs = if (args.length > 1) args(1).toInt else 1000 //将形参的第二个值负值给numKVPairs
    val valSize = if (args.length > 2) args(2).toInt else 1000 //将形参的第三个值赋值给valSize
    val numReducers = if (args.length > 3) args(3).toInt else numMappers //将形参的第四个值赋值给numReducers

    val pairs1 = sc.parallelize(0 until numMappers, numMappers).flatMap{ p =>
      val ranGen = new Random //定义ranGen为一个随机数
      val arr1 = new Array[(Int, Array[Byte])](numKVPairs)
      for (i <- 0 until numKVPairs){
        val byteArr = new Array[Byte](valSize)
        ranGen.nextBytes(byteArr)
        arr1(i) = (ranGen.nextInt(Int.MaxValue), byteArr)
      }
      arr1
    }.cache()
    pairs1.count()
    println(pairs1.groupByKey(numReducers).count())
    sc.stop()
  }

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

初学spark还有很多很多要学的东西,欢迎共同讨论相关问题QQ:1217111493

<think>我们正在使用Bitnami的Spark镜像版本3.4.1,用户询问是否需要修改配置文件以实现正常运行。根据引用[1]和引用[3],Bitnami的Spark镜像在3.4.0以上版本运行PySpark时可能存在一些问题(如报错`Error: pysparkdoes notsupport anyapplication options`),但这个问题与配置文件无关,而是镜像本身的问题。引用[1]中提到,用户通过构建官方镜像解决了这个问题。 然而,用户现在使用的是Bitnami镜像3.4.1,所以我们需要关注配置文件的修改是否必要。通常,Bitnami镜像已经预配置了合理的默认设置,但根据实际集群环境和应用需求,可能需要对某些配置进行调整。 ###一、BitnamiSpark镜像的默认配置BitnamiSpark镜像已经内置了以下关键配置(位于`/opt/bitnami/spark/conf`): 1. **`spark-defaults.conf`**:包含默认Spark配置,如执行器内存、核心数等。 2. **`log4j.properties`**:日志配置。 3. **`spark-env.sh`**:环境变量设置(如`SPARK_MASTER_HOST`等)。 ###二、需要检查/修改的配置文件场景|配置文件|通常需要修改的场景| Bitnami镜像注意事项| |---------|-------------------|---------------------|| `spark-defaults.conf`|调整资源分配(如`spark.executor.memory`)、动态分配等|镜像已设置默认值,但需根据实际资源调整[^3] || `spark-env.sh`|设置Master主机地址、端口、Worker参数等 |在Docker环境中,通常通过环境变量覆盖(如`SPARK_MODE=master`)[^3] || `log4j.properties` |调整日志级别(如`log4j.rootCategory=ERROR`) |非必要不改动| ###三、Bitnami3.4.1镜像的特定问题根据引用[1]的GitHub issue,3.4.0+版本的Bitnami镜像运行PySpark时可能报错,但这与配置文件无关。解决方案是: 1. **改用官方镜像**(推荐),或2. **修改启动命令**(临时方案):```bash#错误方式(会触发上述问题)dockerexec-itspark-master pyspark--optionvalue#正确方式(避免传递应用选项)docker exec-itspark-master pyspark``` ###四、配置文件修改操作指南若仍需使用Bitnami镜像并调整配置:1.**挂载自定义配置文件**:```yaml#docker-compose.yml示例services:spark-worker:image:bitnami/spark:3.4.1volumes:- ./custom-spark-defaults.conf:/opt/bitnami/spark/conf/spark-defaults.conf``` 2. **通过环境变量覆盖**(仅限`spark-env.sh`中的参数):```yamlenvironment:- SPARK_WORKER_MEMORY=4g``` ###五、验证配置生效1.进入容器检查配置文件:```bashdockerexec -it spark-workercat /opt/bitnami/spark/conf/spark-defaults.conf``` 2.SparkUI的`Environment`标签页查看实际生效配置。>**结论**:Bitnami镜像的默认配置在多数场景下可直接运行,但若遇到性能问题或特定需求,需调整资源参数。PySpark报错问题非配置导致,建议换用官方镜像[^1]。 ---§§相关问题§§1.如何为SparkonDocker配置集群节点间的SSH免密登录?2.Bitnami Spark镜像与官方Spark镜像在目录结构上有哪些差异?3.在Docker中运行Spark时,如何持久化历史事件日志(EventLog)?4.如何动态调整SparkExecutor的堆外内存(off-heapmemory)?[^1]:[Bitnami容器问题#38139](https://github.com/bitnami/containers/issues/38139)[^3]:[Win11 Docker快速部署spark](参考链接)</think>### Spark 配置文件修改指南(Bitnami 镜像 3.4.1 版本) #### 一、必须修改的核心配置 根据 Bitnami 镜像特性[^1][^3],以下配置文件需优先调整: 1. **`spark-defaults.conf`**(资源分配) ```properties # 调整内存分配(默认值常导致 OOM) spark.executor.memory 4g spark.driver.memory 2g spark.memory.offHeap.enabled true spark.memory.offHeap.size 1g # 解决 PySpark 兼容性问题(3.4.0+ 关键修复) spark.pyspark.python python3 spark.sql.execution.arrow.pyspark.enabled true ``` 2. **`spark-env.sh`**(集群设置) ```bash # 指定 Master 节点(Docker 部署必需) export SPARK_MASTER_HOST=spark-master # 解决端口冲突(Bitnami 默认端口可能被占用) export SPARK_MASTER_WEBUI_PORT=8081 export SPARK_WORKER_WEBUI_PORT=8082 ``` #### 二、可选优化配置 ```properties # 提升 Shuffle 性能 spark.shuffle.service.enabled true spark.sql.shuffle.partitions 200 # 解决日志警告(常见于 Bitnami 镜像) spark.eventLog.enabled false log4j.logger.org.apache.spark=ERROR ``` #### 三、Bitnami 特定配置 1. **镜像构建修复**(解决 PySpark 报错问题) 在 Dockerfile 中添加: ```dockerfile FROM bitnami/spark:3.4.1 # 修复应用选项解析问题 RUN sed -i 's/exec "$@"/exec "$@" --conf spark.driver.extraJavaOptions="-Dio.netty.tryReflectionSetAccessible=true"/' /opt/bitnami/scripts/spark/run.sh ``` 2. **Docker Compose 覆盖配置** ```yaml services: spark-worker: image: your_custom_image # 使用修复后的镜像 environment: - SPARK_WORKER_CORES=2 - SPARK_WORKER_MEMORY=8g volumes: - ./custom-conf:/opt/bitnami/spark/conf # 挂载自定义配置 ``` #### 四、验证配置生效 1. 在容器内检查配置合并: ```bash docker exec -it spark-worker cat /opt/bitnami/spark/conf/spark-defaults.conf ``` 2.Spark UI 的 `Environment` 标签页确认配置生效: ``` http://localhost:8081/environment/ ``` > **关键说明**:Bitnami 镜像的默认配置在 3.4.0+ 版本存在 PySpark 兼容性问题[^1],必须通过配置覆盖或镜像重建解决。资源参数需根据集群硬件调整,否则易触发 Executor KILLED(143) 错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值