(转)重述——单一职责原则

单一职责原则(SRP)提倡一个类只负责一个职责,避免多个职责耦合在一起导致设计脆弱。文章通过调制解调器的例子解释如何将职责分离,并阐述了遵循SRP的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=medium][b]单一职责原则(Single Responsibility Principle SRP)[/b][/size]
There should never be more than one reason for a class to change.

什么意思呢?
所谓单一职责原则就是[b]一个类只负责一个职责,只有一个引起变化的原因。[/b]
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化会削弱或抑制这个类完成其他职责的能力,这个耦合会脆弱的设计。
软件设计真正要做的许多内容,就是[b]发现职责并把这些职责相互分离;如果能够想到多于一个动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的分离。[/b]
以调制解调器为例如下图:
[img]http://dl2.iteye.com/upload/attachment/0090/6416/cd0b9024-09d5-340b-9a6f-f1a772cae32f.jpg[/img]                      
从上述类图里面我们发现有四个方法Dial(拨通电话),Hangup(挂电话),Receive(收到信息),Send(发送信息),经过分析不难判断出,实际上Dial(拨通电话)和Hangup(挂电话)是属于连接的范畴,而Receive(收到信息)和Send(发送信息)是属于数据传送的范畴。这里类包括两个职责,显然违反了SRP。
这样做有潜在的隐患,如果要改变连接的方式,势必要修改Modem,而修改Modem类的结果导致凡事依赖Modem类可能都需要修改,这样就需要重新编译和部署,不管数据传输这部分是否需要修改。
因此要重构Modem类,从中抽象出两个接口,一个专门负责连接,另一个专门负责数据传送。依赖Modem类的元素要做相应的细化,根据职责的不同分别依赖不同的接口。如下图:

[img]http://dl2.iteye.com/upload/attachment/0090/6418/272e0ec8-f26e-3fb2-bd05-58f835dd4d16.jpg[/img]
这样以来,无论单独修改连接部分还是单独修改数据传送部分,都彼此互不影响。
总结单一职责优点:
[list]
[*] 降低类的复杂性,
[*] 提高可维护性
[*] 提高可读性。
[/list]
降低需求变化带来的风险。需求变化是不可避免的,如果单一职责做的好,一个接口修改只对相应的实现类有影响,对其它的接口无影响,这对系统的扩展性和维护性都有很大的帮助。

