排错思想

作为一名系统工程师,排错是工作过程中经常会遇到的内容,而需要排错的对象往往是千奇百怪,各种各样都有。系统工程师被誉为“什么都懂的人”,因此,一旦发生问题,往往就成为了第一个被想到的人。相信,广大一线运维工程师都有这样的经历。

无疑,排错是需要技巧的。因为这项工作不仅需要很好的逻辑思维能力和丰富的工作经验,同时还需要使用正确的方式,合理的行为,正确的过程。我曾经面试过、管理过很多系统工程师,也教过很多学生。在工作中我发现很多新手对于如何排错往往不那么在行。 

事实上,在经过无数次排错工作之后,我深深的感觉到:排错没有固定的方法和手段,掌握正确的排错思想才是最为重要的。我把我的排错思想总结为几个基本的步骤。在此,分享一下个人的体会,抛砖引玉,请各位指正。

第一步:观察错误

观察错误,说白了就是搞清楚发生了什么。

一些新手,特别是一些“文档工”只知道照着文档一步步敲命令,出现问题了,也只是按照一些所谓的技术手册或者故障手册去排查问题。这是不可取的。

你必须清楚发生了什么。

你可以通过标准错误输出(一般来说它们会直接输出到屏幕上)、错误日志、监控工具等途径获取到相应信息。有些linux工程师只知道去看/var/log/message日志,有些AIX工程师只知道看errpt,还有些windows工程师压根什么都不知道看。以上这些都是不可取的,错误的。你必须知道可以通过哪些途径获取到计算机给你的反馈。并且,通过这些反馈了解到底发生了什么

第二步:分析问题

分析问题,说白了就是搞清楚在发生问题的时候计算机在干什么。

上面这句话说起来简单,实际上涉及的内容却很复杂。想要知道发生问题的时候计算机在干什么,首先要能够在第一步搞清楚发生了什么。之后,需要你对相关技术以及能够对发生问题的系统产生影响的相关技术都有很深刻的了解。不然,光靠拍脑门猜测是不行的。

举个例子,比如我在访问web服务器的时候发生了connect refused这个报错,该如何分析呢?

 

错误分析思路

如上图所示,左边是分析发生问题的时候计算机在干什么的思路(出现报错->web服务得到请求了吗?),右边是由此产生的问题可能性罗列。通过这个图可以看出,当看到一个报错的时候,最好脑子里把整个流程跑一遍,然后清楚的知道哪个环节发生了问题,之后再由这个环节发散去想导致出现问题的可能性有哪些。

上面这个例子仅仅问题还是很简单的。有时候在生产环境里遇到的问题可能更加复杂,更加妖怪,所以更要好好在脑子里把流程跑清楚。要做到这一点,必须下功夫把所接触的技术研究透彻,至少要把内部工作机理搞清晰一些。这样才能开始做第三个步骤。

第三步:解决问题

解决问题要遵循三个原则:先备份后操作、优先解决和一次一项。

先备份后操作应该是每个系统工程师都遵循的原则。所谓手里有粮,心里不慌。有了备份,出现问题好歹有个回退的余地。不要忘记,管理员往往就是最危险的破坏者。

什么叫优先解决呢?意思就是,在上一个步骤的时候,把可能导致问题的可能性按照可能性的大小按照优先级别排列好。可能性越大的,越先去看。学过CISCO课程的人可能都知道“先硬后软”的道理,意思就是说遇到网络故障,先检查硬件上的问题,看看线路是否有问题,接口是否有问题,模块是否完好等等,然后再去调整设备内部的配置。这就是一个典型的例子。最怕的是随便抓一个可疑点就一脑袋扎进去,结果耗费了大量的时间,问题却得不到解决。

那么什么叫一次一项呢?意思就是,一次只改动一个配置,一次只变动一个设备。同时做多项改动很可能把原本简单的问题复杂化。倒霉的时候,你可能本来改对了,但是其他多余的变动导致出现了新的错误。到最后错上加错,问题越来越蹊跷诡异了。

第四步:后期跟踪

问题是否真的解决了?会不会对其他系统或者设备产生连带影响?一切都按照我们的设想继续下去了吗?这一切都需要后期跟踪才知道。所以说,不要想着一次排错之后,工作就结束了。后期的跟踪也很重要。如果你是甲方工程师,不要忘记这一点,否则会很难受。如果你是乙方工程师不要忽视这个工作,否则后面麻烦不断。

