shell 脚本实战笔记(10)--spark集群脚本片段念念碎

前言:

  通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记.

*). 取当前脚本的目录

sbin=`dirname "$0"`
sbin=`cd "$sbin"; pwd`

代码评注:
# 以上代码为获取执行脚本所在的目录的常用技巧
# sbin=$(dirname $0) 返回可能是相对路径, 比如./
# sbin=$(cd $sbin; pwd) 采用pwd, 来返回脚本所在目录的绝对路径

*). 循环遍历脚本参数

while (( "$#" )); do
  case $1 in
    --with-tachyon)
      TACHYON_STR="--with-tachyon"
    ;;
  esac
  shift
done

代码评注:
# 这是段遍历脚本参数的常见代码片段
# shell脚本中$#表示参数个数
# 由于$0是脚本名称本身占据, 因此脚本对参数的遍历从$1开始, 借助shift变量左移, 方便了对变长参数列表的遍历
# 基于事件的xml解析方式, 当采用pull方式去遍历的时候, 差不多也是类似的代码结构
# 当然需要注意, shift处理参数变量之后, 对后续脚本代码处理变量是有影响的(负作用), 因此最佳实践是集中处理脚本参数

*). 引入配置脚本

. "$sbin/spark-config.sh"

代码评注:
# shell脚本中‘.‘ 等同于source, 把调用脚本作为调用方脚本的自身的一部分执行, source <shell_file>通常用于导入应用的配置参数
# source/exec/fork 外部脚本的区别, 详见这篇

*). 默认参数处理

if [ "$SPARK_MASTER_PORT" = "" ]; then
  SPARK_MASTER_PORT=7077
fi

代码评注:
# 对变量默认值的处理方式
# 注意对变量添加"", if [ $SPARK_MASTER_PORT = "" ] 会报错误: "[: =: unary operator expected"
# 类似的代码可采用-z $SPARK_MASTER_PORT的方式

if [ -z $SPARK_MASTER_PORT ]; then
  SPARK_MASTER_PORT=7077
fi

*). $!的使用和pid文件的使用

nohup nice -n $SPARK_NICENESS "$SPARK_PREFIX"/bin/spark-class $command "[email protected]" 	>> "$log" 2>&1 < /dev/null &
newpid=$!
echo $newpid > $pid

代码评注:
# nohup 表示进程脱离session运行
# nice -n 用于调整进程nice值
# 2>&1 表示把标准错误(stderr, 2)关联到标准输出(stdout, 1), 可以简写为 &>
# $!表示上一个shell命令(后台运行)的pid
# echo $newpid > $pid (代表文件), 是把进程pid写入到进程的pid文件中去
# 很多服务(比如apache)会选择把自身的pid(进程id)写入到pid文件中去, 至于为何这么做? 各有各的应用场景, 下面的kill -0就应用到了

*). kill -0 的使用, 检测进程是否存在, 重入(误判)问题

if [ -f $pid ]; then
  if kill -0 `cat $pid` > /dev/null 2>&1; then
    echo $command running as process `cat $pid`. Stop it first.
    exit 1
  fi
fi

代码评注:
# kill -0 <pid> 只是简单的向进程发送一个signal(不影响进程运行), 用来检测进程是否存在, 存在(echo $? => 0), 不存在(echo $? => 1)
# if [ -f $pid ] 判断pid文件是否存在, cat $pid, 则是获取pid值, 这与上面pid文件相吻合
# kill -0 `cat $pid` > /dev/null 2>&1 后面的‘> /dev/null 2>&1‘用于去掉不必要信息到控制台
疑问:
# 重入问题: 有点类似tcp的问题, socket占据的四元组(src: ip+port, dest: ip+port), 遗留的tcp包, 对后续重新复用port的socket造成的干扰
# 假设: pid写入到pid文件后, 然后进程退出, 然后有后续的新进程占据了这个pid, 那么脚本根据这个pid判断之前的进程是否存活就没意义了, 由此导致误判
# linux kernel对pid的分配采用了延时再分配的策略, pid被复用而导致重判, 这个需要注意

*). 并发+wait使用

for slave in `cat "$HOSTLIST"|sed "s/#.*$//;/^$/d"`; do
  ssh $SPARK_SSH_OPTS $slave $"${@// /\\ }"     2>&1 | sed "s/^/$slave: /" &
  if [ "$SPARK_SLAVE_SLEEP" != "" ]; then
    sleep $SPARK_SLAVE_SLEEP
  fi
done

wait 

代码评注:
# shell脚本没有多线程的概念, 且默认执行子shell是阻塞的, 因此只能通过后台运行多个子进程来模拟
# ssh $slave "<command> " & 是把ssh命令放在后台运行
# wait, 是指等待所有的后台进程结束, 才继续进行下去
# 这是很好的并发CountDownLatch的编程实践

*). sed命令使用

sed "s/#.*$//;/^$/d"
sed "s/^/$slave: /"

代码评注:
# 使用流编辑器sed, 对文本内容进行替换和删除, 赞sed

shell 脚本实战笔记(10)--spark集群脚本片段念念碎

时间: 2024-12-28 00:29:33

