#!/bin/bash
YARN_ENV=$HADOOP_HOME/etc/hadoop/yarn-env.sh
CONTAINER_PATTERN="container_*"
MEM_GREP_PATTERN="INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Memory usage of ProcessTree"
# log example
# yarn-wdong-nodemanager-klose1.log:2015-01-05 04:00:21,921 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Memory usage of ProcessTree 27966 for container-id container_1420401494322_0001_01_000001: 78.1 MB of 2 GB physical memory used; 1.6 GB of 4.2 GB virtual memory used
# we want to use awk convert this to
# klose1 2015-01-05 04:00:21 TS 27966 container_1420401494322_0001_01_000001 78.1 MB 2 GB 1.6 GB 4.2 GB
# where TS is equivalent timestamp
# $1: yarn-wdong-nodemanager-klose1.log:2015-01-05
# $2: 04:00:21,921
# $9: 27966
# $12: container_1420401494322_0001_01_000001
# $13: 78.1
# $14: MB
# $16: 2
# $17: GB
# $21: 1.6
# $22: GB
# $24: 4.2
# $25: GB
# output format is
# washtenaw 2015-01-06 14:56:40 1420574200 16669 container_1420574192658_0001_01_000001 0.274023 9 8.9 18.9
# extract node from $1:
AWK_PROG='
function calc_mem (n, unit) {
if (unit == "B") {
return n / 1024.0 / 1024.0 / 1024.0;
}
if (unit == "KB") {
return n / 1024.0 / 1024.0;
}
if (unit == "MB") {
return n / 1024.0;
}
if (unit == "GB") {
return n;
}
print "Found memory unit of neither MB or GB, do not know what to do." > "/dev/stderr";
print $0 > "/dev/stderr";
}
{
split($1, arr, "[:]");
node = arr[1];
date = arr[2];
split(node, arr, "[-.]");
node=arr[4];
split($2, arr, ",");
time = arr[1];
date_time=date " " time;
gsub(/[:-]/, " ", date_time);
ts = mktime(date_time);
pid=$9;
split($12, arr, ":");
container = arr[1];
p_use = calc_mem($13, $14);
p_cap = calc_mem($16, $17);
v_use = calc_mem($21, $22);
v_cap = calc_mem($24, $25);
print node, date, time, ts, pid, container, p_use, p_cap, v_use, v_cap;
} '
if [ -z "$1" ]
then
echo "usage: $0 app-id app-id ..."
exit 1
fi
if [ ! -f $YARN_ENV ]
then
echo "yarn-env.sh not found under \$HADOOP_HOME/etc/hadoop/yarn-env.sh"
echo "\$HADOOP_HOME=$HADOOP_HOME"
exit 1
fi
if [ -z "$HADOOP_YARN_HOME" ]
then
HADOOP_YARN_HOME=$HADOOP_HOME
fi
. $YARN_ENV
LOG_DIR=$YARN_LOG_DIR/userlogs/$APP
if [ ! -d $LOG_DIR ]
then
echo "Log for app $APP not found under $LOG_DIR"
exit 1
fi
NC=`find $LOG_DIR/ -type d -name "$CONTAINER_PATTERN" | wc -l`
MEMLOG=`mktemp`
grep "$MEM_GREP_PATTERN" $YARN_LOG_DIR/yarn-*.log | sed 's/0B of/0 GB of/g' | awk "$AWK_PROG" > $MEMLOG
SUM=`mktemp`
while true
do
APP=$1
shift
if [ -z "$APP" ]; then break; fi
> $SUM
echo $NC containers found for app $APP
NC=1
find $LOG_DIR/ -type d -name "$CONTAINER_PATTERN" | sort | while read C
do
CID=`basename $C`
printf "%s: " $CID
NC=$((NC+1))
grep $CID $MEMLOG | cut -f 7,8 -d ' ' | awk 'BEGIN{m=0;c=0;}{if ($1 > m) {m = $1;} c=$2;}END{print $1, $2}' | while read U C
do
echo $U of $C GB
echo $U $C >> $SUM
done
done
awk 'BEGIN{u=0;c=0;}{u+=$1;c+=$2;}END{print u, c;}' $SUM | while read U C
do
echo Total: $U of $C GB.
done
echo
done
rm $MEMLOG
Comments