原文链接:[url]http://www.cnblogs.com/shaosks/archive/2012/02/02/2335478.html[/url]
<think>我们已知用户想在CentOS 9中使用Spark运行一个JAR包。根据引用内容,我们可以总结出以下关键步骤: 1. 确保Spark已正确安装并配置好环境变量(如SPARK_HOME)。 2. 如果使用集群模式,需要先启动Spark集群(Standalone模式)或配置好YARN(如引用[3]和[5]所示)。 3. 使用spark-submit命令提交JAR包,并指定主类、运行模式、资源参数等。 具体步骤: 步骤1:确认Spark安装和环境变量 在CentOS 9中,假设Spark已经按照引用[1]或[3]的方式安装。通常,我们会将Spark安装在某个目录(如/opt/spark或/usr/local/spark),并设置SPARK_HOME环境变量。 步骤2:启动Spark集群(如果需要集群模式) 如果是Standalone模式,按照引用[3]中的步骤: - 配置spark-env.sh和slaves文件。 - 使用start-all.sh启动集群。 步骤3:使用spark-submit提交应用 根据引用[2]中的示例,我们可以构造一个spark-submit命令。注意,用户需要提供JAR包的路径和主类名。 示例命令(Standalone模式): $SPARK_HOME/bin/spark-submit \ --master spark://<master-host>:7077 \ # 引用[3]中配置的master主机和端口 --deploy-mode client \ # 或者cluster --class <主类的全限定名> \ [其他可选参数,如executor内存、核心数等] \ /path/to/your-jar-file.jar \ [应用程序参数] 如果使用YARN模式,则--master应设置为yarn,并且需要确保Hadoop和YARN配置正确(如引用[5]中配置了yarn-site.xml)。 步骤4:监控应用 可以通过Spark的Web UI(默认master节点8080端口)来监控应用运行状态。 考虑到用户的具体环境,这里给出一个通用的步骤说明。 详细步骤: 1. 打开终端,确保当前用户有执行Spark的权限。 2. 检查Spark环境: 输入:`echo $SPARK_HOME`,确认是否设置。如果未设置,需要先设置,例如: export SPARK_HOME=/opt/spark # 根据实际安装路径修改 export PATH=$PATH:$SPARK_HOME/bin 3. 如果使用Standalone集群,确保集群已启动。可以使用`$SPARK_HOME/sbin/start-all.sh`启动(需要配置好从节点)。 4. 提交JAR包。例如,假设我们的主类是com.example.Main,JAR包在/home/user/app.jar,使用Standalone集群(master节点为centos9-master:7077),客户端部署模式,执行: $SPARK_HOME/bin/spark-submit \ --master spark://centos9-master:7077 \ --deploy-mode client \ --class com.example.Main \ /home/user/app.jar 5. 如果需要传递参数给应用程序,可以在JAR文件后面添加,例如: ... \ /home/user/app.jar arg1 arg2 6. 如果运行在本地模式(仅用于测试),可以将--master设置为local[*](使用所有核心)或local[K](使用K个核心)。 注意:在CentOS 9中,确保Java环境与Spark兼容。根据引用[1],Spark 0.9需要Java 7,但如果是较新的Spark版本,可能需要Java 8或11。可以使用`java -version`检查。 另外,如果JAR包依赖其他库,可以使用--jars参数指定逗号分隔的JAR文件列表,或者使用--packages指定Maven坐标。 根据引用[4],如果涉及到有状态计算(如Spark Streaming),可能需要配置checkpoint目录(如HDFS路径)。 如果遇到权限问题,特别是访问HDFS时,需要确保用户有相应权限(参考引用[5]中关于Hadoop配置的内容)。 相关问题: 1. 如何在CentOS 9上安装Spark? 2. 如何配置Spark Standalone集群? 3. 如何解决Spark提交作业时的依赖问题? 4. 如何监控Spark作业的运行状态? 5. 在Spark中如何配置资源分配(如executor内存、核心数)? 下面,我们按照用户要求的结构化方式回答。</think>### 在 CentOS 9 中使用 Spark 运行 JAR 包的完整指南 #### 1️⃣ 环境准备 1. **确认 Java 环境** Spark 需要 Java 8/11/17(根据引用[1]建议匹配版本): ```bash java -version # 若未安装,使用 CentOS 9 默认仓库安装 sudo dnf install java-17-openjdk-devel ``` 2. **配置 Spark 环境变量**(参考引用[1][3]): ```bash # 编辑 ~/.bashrc 或 /etc/profile export SPARK_HOME=/usr/local/spark # 根据实际安装路径修改 export PATH=$PATH:$SPARK_HOME/bin # 使配置生效 source ~/.bashrc ``` 3. **启动 Spark 集群**(Standalone 模式): ```bash # 配置节点(参考引用[3]) echo "SPARK_MASTER_HOST=centos9-master" >> $SPARK_HOME/conf/spark-env.sh echo "worker-node1" >> $SPARK_HOME/conf/slaves # 添加工作节点 # 启动集群 $SPARK_HOME/sbin/start-all.sh ``` #### 2️⃣ 提交 JAR 文件的核心命令 ```bash $SPARK_HOME/bin/spark-submit \ --class <主类全限定名> \ # 如 com.example.MainApp --master spark://centos9-master:7077 \ # 主节点地址 --deploy-mode client \ # 或 cluster 模式 --executor-memory 2G \ # 每个执行器内存 --total-executor-cores 4 \ # 总核心数 /path/to/your-app.jar \ # JAR 文件路径 [应用参数] # 可选参数 ``` #### 3️⃣ 不同场景示例 **▶ 基础执行**(参考引用[2]): ```bash $SPARK_HOME/bin/spark-submit \ --master spark://CentOS:7077 \ --deploy-mode client \ --class com.baizhi.demo02.SparkRDDWordCount \ --num-executors 3 \ --total-executor-cores 4 \ /root/sparkrdd-1.0-SNAPSHOT.jar ``` **▶ 流处理应用**(参考引用[4]): ```bash $SPARK_HOME/bin/spark-submit \ --class com.example.StreamApp \ --master spark://centos9-master:7077 \ --conf spark.driver.extraJavaOptions="-Dcheckpoint.dir=hdfs:///spark-checkpoint" \ /opt/spark-apps/stream-process.jar ``` **▶ YARN 模式执行**(需配置引用[5]的 YARN): ```bash $SPARK_HOME/bin/spark-submit \ --class com.example.YARNApp \ --master yarn \ --deploy-mode cluster \ --executor-memory 4G \ /home/user/yarn-app.jar ``` #### 4️⃣ 常见问题解决 1. **类未找到错误**: ```bash # 添加额外依赖 --jars /path/to/mysql-connector.jar \ --conf spark.executor.extraClassPath=/path/to/libs/* ``` 2. **资源不足错误**: ```bash # 调整资源配置 --executor-memory 4G \ --executor-cores 2 \ --num-executors 6 ``` 3. **HDFS 集成问题**(参考引用[4][5]): ```bash # 在代码中使用 HDFS 路径 val data = sc.textFile("hdfs://centos9-master:9000/data/input.txt") ``` #### 5️⃣ 关键注意事项 1. **JAR 打包要求**: - 使用 `sbt-assembly` 或 `maven-shade-plugin` 构建包含依赖的 fat JAR - 确认 Scala 版本匹配(参考引用[1]的版本兼容性) 2. **端口冲突处理**: ```bash # 修改默认端口(编辑 spark-env.sh) export SPARK_MASTER_WEBUI_PORT=9080 export SPARK_WORKER_WEBUI_PORT=9081 ``` 3. **日志查看**: ```bash # 查看实时日志 tail -f $SPARK_HOME/logs/spark-*.out # Web UI 监控 http://centos9-master:8080 # Standalone 模式 ``` #### 6️⃣ 完整执行流程示例 ```bash # Step 1: 启动 HDFS(如需) hdfs namenode -format start-dfs.sh # Step 2: 上传测试数据 hdfs dfs -put /local/data.txt /data/input.txt # Step 3: 提交应用 $SPARK_HOME/bin/spark-submit \ --class com.example.WordCount \ --master spark://centos9-master:7077 \ --deploy-mode client \ --executor-memory 2G \ --total-executor-cores 8 \ /opt/spark-apps/wordcount.jar \ hdfs:///data/input.txt \ hdfs:///data/output # Step 4: 查看结果 hdfs dfs -cat /data/output/part-* ``` ### 相关问题 1. 如何解决 Spark 作业中的 `ClassNotFoundException` 错误?[^1][^5] 2. 在 Standalone 模式下如何动态调整计算资源?[^2][^3] 3. Spark Streaming 如何实现故障恢复和状态管理?[^4] 4. YARN 模式下资源分配的最佳实践是什么?[^5] 5. 如何优化 Spark 应用的 Shuffle 操作性能?[^2][^4] > 提示:执行前确保所有节点防火墙开放所需端口(7077, 8080, 4040等),可通过 `sudo firewall-cmd --add-port=7077/tcp --permanent` 配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值