AWS EMR:如何自动编辑所有从节点上的文件?
高效配置EMR从节点Matplotlib后端的方案
嘿,手动挨个SSH改节点配置确实太折腾了,给你几个更高效的解决方案,按需选就行:
1. 最推荐:用EMR引导动作(Bootstrap Action)
这是一劳永逸的法子,在创建EMR集群的时候就自动完成所有节点的配置,完全不用事后手动操作。
你只需要写一个简单的shell脚本,上传到S3,然后在创建集群时指定这个脚本作为引导动作。脚本会在所有节点(主节点+从节点)上自动执行。
示例脚本(命名为configure_matplotlib.sh):
#!/bin/bash # 注意:路径要和你的Python版本匹配,这里是Python2.7的路径 MATPLOTLIBRC_PATH="/usr/local/lib64/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc" # 替换配置文件里的backend为agg sed -i 's/^backend.*$/backend: agg/' $MATPLOTLIBRC_PATH # 额外:设置全局环境变量,确保所有会话都生效 echo 'export MPLBACKEND=agg' >> /etc/profile.d/matplotlib.sh chmod +x /etc/profile.d/matplotlib.sh
创建集群时,在引导动作里添加这个S3路径的脚本就行,集群启动后所有节点就都配置好了。
2. 针对已运行的集群:批量执行命令
如果你的集群已经在运行,不想重新创建,用批量命令工具一次性搞定所有从节点:
方法A:用pdsh(EMR默认预装)
- 先获取所有从节点的私有IP:
aws emr list-instances --cluster-id <你的集群ID> --instance-group-types CORE --query 'Instances[*].PrivateIpAddress' --output text > core_nodes.txt
- 用pdsh批量执行修改命令:
pdsh -w ^core_nodes.txt "sudo sed -i 's/^backend.*$/backend: agg/' /usr/local/lib64/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc && sudo echo 'export MPLBACKEND=agg' >> /etc/profile.d/matplotlib.sh"
方法B:用AWS Systems Manager Run Command
如果你的节点有SSM权限,直接用Run Command批量执行修改命令,不用管IP,AWS会帮你搞定所有从节点的执行。
3. 最灵活:在Python脚本里动态设置
不想碰节点配置的话,直接在你的Python脚本开头强制设置后端,这样脚本走到哪都能正常运行,不依赖集群配置:
import matplotlib # 先设置非交互式的agg后端 matplotlib.use('agg') # 再导入pyplot import matplotlib.pyplot as plt # 接下来正常写绘图代码就行 plt.plot([1, 3, 2]) plt.savefig('result.png')
这个方式的好处是脚本自包含,换个集群也不用重新配置。
内容的提问来源于stack exchange,提问作者kanimbla
相关产品推荐
相关产品推荐