shell 脚本实战笔记(10)--spark集群脚本片段念念碎的相关文章

Spark 个人实战系列(1)--Spark 集群安装

前言: CDH4不带yarn和spark, 因此需要自己搭建spark集群. 这边简单描述spark集群的安装过程, 并讲述spark的standalone模式, 以及对相关的脚本进行简单的分析. spark官网: http://spark.apache.org/downloads.html *)安装和部署 环境: 172.16.1.109~172.16.1.111三台机器(对应域名为tw-node109~tw-node111), centos6.4, 已部署cdh4 目标是: 搭建一个spar

Spark学习笔记—01 Spark集群的安装

一.概述 关于Spark是什么.为什么学习Spark等等,在这就不说了,直接看这个:http://spark.apache.org, 我就直接说一下Spark的一些优势: 1.快 与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上.Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流. 2.易用 Spark支持Java.Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用.而且Sp

Spark调研笔记第7篇 - 应用实战: 如何利用Spark集群计算物品相似度

本文是Spark调研笔记的最后一篇,以代码实例说明如何借助Spark平台高效地实现推荐系统CF算法中的物品相似度计算. 在推荐系统中,最经典的推荐算法无疑是协同过滤(Collaborative Filtering, CF),而item-cf又是CF算法中一个实现简单且效果不错的算法. 在item-cf算法中,最关键的步骤是计算物品之间的相似度.本文以代码实例来说明如何利用Spark平台快速计算物品间的余弦相似度. Cosine Similarity是相似度的一种常用度量,根据<推荐系统实践>一

Spark集群测试

1. Spark Shell测试 Spark Shell是一个特别适合快速开发Spark原型程序的工具,可以帮助我们熟悉Scala语言.即使你对Scala不熟悉,仍然可以使用这一工具.Spark Shell使得用户可以和Spark集群进行交互,提交查询,这便于调试,也便于初学者使用Spark. 测试案例1: [[email protected] spark]$ MASTER=spark://Master:7077 bin/spark-shell //连接到集群 Spark assembly ha

shell 脚本实战笔记(3)--集群机器的时间同步设置

背景: 有些分布式服务(比如HBase服务), 依赖于系统时间戳, 如果集群各个节点, 系统时间不一致, 导致服务出现诡异的情况. 解决方案: 那如何同步集群各个节点之间的时间? 采用NTP(Network Time Protocol)方式来实现, 选择一台机器, 作为集群的时间同步服务器, 然后分别配置服务端和集群其他机器 1.NTP服务端 *) 安装ntp服务 yum install ntp *) 配置/etc/ntp.conf 这边采用本地机器作为时间的原点 注释server列表 #ser

shell 脚本实战笔记(6)--集群环境配置检测

1). 背景: 集群部署的时候, 需要一致的配置和环境设置. 对于虚拟机集群, 可以借助镜像拷贝, 复制和还原集群机器. 对与物理机集群而言, 则不一样, 如果机器一多, 多人去操作和配置, 对于成熟精干的团队还好, 对于不熟悉环境的小团队, 由于水平的参差不齐, 往往会导致不一致的环境. 因此无论如何, 写脚本进行自动化的配置和环境校验总是最佳实践. 2). 假设应用场景:*) 系统环境: 安装CDH5, 集群规模为16台机器, 每台机器16CPU, 内存16G, 2块SATA盘共500G,

蜗龙徒行-Spark学习笔记【三】Spark集群中worker节点扩展实战经验

一.集群原先配置: 从机名sparkMaster,Ubuntu12.04-32 ,用户名Root , 内存4g    (只用于任务调度和分配,不做计算节点) 从机名sparkSlave1,Ubuntu12.04-32 ,用户名Root , 内存4g    (计算节点) 从机名sparkSlave2,Ubuntu12.04-32 ,用户名Root , 内存1.7g (计算节点) 二.扩展原因:计算数据量增大,原先的两个工作节点已不不能满足实时性的需求,由于实验室计算资源有限,故将原先的调度节点也增

shell 脚本实战笔记(9)--linux自动批量添加用户

前言: 添加linux用户帐号,这个相对简单, 在面对集群, 许多机器的时候, 我们该如何去做和实现? 这篇短文, 简单讲解一些思路, 尽可能地涉及周边的一些知识点. 不光是运维人员会面临这个问题, 对一个基于linux平台的集群服务或软件(比如hadoop集群), 有时也会涉及到这块. 应用场景: 是以centos 6.4作为演示的系统, 其他的系统有类同, 也有差异, 且以实战演练, 一步步的讲述下流程. *) 实战演练 查阅useradd的使用和参数选项useradd --help -d,

Spark学习笔记5:Spark集群架构

Spark的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展计算能力.Spark可以在各种各样的集群管理器(Hadoop YARN , Apache Mesos , 还有Spark自带的独立集群管理器)上运行,所以Spark应用既能够适应专用集群,又能用于共享的云计算环境. Spark运行时架构 Spark在分布式环境中的架构如下图: 在分布式环境下,Spark集群采用的是主/从结构.在Spark集群,驱动器节点负责中央协调,调度各个分布式工作节点.执行器节点是工作节点,作为独立的Ja