详情请看《Linux系统工程师的必备素质》http://johnwang.blog.51cto.com/474770/898278

<think>我们有两个主要问题需要解决:1.Spark排错方法2.Spark重新初始化后如何保持原有配置不变(已在上次回答中详细说明,本次需结合引用资料补充)结合引用材料:引用[1]提到eBay在数据仓库迁移中的实践经验,包括环境隔离、数据比对和灰度上线。这些思想可用于Spark排错。引用[2]提到Hadoop配置文件分类,其中xxxx-site.xml会覆盖默认配置。这启示我们可以通过外部配置文件保证配置一致性。引用[3]提到Avi架构中控制平面与数据平面解耦,虚拟服务可漂移。这虽非直接相关,但可借鉴其高可用思想。针对问题一:Spark排错方法我们将结合引用[1]的实践经验,给出系统化排错步骤。针对问题二:重新初始化后保留配置上次已详细回答,本次将:-强调外部配置文件的作用(呼应引用[2])-补充灰度切换思想(呼应引用[1])具体回答结构如下:###Spark排错方法####1.环境隔离(引用[1])####2.日志分析####3.数据比对(引用[1])####4.灰度发布(引用[1])###保持重新初始化后的配置####方法1:外部配置文件(引用[2])####方法2:编程式配置管理(代码示例)####方法3:双跑验证与灰度切换(引用[1])最后生成相关问题</think> ### Spark排错方法 结合eBay的实践经验[^1],Spark排错可遵循以下系统化方法: #### 1. **环境隔离与日志分析** - **隔离环境**:确保开发、测试和生产环境完全隔离(如独立集群或Namespace)[^1],避免相互干扰。 - **日志定位**: ```bash # 查看Driver日志(YARN模式) yarn logs -applicationId <app_id> > driver.log # 查看Executor日志 spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/path/to/log4j.properties ``` 通过`log4j.properties`配置日志级别(如`log4j.logger.org.apache.spark=DEBUG`)[^2]。 #### 2. **数据比对与校验** - **双跑验证**:新任务与旧系统(如Teradata)并行运行7天,对比输出结果一致性[^1]: ```scala // 示例:比对两个DataFrame差异 val diff = df_new.except(df_old).count() assert(diff == 0, "Data mismatch detected!") ``` - **启用Spark检查点**:`ss.checkpoint("hdfs://checkpoint_path")` 确保计算容错性。 #### 3. **灰度发布与回滚** - **分批启用任务**: 1. 将10%流量切至新pipeline,观察指标(如`spark.ui`中的`Shuffle Write/Read`)。 2. 确认无异常后全量切换,保留旧pipeline回退能力[^1]。 - **监控关键指标**: - Executor内存泄漏:`jmap -histo <pid>` 分析堆内存 - Shuffle性能:调优`spark.sql.shuffle.partitions`和`spark.shuffle.service.enabled`[^2]。 --- ### 重新初始化后保留配置的方法 #### 方法1:外部配置文件(推荐) 通过`--properties-file`加载统一配置,确保重建时配置不变[^2]: ```bash spark-submit --properties-file /path/to/spark-defaults.conf ... ``` 配置文件示例(`spark-defaults.conf`): ```ini spark.executor.memory 4g # 全局内存配置 spark.sql.shuffle.partitions 200 ``` #### 方法2:编程式配置继承 ```scala // 获取旧配置 val oldConf: Map[String, String] = spark.conf.getAll // 重建时注入配置 val newSpark = SparkSession.builder .appName("NewApp") .config(oldConf) // 继承所有配置 .config("spark.driver.extraJavaOptions", "-DlogLevel=DEBUG") // 新增配置 .getOrCreate() ``` **注意事项**: - 动态配置(如`spark.conf.set()`)需重新设置 - 需手动重建:注册表、UDF、广播变量[^1]。 #### 方法3:灰度切换配置 1. 新Session启用后,与旧Session并行运行数据比对任务 2. 验证输出一致后,再停用旧Session[^1]。 --- ### 最佳实践总结 | **场景** | **方案** | **可靠性保障** | |-------------------------|------------------------------|------------------------------| | 配置一致性 | 外部配置文件[^2] | 避免硬编码,支持版本控制 | | 任务迁移/升级 | 双跑验证 + 灰度发布[^1] | 数据零丢失,快速回滚 | | 动态调优 | `spark.conf.set()`实时生效 | 无需重启集群 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值