In [1]:
# These are all the modules we'll be using later. Make sure you can import them
from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np
import os
import sys
import tarfile
import json
from six.moves.urllib.request import urlretrieve

In [2]:
url = 'http://orange.com/wgmn4901/data/'

def maybe_download(filename, expected_bytes, force=False):
  """Download a file if not present, and make sure it's the right size."""
  if force or not os.path.exists(filename):
    filename, _ = urlretrieve(url + filename, filename) # may not work as expected
  statinfo = os.stat(filename)
  if statinfo.st_size == expected_bytes:
    print('Found and verified', filename)
  else:
    raise Exception(
      'Failed to verify ' + filename + '. Can you get to it with a browser?')
  return filename

clustersnapshot = maybe_download('clustersnapshot24022016.tar.gz', 249468)


Found and verified clustersnapshot24022016.tar.gz

In [3]:
def maybe_extract(filename,force=False):
  root = os.path.splitext(os.path.splitext(filename)[0])[0]  # remove .tar.gz
  if os.path.isdir(root) and not force:
    # You may override by setting force=True.
    print('%s already present - Skipping extraction of %s.' % (root, filename))
  else:
    print('Extracting data for %s. This may take a while. Please wait.' % root)
    tar = tarfile.open(filename)
    sys.stdout.flush()
    tar.extractall()
    tar.close()
  data_folders = [
    os.path.join(root, d) for d in sorted(os.listdir(root))
    if os.path.isdir(os.path.join(root, d))]
  print('Found the following application profile in %s:' % filename)
  for folder in data_folders:
    print ('  %s' % folder)
  return data_folders
  
clustersnapshot_folders = maybe_extract(clustersnapshot)


clustersnapshot24022016 already present - Skipping extraction of clustersnapshot24022016.tar.gz.
Found the following application profile in clustersnapshot24022016.tar.gz:
  clustersnapshot24022016/application_1456319042576_0003_json
  clustersnapshot24022016/application_1456319042576_0004_json
  clustersnapshot24022016/application_1456319042576_0005_json
  clustersnapshot24022016/application_1456319042576_0006_json
  clustersnapshot24022016/application_1456319042576_0007_json

In [4]:
import pandas as pd #this is how I usually import pandas

def load_application(folder):
  """Load the container data for each application."""
  container_index = 0
  container_name_list = []
  container_starttime_list = []
  container_endtime_list = []
  container_task_list = []
  container_node_list = []
  container_node_mem_total_list = []
  container_node_CPU_total_list = []
  container_node_mem_rsrv_list = []
  container_node_CPU_rsrv_list = []
  container_mem_assigned_list = []
  container_CPU_assigned_list = []
  app_name_list = []
  application_starttime = 100000000000000 # really big number
  application_endtime = 0
  for container in os.listdir(folder):
    container_file = os.path.join(folder, container)
    try:
      with open(container_file) as data_file:    
        data = json.load(data_file)
        container_name = data["container_id"]
        container_starttime = data["container_starttime"]
        if container_starttime < application_starttime:
          application_starttime = container_starttime        
        container_endtime = data["container_endtime"]
        if container_endtime > application_endtime:
          application_endtime = container_endtime
        """gather info for container"""
        container_task = data["container_tasks"][0]["task_type"] #First task only
        app_name = data["application_info"]["appId"]
        if not data["nodeInfo"]:
            container_node = "null"
            container_node_mem_total = 0
            container_node_CPU_total = 0
            container_node_mem_rsrv = 0
            container_node_CPU_rsrv = 0
            container_mem_assigned = 0
            container_CPU_assigned = 0
        else:
            container_node = data["nodeInfo"]["id"]
            container_node_mem_total = data["nodeInfo"]["totalNodePhyMem"]
            container_node_CPU_total = data["nodeInfo"]["totalNodePhyCore"]
            container_node_mem_rsrv = data["nodeInfo"]["totalPmemAllocatedContainersMB"] * 1024
            container_node_CPU_rsrv = data["nodeInfo"]["totalVCoresAllocatedContainers"]
            container_mem_assigned = data["MemoryAssignedMB"] * 1024
            container_CPU_assigned = data["VCoreAssigned"]
        """make list to create dataframe"""
        container_name_list.insert(container_index,container_name)
        container_starttime_list.insert(container_index,container_starttime)
        container_endtime_list.insert(container_index,container_endtime)
        container_task_list.insert(container_index,container_task)
        container_node_list.insert(container_index,container_node)
        container_node_mem_total_list.insert(container_index,container_node_mem_total)
        container_node_CPU_total_list.insert(container_index,container_node_CPU_total)
        container_node_mem_rsrv_list.insert(container_index,container_node_mem_rsrv)
        container_node_CPU_rsrv_list.insert(container_index,container_node_CPU_rsrv)
        container_mem_assigned_list.insert(container_index,container_mem_assigned)
        container_CPU_assigned_list.insert(container_index,container_CPU_assigned)
        app_name_list.insert(container_index,app_name)
      if not container_name:
        raise Exception('Unexpected container name')
      if container_starttime == 0:
        raise Exception('Unexpected container start time')
      if container_endtime == 0:
        raise Exception('Unexpected container end time')
      container_index += 1
    except IOError as e:
      print('Could not read:', container_file, ':', e)
  DataSet = list(zip(container_starttime_list,container_endtime_list,
                     container_task_list,container_node_list,container_node_mem_total_list,
                     container_node_CPU_total_list,container_node_mem_rsrv_list,container_node_CPU_rsrv_list,
                     container_mem_assigned_list, container_CPU_assigned_list, app_name_list))
  columns=[ 'start', 'end', 'task', 'node','n_mem','n_CPU',
                                    'mem_rsrv','CPU_rsrv','mem','CPU','app']
  DataFrame = pd.DataFrame(data = DataSet, index=container_name_list,
                           columns=columns)
  return DataFrame, application_starttime, application_endtime

def load_snapshot(snapshot_folders):
  snapshot_starttime = 100000000000000 # really big number
  snapshot_endtime = 0
  snapshot_dataframe = pd.DataFrame()
  for application_folder in snapshot_folders: 
    dataframe, application_starttime, application_endtime = load_application(application_folder)
    if application_starttime < snapshot_starttime:
      snapshot_starttime = application_starttime
    if application_endtime > snapshot_endtime:
      snapshot_endtime = application_endtime
    if snapshot_dataframe.empty:
      snapshot_dataframe = dataframe
    else:
      snapshot_dataframe = snapshot_dataframe.append(dataframe)
  return snapshot_dataframe, snapshot_starttime, snapshot_endtime

snapshot_dataframe,snapshot_starttime,snapshot_endtime = load_snapshot(clustersnapshot_folders)
print('Snapshot start time: %s' % snapshot_starttime)
print('Snapshot end time: %s' % snapshot_endtime)
snapshot_duration = snapshot_endtime-snapshot_starttime
print('Snapshot duration: %s ms (or ~%s s or ~%s m)' % (snapshot_duration,snapshot_duration/1000,snapshot_duration/60000))


Snapshot start time: 1456334801869
Snapshot end time: 1456335271858
Snapshot duration: 469989 ms (or ~469 s or ~7 m)

In [5]:
# General syntax to import a library but no functions: 
##import (library) as (give the library a nickname/alias)
import matplotlib.pyplot as plt
import matplotlib #only needed to determine Matplotlib version number
from random import randint
import pylab

# Enable inline plotting
%matplotlib inline
pylab.rcParams['figure.figsize'] = (15.0, 8.0)

random_application = clustersnapshot_folders[randint(0,len(clustersnapshot_folders)-1)]
print("App %s is selected for this example" % random_application.split('/')[1])

DataFrame, application_starttime, application_endtime = load_application(random_application)
DataFrameSorted = DataFrame.sort(columns="start")

value = 1
for index in DataFrameSorted.index:
  starttime_rescaled = DataFrameSorted.loc[index,"start"]/1000 - snapshot_starttime/1000
  endtime_rescaled = DataFrameSorted.loc[index,"end"]/1000 - snapshot_starttime/1000
  task_duration = endtime_rescaled - starttime_rescaled
  x = np.linspace(starttime_rescaled,endtime_rescaled,task_duration)
  container_data = np.linspace(value,value,task_duration)
  if DataFrameSorted.loc[index,"task"] == "MAP":
    plt.plot(x,container_data,"ro")
  elif DataFrameSorted.loc[index,"task"] == "REDUCE":
    plt.plot(x,container_data,"bo")
  elif DataFrameSorted.loc[index,"task"] == "AM":
    plt.plot(x,container_data,"yo")
  else:
    print("not applicable for %s" % index)
  value = value + 1


App application_1456319042576_0004_json is selected for this example

In [6]:
SnapshotDataFrame = snapshot_dataframe.sort(columns="node")
print('List of containers with no information on node ID:')
SnapshotDataFrame.groupby('node').count().task
SnapshotDataFrame.groupby('node').count().sum()
float(55)/323


List of containers with no information on node ID:
Out[6]:
0.17027863777089783

In [7]:
##### pylab.rcParams['figure.figsize'] = (15.0, 8.0)

snapshot_dataframe,snapshot_starttime,snapshot_endtime = load_snapshot(clustersnapshot_folders)
snapshot_duration = snapshot_endtime - snapshot_starttime
SnapshotDFSorted = snapshot_dataframe.sort(columns="start")
#print(DataFrameSorted)

# Initialize slot for drawing
slot = {}
for node in snapshot_dataframe.groupby('node').count().task.index:
  slot[node] = 1

slot_max = 6

for index in SnapshotDFSorted.index:
  if slot[SnapshotDFSorted.loc[index,"node"]] >= slot_max:
    slot[SnapshotDFSorted.loc[index,"node"]] = 1 #reset slot
  starttime_rescaled = SnapshotDFSorted.loc[index,"start"]/1000 - snapshot_starttime/1000
  endtime_rescaled = SnapshotDFSorted.loc[index,"end"]/1000 - snapshot_starttime/1000
  task_duration = endtime_rescaled - starttime_rescaled
  if SnapshotDFSorted.loc[index,"node"] == "null":
    current_slot = slot[SnapshotDFSorted.loc[index,"node"]]
  else:
    current_slot = (int(SnapshotDFSorted.loc[index,"node"][3:5]) * slot_max) + slot[SnapshotDFSorted.loc[index,"node"]]
    #print(str(int(SnapshotDFSorted.loc[index,"node"][3:5])))
  x = np.linspace(starttime_rescaled,endtime_rescaled-1,task_duration)
  container_data = np.linspace(current_slot,current_slot,task_duration)
  if SnapshotDFSorted.loc[index,"task"] == "MAP":
    plt.plot(x,container_data,"ro")
  elif SnapshotDFSorted.loc[index,"task"] == "REDUCE":
    plt.plot(x,container_data,"bo")
  elif SnapshotDFSorted.loc[index,"task"] == "AM":
    plt.plot(x,container_data,"yo")
  else:
    print("not applicable for %s" % index)
  slot[SnapshotDFSorted.loc[index,"node"]] = slot[SnapshotDFSorted.loc[index,"node"]] + 1

# draw line separate node:
x = np.linspace(0,snapshot_duration/1000-1,snapshot_duration/1000)
for line in np.linspace(1,len(slot)+3,len(slot)+3): # 4 locations for null
  y_value = line * slot_max
  y = np.linspace(y_value,y_value,snapshot_duration/1000)
  plt.plot(x,y,'-b')

plt.text(0.2,slot_max*1-3,"null")
plt.text(0.2,slot_max*2-3,"svr01")
plt.text(0.2,slot_max*3-3,"svr02")
plt.text(0.2,slot_max*4-3,"svr03")
plt.text(0.2,slot_max*5-3,"svr04")
plt.text(0.2,slot_max*6-3,"svr05")
plt.text(0.2,slot_max*7-3,"svr06")
plt.text(0.2,slot_max*8-3,"svr07")
plt.text(0.2,slot_max*9-3,"svr08")
plt.text(0.2,slot_max*10-3,"svr09")
plt.text(0.2,slot_max*11-3,"svr10")
plt.text(0.2,slot_max*12-3,"svr11")
plt.text(0.2,slot_max*13-3,"svr12")
plt.text(0.2,slot_max*14-3,"svr13")
plt.text(0.2,slot_max*15-3,"svr14")
plt.text(0.2,slot_max*16-3,"svr15")
plt.axis('off')


Out[7]:
(0.0, 500.0, 0.0, 100.0)

In [8]:
def load_application_cpu_profile(folder):
  """Load the container data for each application."""
  record_index_list = []
  container_name_list = []
  capture_time_list = []
  container_load_list = []
  cpu_us_list = []
  cpu_sys_list = []
  cpu_id_list = []
  fail_count = 0
  record_index = 0
  for container in os.listdir(folder):
    container_file = os.path.join(folder, container)
    try:
      with open(container_file) as data_file:    
        data = json.load(data_file)
        container_name = data["container_id"]
        if not data["cpu_usage"]:
          print('No infomation for container %s, ignore it' % container_name)
          fail_count = fail_count + 1
        else:
          for record in data["cpu_usage"]:
            container_capture_time = record["capture_time"]
            container_load = record["container_load"] / 100
            cpu_us = record["cpu_us"]
            cpu_sys = record["cpu_sy"]
            cpu_id = record["cpu_id"]
            '''make list to create dataframe'''
            record_index_list.insert(record_index,record_index)
            container_name_list.insert(record_index,container_name)
            capture_time_list.insert(record_index,container_capture_time)
            container_load_list.insert(record_index,container_load)
            cpu_us_list.insert(record_index,cpu_us)
            cpu_sys_list.insert(record_index,cpu_sys)
            cpu_id_list.insert(record_index,cpu_id)
            record_index += 1
      if not container_name:
        raise Exception('Unexpected container name')
    except IOError as e:
      print('Could not read:', container_file, ':', e)
  DataSet = list(zip(capture_time_list,container_name_list,container_load_list,cpu_us_list,cpu_sys_list,cpu_id_list))
  columns=[ 'timestamp','name','cpu_load', 'cpu_us', 'cpu_sys', 'cpu_id']
  DataFrame = pd.DataFrame(data = DataSet, index=record_index_list,columns=columns)
  return DataFrame, fail_count

def load_snapshot_cpu_profile(snapshot_folder):
  snapshot_dataframe = pd.DataFrame()
  snapshot_failcount = 0
  for application_folder in snapshot_folder:
    dataframe, fail_count = load_application_cpu_profile(application_folder)
    if snapshot_dataframe.empty:
      snapshot_dataframe = dataframe
    else:
      snapshot_dataframe = snapshot_dataframe.append(dataframe)
    snapshot_failcount = snapshot_failcount + fail_count
  return snapshot_dataframe

snapshot_cpu_profile = load_snapshot_cpu_profile(clustersnapshot_folders)
snapshot_cpu_profile


No infomation for container container_e100_1456319042576_0003_01_000026, ignore it
No infomation for container container_e100_1456319042576_0003_01_000025, ignore it
No infomation for container container_e100_1456319042576_0003_01_000013, ignore it
No infomation for container container_e100_1456319042576_0003_01_000063, ignore it
No infomation for container container_e100_1456319042576_0003_01_000004, ignore it
No infomation for container container_e100_1456319042576_0003_01_000030, ignore it
No infomation for container container_e100_1456319042576_0003_01_000037, ignore it
No infomation for container container_e100_1456319042576_0003_01_000017, ignore it
No infomation for container container_e100_1456319042576_0003_01_000002, ignore it
No infomation for container container_e100_1456319042576_0003_01_000024, ignore it
No infomation for container container_e100_1456319042576_0003_01_000012, ignore it
No infomation for container container_e100_1456319042576_0003_01_000032, ignore it
No infomation for container container_e100_1456319042576_0003_01_000001, ignore it
No infomation for container container_e100_1456319042576_0003_01_000011, ignore it
No infomation for container container_e100_1456319042576_0003_01_000031, ignore it
No infomation for container container_e100_1456319042576_0003_01_000014, ignore it
No infomation for container container_e100_1456319042576_0003_01_000003, ignore it
No infomation for container container_e100_1456319042576_0004_01_000001, ignore it
No infomation for container container_e100_1456319042576_0005_01_000057, ignore it
No infomation for container container_e100_1456319042576_0005_01_000053, ignore it
No infomation for container container_e100_1456319042576_0005_01_000048, ignore it
No infomation for container container_e100_1456319042576_0005_01_000020, ignore it
No infomation for container container_e100_1456319042576_0005_01_000055, ignore it
No infomation for container container_e100_1456319042576_0005_01_000060, ignore it
No infomation for container container_e100_1456319042576_0005_01_000051, ignore it
No infomation for container container_e100_1456319042576_0005_01_000035, ignore it
No infomation for container container_e100_1456319042576_0005_01_000016, ignore it
No infomation for container container_e100_1456319042576_0005_01_000061, ignore it
No infomation for container container_e100_1456319042576_0005_01_000072, ignore it
No infomation for container container_e100_1456319042576_0005_01_000021, ignore it
No infomation for container container_e100_1456319042576_0005_01_000037, ignore it
No infomation for container container_e100_1456319042576_0005_01_000011, ignore it
No infomation for container container_e100_1456319042576_0005_01_000047, ignore it
No infomation for container container_e100_1456319042576_0006_01_000037, ignore it
No infomation for container container_e100_1456319042576_0006_01_000036, ignore it
No infomation for container container_e100_1456319042576_0006_01_000067, ignore it
No infomation for container container_e100_1456319042576_0006_01_000004, ignore it
No infomation for container container_e100_1456319042576_0006_01_000023, ignore it
No infomation for container container_e100_1456319042576_0006_01_000008, ignore it
No infomation for container container_e100_1456319042576_0006_01_000061, ignore it
No infomation for container container_e100_1456319042576_0006_01_000075, ignore it
No infomation for container container_e100_1456319042576_0006_01_000046, ignore it
No infomation for container container_e100_1456319042576_0006_01_000048, ignore it
No infomation for container container_e100_1456319042576_0006_01_000053, ignore it
No infomation for container container_e100_1456319042576_0007_01_000070, ignore it
No infomation for container container_e100_1456319042576_0007_01_000064, ignore it
No infomation for container container_e100_1456319042576_0007_01_000061, ignore it
No infomation for container container_e100_1456319042576_0007_01_000054, ignore it
No infomation for container container_e100_1456319042576_0007_01_000060, ignore it
No infomation for container container_e100_1456319042576_0007_01_000069, ignore it
No infomation for container container_e100_1456319042576_0007_01_000067, ignore it
No infomation for container container_e100_1456319042576_0007_01_000079, ignore it
No infomation for container container_e100_1456319042576_0007_01_000071, ignore it
No infomation for container container_e100_1456319042576_0007_01_000025, ignore it
No infomation for container container_e100_1456319042576_0007_01_000078, ignore it
Out[8]:
timestamp name cpu_load cpu_us cpu_sys cpu_id
0 1456334839 container_e100_1456319042576_0003_01_000033 1.917 2.3 0.7 96.8
1 1456334840 container_e100_1456319042576_0003_01_000033 2.156 2.3 0.7 96.8
2 1456334842 container_e100_1456319042576_0003_01_000033 0.958 2.3 0.7 96.8
3 1456334843 container_e100_1456319042576_0003_01_000033 1.697 2.3 0.7 96.8
4 1456334855 container_e100_1456319042576_0003_01_000043 1.019 1.9 0.5 97.5
5 1456334857 container_e100_1456319042576_0003_01_000043 1.138 1.9 0.5 97.5
6 1456334858 container_e100_1456319042576_0003_01_000043 1.038 1.9 0.5 97.5
7 1456334860 container_e100_1456319042576_0003_01_000043 0.879 1.9 0.5 97.5
8 1456334861 container_e100_1456319042576_0003_01_000043 1.058 1.9 0.5 97.5
9 1456334863 container_e100_1456319042576_0003_01_000043 1.218 1.9 0.5 97.5
10 1456334864 container_e100_1456319042576_0003_01_000043 0.984 1.9 0.5 97.5
11 1456334866 container_e100_1456319042576_0003_01_000043 0.739 1.9 0.5 97.5
12 1456334855 container_e100_1456319042576_0003_01_000041 0.898 1.9 0.5 97.5
13 1456334857 container_e100_1456319042576_0003_01_000041 1.458 1.9 0.5 97.5
14 1456334858 container_e100_1456319042576_0003_01_000041 1.178 1.9 0.5 97.5
15 1456334860 container_e100_1456319042576_0003_01_000041 1.058 1.9 0.5 97.5
16 1456334861 container_e100_1456319042576_0003_01_000041 1.138 1.9 0.5 97.5
17 1456334863 container_e100_1456319042576_0003_01_000041 0.919 1.9 0.5 97.5
18 1456334864 container_e100_1456319042576_0003_01_000041 0.975 1.9 0.5 97.5
19 1456334866 container_e100_1456319042576_0003_01_000041 0.859 1.9 0.5 97.5
20 1456334878 container_e100_1456319042576_0003_01_000053 1.517 1.2 0.5 98.3
21 1456334880 container_e100_1456319042576_0003_01_000053 2.215 1.2 0.5 98.3
22 1456334882 container_e100_1456319042576_0003_01_000053 2.694 1.2 0.5 98.3
23 1456334883 container_e100_1456319042576_0003_01_000053 1.158 1.2 0.5 98.3
24 1456334885 container_e100_1456319042576_0003_01_000053 1.937 1.2 0.5 98.3
25 1456334886 container_e100_1456319042576_0003_01_000053 1.915 1.2 0.5 98.3
26 1456334888 container_e100_1456319042576_0003_01_000053 1.436 1.2 0.5 98.3
27 1456334889 container_e100_1456319042576_0003_01_000077 1.039 2.3 0.7 96.9
28 1456334890 container_e100_1456319042576_0003_01_000077 0.919 2.3 0.7 96.9
29 1456334892 container_e100_1456319042576_0003_01_000077 1.098 2.3 0.7 96.9
30 1456334893 container_e100_1456319042576_0003_01_000077 1.318 2.3 0.7 96.9
31 1456334889 container_e100_1456319042576_0003_01_000075 1.458 2.1 0.5 97.3
32 1456334890 container_e100_1456319042576_0003_01_000075 1.578 2.1 0.5 97.3
33 1456334892 container_e100_1456319042576_0003_01_000075 0.918 2.1 0.5 97.3
34 1456334893 container_e100_1456319042576_0003_01_000075 1.577 2.1 0.5 97.3
35 1456334884 container_e100_1456319042576_0003_01_000068 1.117 3.9 0.9 94.8
36 1456334886 container_e100_1456319042576_0003_01_000068 1.157 3.9 0.9 94.8
37 1456334887 container_e100_1456319042576_0003_01_000068 1.656 3.9 0.9 94.8
38 1456334889 container_e100_1456319042576_0003_01_000068 1.417 3.9 0.9 94.8
39 1456334890 container_e100_1456319042576_0003_01_000068 1.377 3.9 0.9 94.8
40 1456334892 container_e100_1456319042576_0003_01_000068 1.257 3.9 0.9 94.8
41 1456334894 container_e100_1456319042576_0003_01_000068 0.679 3.9 0.9 94.8
42 1456334869 container_e100_1456319042576_0003_01_000046 0.999 1.9 0.5 97.5
43 1456334870 container_e100_1456319042576_0003_01_000046 1.118 1.9 0.5 97.5
44 1456334872 container_e100_1456319042576_0003_01_000046 0.999 1.9 0.5 97.5
45 1456334873 container_e100_1456319042576_0003_01_000046 0.978 1.9 0.5 97.5
46 1456334875 container_e100_1456319042576_0003_01_000046 1.259 1.9 0.5 97.5
47 1456334876 container_e100_1456319042576_0003_01_000046 0.938 1.9 0.5 97.5
48 1456334890 container_e100_1456319042576_0003_01_000078 1.078 2.1 0.5 97.3
49 1456334891 container_e100_1456319042576_0003_01_000078 1.657 2.1 0.5 97.3
50 1456334893 container_e100_1456319042576_0003_01_000078 0.998 2.1 0.5 97.3
51 1456334895 container_e100_1456319042576_0003_01_000078 1.716 2.1 0.5 97.3
52 1456334880 container_e100_1456319042576_0003_01_000058 1.538 2.3 0.7 96.8
53 1456334882 container_e100_1456319042576_0003_01_000058 1.777 2.3 0.7 96.8
54 1456334883 container_e100_1456319042576_0003_01_000058 0.899 2.3 0.7 96.8
55 1456334885 container_e100_1456319042576_0003_01_000058 0.799 2.3 0.7 96.8
56 1456334868 container_e100_1456319042576_0003_01_000045 1.777 1.9 0.5 97.5
57 1456334869 container_e100_1456319042576_0003_01_000045 1.617 1.9 0.5 97.5
58 1456334871 container_e100_1456319042576_0003_01_000045 0.659 1.9 0.5 97.5
59 1456334872 container_e100_1456319042576_0003_01_000045 1.238 1.9 0.5 97.5
... ... ... ... ... ...

3200 rows × 6 columns


In [9]:
def get_cpu_actual_use(container_name, snapshot_dataframe, snapshot_cpu_profile):
  container_starttime = snapshot_dataframe.loc[container_name,'start']
  container_endtime = snapshot_dataframe.loc[container_name,'end']
  rescaled_container_starttime = container_starttime / 1000
  rescaled_container_endtime = container_endtime / 1000
  duration = rescaled_container_endtime - rescaled_container_starttime
  container_index = np.linspace(rescaled_container_starttime, rescaled_container_endtime -1,duration)
  data = np.linspace(0,0,duration)
  container_data2 = pd.Series(data,index=pd.to_datetime(container_index,unit='s'))

  cpu_container_filtered = snapshot_cpu_profile[(snapshot_cpu_profile.name == container_name)]
  index = cpu_container_filtered.timestamp.tolist()
  cpu_load = cpu_container_filtered.cpu_load.tolist()
  container_data1 = pd.Series(cpu_load,index=pd.to_datetime(index,unit='s'))
  container_data3 = container_data1 + container_data2
  container_data4 = container_data3.interpolate(method='time')
  for index in container_data4.index:
    if pd.isnull(container_data4[index]):
      container_data4[index] = container_data4.mean()
  if len(container_data4) > len(container_data2):
    a = set(container_data4.index.tolist()) - set(container_data2.index.tolist())
    print(a)
    #print(container_data4)
    #print(container_data3)
    #print(container_data2.index)
    #raise Exception('Return length mismatch')
    
  return container_data4

# Filter to remove containers with no informaction of the node, or to select specific nodes
SnapshotDFFiltered = SnapshotDFSorted[(SnapshotDFSorted.node != 'null')]
for i in SnapshotDFFiltered.index:
  a = get_cpu_actual_use(i,snapshot_dataframe, snapshot_cpu_profile)
  plt.plot(a)


set([Timestamp('2016-02-24 17:27:56', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:11', tz=None)])
set([Timestamp('2016-02-24 17:28:02', tz=None)])
set([Timestamp('2016-02-24 17:27:46', tz=None)])
set([Timestamp('2016-02-24 17:27:59', tz=None)])
set([Timestamp('2016-02-24 17:27:53', tz=None)])
set([Timestamp('2016-02-24 17:28:08', tz=None)])
set([Timestamp('2016-02-24 17:28:16', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:20', tz=None)])
set([Timestamp('2016-02-24 17:28:17', tz=None)])
set([Timestamp('2016-02-24 17:30:49', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:23', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:17', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:35', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:44', tz=None)])
set([Timestamp('2016-02-24 17:31:42', tz=None)])
set([Timestamp('2016-02-24 17:31:56', tz=None)])
set([Timestamp('2016-02-24 17:31:51', tz=None)])
set([Timestamp('2016-02-24 17:31:53', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:32:44', tz=None)])
set([Timestamp('2016-02-24 17:32:58', tz=None)])
set([Timestamp('2016-02-24 17:32:47', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:00', tz=None)])
set([Timestamp('2016-02-24 17:32:46', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:33:01', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:06', tz=None)])
set([Timestamp('2016-02-24 17:33:29', tz=None)])
set([Timestamp('2016-02-24 17:34:24', tz=None)])
set([Timestamp('2016-02-24 17:33:40', tz=None)])
set([Timestamp('2016-02-24 17:33:45', tz=None)])
set([Timestamp('2016-02-24 17:34:01', tz=None)])
set([Timestamp('2016-02-24 17:33:41', tz=None)])
set([Timestamp('2016-02-24 17:33:56', tz=None)])
set([Timestamp('2016-02-24 17:33:53', tz=None)])
set([Timestamp('2016-02-24 17:33:55', tz=None)])

In [10]:
def load_application_mem_profile(folder):
  """Load the container data for each application."""
  record_index_list = []
  container_name_list = []
  capture_time_list = []
  container_mem_virt_list = []
  container_mem_res_list = []
  container_mem_shr_list = []
  used_pmem_list = [] #system info
  swap_cached_list = [] # system info
  fail_count = 0
  record_index = 0
  for container in os.listdir(folder):
    container_file = os.path.join(folder, container)
    try:
      with open(container_file) as data_file:    
        data = json.load(data_file)
        container_name = data["container_id"]
        if not data["memory_usage"]:
          print('No infomation for container %s, ignore it' % container_name)
          fail_count = fail_count + 1
        else:
          for record in data["memory_usage"]:
            container_capture_time = record["capture_time"]
            container_mem_virt = record["virt"]
            container_mem_res = record["res"]
            container_mem_shr = record["shr"]
            used_pmem = record["used_pmem"]
            swap_cached = record["swap_cached"]
            '''make list to create dataframe'''
            record_index_list.insert(record_index,record_index)
            container_name_list.insert(record_index,container_name)
            capture_time_list.insert(record_index,container_capture_time)
            container_mem_virt_list.insert(record_index,container_mem_virt)
            container_mem_res_list.insert(record_index,container_mem_res)
            container_mem_shr_list.insert(record_index,container_mem_shr)
            used_pmem_list.insert(record_index,used_pmem)
            swap_cached_list.insert(record_index,swap_cached)
            record_index += 1
      if not container_name:
        raise Exception('Unexpected container name')
    except IOError as e:
      print('Could not read:', container_file, ':', e)
  DataSet = list(zip(capture_time_list,container_name_list,container_mem_virt_list,
                     container_mem_res_list,container_mem_shr_list,used_pmem_list,swap_cached_list))
  columns=[ 'timestamp','name','virt', 'res', 'shr', 'used_pmem','swap_cached']
  DataFrame = pd.DataFrame(data = DataSet, index=record_index_list,columns=columns)
  return DataFrame, fail_count

def load_snapshot_mem_profile(snapshot_folder):
  snapshot_dataframe = pd.DataFrame()
  snapshot_failcount = 0
  for application_folder in snapshot_folder:
    dataframe, fail_count = load_application_mem_profile(application_folder)
    if snapshot_dataframe.empty:
      snapshot_dataframe = dataframe
    else:
      snapshot_dataframe = snapshot_dataframe.append(dataframe)
    snapshot_failcount = snapshot_failcount + fail_count
  return snapshot_dataframe

snapshot_mem_profile = load_snapshot_mem_profile(clustersnapshot_folders)
snapshot_mem_profile


No infomation for container container_e100_1456319042576_0003_01_000026, ignore it
No infomation for container container_e100_1456319042576_0003_01_000025, ignore it
No infomation for container container_e100_1456319042576_0003_01_000013, ignore it
No infomation for container container_e100_1456319042576_0003_01_000063, ignore it
No infomation for container container_e100_1456319042576_0003_01_000004, ignore it
No infomation for container container_e100_1456319042576_0003_01_000030, ignore it
No infomation for container container_e100_1456319042576_0003_01_000037, ignore it
No infomation for container container_e100_1456319042576_0003_01_000017, ignore it
No infomation for container container_e100_1456319042576_0003_01_000002, ignore it
No infomation for container container_e100_1456319042576_0003_01_000024, ignore it
No infomation for container container_e100_1456319042576_0003_01_000012, ignore it
No infomation for container container_e100_1456319042576_0003_01_000032, ignore it
No infomation for container container_e100_1456319042576_0003_01_000001, ignore it
No infomation for container container_e100_1456319042576_0003_01_000011, ignore it
No infomation for container container_e100_1456319042576_0003_01_000031, ignore it
No infomation for container container_e100_1456319042576_0003_01_000014, ignore it
No infomation for container container_e100_1456319042576_0003_01_000003, ignore it
No infomation for container container_e100_1456319042576_0004_01_000001, ignore it
No infomation for container container_e100_1456319042576_0005_01_000057, ignore it
No infomation for container container_e100_1456319042576_0005_01_000053, ignore it
No infomation for container container_e100_1456319042576_0005_01_000048, ignore it
No infomation for container container_e100_1456319042576_0005_01_000020, ignore it
No infomation for container container_e100_1456319042576_0005_01_000055, ignore it
No infomation for container container_e100_1456319042576_0005_01_000060, ignore it
No infomation for container container_e100_1456319042576_0005_01_000051, ignore it
No infomation for container container_e100_1456319042576_0005_01_000035, ignore it
No infomation for container container_e100_1456319042576_0005_01_000016, ignore it
No infomation for container container_e100_1456319042576_0005_01_000061, ignore it
No infomation for container container_e100_1456319042576_0005_01_000072, ignore it
No infomation for container container_e100_1456319042576_0005_01_000021, ignore it
No infomation for container container_e100_1456319042576_0005_01_000037, ignore it
No infomation for container container_e100_1456319042576_0005_01_000011, ignore it
No infomation for container container_e100_1456319042576_0005_01_000047, ignore it
No infomation for container container_e100_1456319042576_0006_01_000037, ignore it
No infomation for container container_e100_1456319042576_0006_01_000036, ignore it
No infomation for container container_e100_1456319042576_0006_01_000067, ignore it
No infomation for container container_e100_1456319042576_0006_01_000004, ignore it
No infomation for container container_e100_1456319042576_0006_01_000023, ignore it
No infomation for container container_e100_1456319042576_0006_01_000008, ignore it
No infomation for container container_e100_1456319042576_0006_01_000061, ignore it
No infomation for container container_e100_1456319042576_0006_01_000075, ignore it
No infomation for container container_e100_1456319042576_0006_01_000046, ignore it
No infomation for container container_e100_1456319042576_0006_01_000048, ignore it
No infomation for container container_e100_1456319042576_0006_01_000053, ignore it
No infomation for container container_e100_1456319042576_0007_01_000070, ignore it
No infomation for container container_e100_1456319042576_0007_01_000064, ignore it
No infomation for container container_e100_1456319042576_0007_01_000061, ignore it
No infomation for container container_e100_1456319042576_0007_01_000054, ignore it
No infomation for container container_e100_1456319042576_0007_01_000060, ignore it
No infomation for container container_e100_1456319042576_0007_01_000069, ignore it
No infomation for container container_e100_1456319042576_0007_01_000067, ignore it
No infomation for container container_e100_1456319042576_0007_01_000079, ignore it
No infomation for container container_e100_1456319042576_0007_01_000071, ignore it
No infomation for container container_e100_1456319042576_0007_01_000025, ignore it
No infomation for container container_e100_1456319042576_0007_01_000078, ignore it
Out[10]:
timestamp name virt res shr used_pmem swap_cached
0 1456334839 container_e100_1456319042576_0003_01_000033 1869611008 85983232 18874368 5998268416 3033968640
1 1456334840 container_e100_1456319042576_0003_01_000033 1894776832 143654912 18874368 4949032960 3034091520
2 1456334842 container_e100_1456319042576_0003_01_000033 1900019712 715128832 19922944 5585633280 3034382336
3 1456334843 container_e100_1456319042576_0003_01_000033 1902116864 1073741824 19922944 6740152320 3035967488
4 1456334855 container_e100_1456319042576_0003_01_000043 1862270976 56623104 18874368 4729520128 3078443008
5 1456334857 container_e100_1456319042576_0003_01_000043 1870659584 103809024 18874368 4872179712 3078533120
6 1456334858 container_e100_1456319042576_0003_01_000043 1876951040 127926272 18874368 4949520384 3078778880
7 1456334860 container_e100_1456319042576_0003_01_000043 1883242496 352321536 19922944 5789548544 3079344128
8 1456334861 container_e100_1456319042576_0003_01_000043 1884291072 1073741824 19922944 7848611840 3081801728
9 1456334863 container_e100_1456319042576_0003_01_000043 1884291072 1181116006 19922944 8076537856 3102875648
10 1456334864 container_e100_1456319042576_0003_01_000043 1884291072 1181116006 19922944 7756357632 2761236480
11 1456334866 container_e100_1456319042576_0003_01_000043 1885339648 1181116006 19922944 7758479360 2768048128
12 1456334855 container_e100_1456319042576_0003_01_000041 1864368128 55574528 18874368 4730077184 3078443008
13 1456334857 container_e100_1456319042576_0003_01_000041 1877999616 104857600 18874368 4872179712 3078533120
14 1456334858 container_e100_1456319042576_0003_01_000041 1885339648 126877696 18874368 4947193856 3078778880
15 1456334860 container_e100_1456319042576_0003_01_000041 1893728256 254803968 19922944 5712035840 3079344128
16 1456334861 container_e100_1456319042576_0003_01_000041 1894776832 1073741824 19922944 7845466112 3081801728
17 1456334863 container_e100_1456319042576_0003_01_000041 1894776832 1181116006 19922944 8077045760 3102875648
18 1456334864 container_e100_1456319042576_0003_01_000041 1894776832 1181116006 19922944 7825231872 2824413184
19 1456334866 container_e100_1456319042576_0003_01_000041 1894776832 1181116006 19922944 7757955072 2768048128
20 1456334878 container_e100_1456319042576_0003_01_000053 1882193920 58720256 18874368 14399049728 11477917696
21 1456334880 container_e100_1456319042576_0003_01_000053 1895825408 103809024 18874368 13365850112 11477372928
22 1456334882 container_e100_1456319042576_0003_01_000053 1912602624 126877696 18874368 14386544640 11477454848
23 1456334883 container_e100_1456319042576_0003_01_000053 1917845504 161480704 19922944 14487367680 11486138368
24 1456334885 container_e100_1456319042576_0003_01_000053 1920991232 1073741824 19922944 15493500928 11489693696
25 1456334886 container_e100_1456319042576_0003_01_000053 1920991232 1073741824 19922944 14447435776 11498586112
26 1456334888 container_e100_1456319042576_0003_01_000053 1920991232 1073741824 19922944 15378423808 11500879872
27 1456334889 container_e100_1456319042576_0003_01_000077 1862270976 61865984 18874368 4890906624 3083403264
28 1456334890 container_e100_1456319042576_0003_01_000077 1876951040 111149056 18874368 5940387840 3086745600
29 1456334892 container_e100_1456319042576_0003_01_000077 1881145344 187695104 19922944 5876903936 3091214336
30 1456334893 container_e100_1456319042576_0003_01_000077 1884291072 1073741824 19922944 6842511360 3097268224
31 1456334889 container_e100_1456319042576_0003_01_000075 1865416704 61865984 18874368 4729274368 3175518208
32 1456334890 container_e100_1456319042576_0003_01_000075 1887436800 105906176 18874368 4814704640 3174490112
33 1456334892 container_e100_1456319042576_0003_01_000075 1894776832 293601280 19922944 5071007744 3174617088
34 1456334893 container_e100_1456319042576_0003_01_000075 1896873984 1073741824 19922944 6854696960 3181371392
35 1456334884 container_e100_1456319042576_0003_01_000068 1859125248 44040192 17825792 7011962880 4039213056
36 1456334886 container_e100_1456319042576_0003_01_000068 1865416704 68157440 18874368 7060058112 4038168576
37 1456334887 container_e100_1456319042576_0003_01_000068 1870659584 88080384 18874368 7086137344 4036165632
38 1456334889 container_e100_1456319042576_0003_01_000068 1885339648 116391936 18874368 7170166784 4035633152
39 1456334890 container_e100_1456319042576_0003_01_000068 1904214016 176160768 19922944 6964334592 4039032832
40 1456334892 container_e100_1456319042576_0003_01_000068 1907359744 1073741824 19922944 7989338112 4047032320
41 1456334894 container_e100_1456319042576_0003_01_000068 0 0 0 5839065088 4054298624
42 1456334869 container_e100_1456319042576_0003_01_000046 1864368128 62914560 18874368 4485099520 2770518016
43 1456334870 container_e100_1456319042576_0003_01_000046 1886388224 106954752 18874368 4652191744 2770657280
44 1456334872 container_e100_1456319042576_0003_01_000046 1889533952 161480704 18874368 5693992960 2777686016
45 1456334873 container_e100_1456319042576_0003_01_000046 1894776832 840957952 19922944 7373230080 2792484864
46 1456334875 container_e100_1456319042576_0003_01_000046 1895825408 1181116006 19922944 7801671680 2817269760
47 1456334876 container_e100_1456319042576_0003_01_000046 1895825408 1181116006 19922944 5531185152 2823012352
48 1456334890 container_e100_1456319042576_0003_01_000078 1862270976 53477376 18874368 4802375680 3174551552
49 1456334891 container_e100_1456319042576_0003_01_000078 1876951040 105906176 18874368 4916580352 3175665664
50 1456334893 container_e100_1456319042576_0003_01_000078 1883242496 872415232 19922944 6643814400 3181371392
51 1456334895 container_e100_1456319042576_0003_01_000078 1884291072 1073741824 19922944 5776244736 3180888064
52 1456334880 container_e100_1456319042576_0003_01_000058 1879048192 78643200 18874368 5947461632 3164905472
53 1456334882 container_e100_1456319042576_0003_01_000058 1902116864 156237824 18874368 4936474624 3158355968
54 1456334883 container_e100_1456319042576_0003_01_000058 1907359744 926941184 19922944 6730899456 3161055232
55 1456334885 container_e100_1456319042576_0003_01_000058 1904214016 1073741824 19922944 7049015296 3184033792
56 1456334868 container_e100_1456319042576_0003_01_000045 1871708160 82837504 18874368 4351475712 2770288640
57 1456334869 container_e100_1456319042576_0003_01_000045 1901068288 138412032 18874368 4529823744 2770518016
58 1456334871 container_e100_1456319042576_0003_01_000045 1907359744 667942912 19922944 5165027328 2775089152
59 1456334872 container_e100_1456319042576_0003_01_000045 1904214016 1181116006 19922944 6203232256 2786074624
... ... ... ... ... ... ...

3200 rows × 7 columns


In [11]:
def get_mem_actual_use(container_name, snapshot_dataframe, snapshot_mem_profile):
  container_starttime = snapshot_dataframe.loc[container_name,'start']
  container_endtime = snapshot_dataframe.loc[container_name,'end']
  rescaled_container_starttime = container_starttime / 1000
  rescaled_container_endtime = container_endtime / 1000
  duration = rescaled_container_endtime - rescaled_container_starttime
  container_index = np.linspace(rescaled_container_starttime, rescaled_container_endtime -1,duration)
  data = np.linspace(0,0,duration)
  container_data2 = pd.Series(data,index=pd.to_datetime(container_index,unit='s'))

  mem_container_filtered = snapshot_mem_profile[(snapshot_mem_profile.name == container_name)]
  index = mem_container_filtered.timestamp.tolist()
  # get resident memory
  mem = mem_container_filtered.res.tolist()
  # get share memory
  #mem = mem_container_filtered.shr.tolist()
  # get virt memory
  #mem = mem_container_filtered.virt.tolist()
  container_data1 = pd.Series(mem,index=pd.to_datetime(index,unit='s'))
  container_data3 = container_data1 + container_data2
  container_data4 = container_data3.interpolate(method='time')
  for index in container_data4.index:
    if pd.isnull(container_data4[index]):
      container_data4[index] = container_data4.mean()
  if len(container_data4) > len(container_data2):
    a = set(container_data4.index.tolist()) - set(container_data2.index.tolist())
    print(a)
    #print(container_data4)
    #print(container_data3)
    #print(container_data2.index)
    #raise Exception('Return length mismatch')
    
  return container_data4

# Filter to remove containers with no informaction of the node, or to select specific nodes
SnapshotDFFiltered = SnapshotDFSorted[(SnapshotDFSorted.node != 'null')]
for i in SnapshotDFFiltered.index:
  a = get_mem_actual_use(i,snapshot_dataframe, snapshot_mem_profile)
  a = [ x / (1024*1024*1024) for x in a ]
  plt.plot(a)


set([Timestamp('2016-02-24 17:27:56', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:11', tz=None)])
set([Timestamp('2016-02-24 17:28:02', tz=None)])
set([Timestamp('2016-02-24 17:27:46', tz=None)])
set([Timestamp('2016-02-24 17:27:59', tz=None)])
set([Timestamp('2016-02-24 17:27:53', tz=None)])
set([Timestamp('2016-02-24 17:28:08', tz=None)])
set([Timestamp('2016-02-24 17:28:16', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:20', tz=None)])
set([Timestamp('2016-02-24 17:28:17', tz=None)])
set([Timestamp('2016-02-24 17:30:49', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:23', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:17', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:35', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:44', tz=None)])
set([Timestamp('2016-02-24 17:31:42', tz=None)])
set([Timestamp('2016-02-24 17:31:56', tz=None)])
set([Timestamp('2016-02-24 17:31:51', tz=None)])
set([Timestamp('2016-02-24 17:31:53', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:32:44', tz=None)])
set([Timestamp('2016-02-24 17:32:58', tz=None)])
set([Timestamp('2016-02-24 17:32:47', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:00', tz=None)])
set([Timestamp('2016-02-24 17:32:46', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:33:01', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:06', tz=None)])
set([Timestamp('2016-02-24 17:33:29', tz=None)])
set([Timestamp('2016-02-24 17:34:24', tz=None)])
set([Timestamp('2016-02-24 17:33:40', tz=None)])
set([Timestamp('2016-02-24 17:33:45', tz=None)])
set([Timestamp('2016-02-24 17:34:01', tz=None)])
set([Timestamp('2016-02-24 17:33:41', tz=None)])
set([Timestamp('2016-02-24 17:33:56', tz=None)])
set([Timestamp('2016-02-24 17:33:53', tz=None)])
set([Timestamp('2016-02-24 17:33:55', tz=None)])

In [12]:
# Filter to remove containers with no informaction of the node, or to select specific nodes
SnapshotDFFiltered = SnapshotDFSorted[(SnapshotDFSorted.node != 'null')]

# Filter to select specific nodes
#SnapshotDFFiltered = SnapshotDFFiltered[(SnapshotDFFiltered.node == 'svr15.spo:45454')]
# Filter to select specific apps
#SnapshotDFFiltered = SnapshotDFFiltered[(SnapshotDFFiltered.app == 'application_1456319042576_0007')]
# get list of application
application_list = SnapshotDFFiltered.app.unique().tolist()
# limit number of app to draw
# application_list = application_list[:1]

'''FOR CPU'''
SnapshotDFFiltered_group_node = SnapshotDFFiltered.groupby("node")
total_phy_CPU = SnapshotDFFiltered_group_node.n_CPU.mean().sum() #assume capacity has no change
total_rsrv_CPU = SnapshotDFFiltered_group_node.CPU_rsrv.mean().sum() #assume capacity has no change
print('Total physical cores in these nodes: %s cores' % total_phy_CPU)
print('Total virtual cores reserved for YARN in these nodes: %s cores' % total_rsrv_CPU)

# create vector zero
rescaled_snapshot_starttime = snapshot_starttime / 1000
rescaled_snapshot_endtime = snapshot_endtime / 1000
rescaled_snapshot_duration = rescaled_snapshot_endtime - rescaled_snapshot_starttime
time = np.linspace(rescaled_snapshot_starttime, rescaled_snapshot_endtime-1,rescaled_snapshot_duration)
zero_vector = pd.Series(np.linspace(0, 0,rescaled_snapshot_duration), index=time)
base_vector = zero_vector

phy_CPU = np.linspace(total_phy_CPU,total_phy_CPU,rescaled_snapshot_duration)
rsrv_CPU = np.linspace(total_rsrv_CPU,total_rsrv_CPU,rescaled_snapshot_duration)
phy_CPU = pd.Series(phy_CPU,index=time)
rsrv_CPU = pd.Series(rsrv_CPU,index=time)

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
ax.plot(phy_CPU,'-b')
ax.plot(rsrv_CPU,'-g')

# Allocated CPU
for application in application_list:
  print('Processing %s' % (application))
  for index in SnapshotDFFiltered.index:
    if SnapshotDFFiltered.loc[index,'app'] == application:
      # get CPU allocated for that container
      container_starttime = SnapshotDFFiltered.loc[index,'start']
      container_endtime = SnapshotDFFiltered.loc[index,'end']
      rescaled_container_starttime = container_starttime / 1000
      rescaled_container_endtime = container_endtime / 1000
      container_duration = rescaled_container_endtime - rescaled_container_starttime
      container_time_index = np.linspace(rescaled_container_starttime,rescaled_container_endtime-1,container_duration)
      container_value = np.linspace(SnapshotDFFiltered.loc[index,'CPU'],
                                    SnapshotDFFiltered.loc[index,'CPU'],
                                    container_duration)
      container_data = pd.Series(container_value, index=container_time_index)
      # checking if all points in container data belongs to the snapshot timeframe
      check = set(container_time_index) - set(time)
      if len(check): #not empty
        raise Exception("Error, data point's mismatch")
      # matching the container data with the length of the snapshot
      container_data = container_data + zero_vector
      container_data = container_data.fillna(0)
      # do stackplot
      # create drawing vector based on base_vector
      container_data = container_data + base_vector
      base_vector = container_data # update base_vector for next iteration
      #ax.plot(container_data,'-r')
ax.plot(base_vector,'-r')

# Actual Used CPU
base_vector = zero_vector
for application in application_list:
  print('Processing %s' % (application))
  for index in SnapshotDFFiltered.index:
    if SnapshotDFFiltered.loc[index,'app'] == application:
      # get CPU allocated for that container
      container_starttime = SnapshotDFFiltered.loc[index,'start']
      container_endtime = SnapshotDFFiltered.loc[index,'end']
      rescaled_container_starttime = container_starttime / 1000
      rescaled_container_endtime = container_endtime / 1000
      container_duration = rescaled_container_endtime - rescaled_container_starttime
      container_time_index = np.linspace(rescaled_container_starttime,rescaled_container_endtime-1,container_duration)
      '''Get actual CPU used '''
      actual_data_use = get_cpu_actual_use(index,snapshot_dataframe, snapshot_cpu_profile)
      actual_data_use = actual_data_use.tolist()
      '''because the return may have lengh longer, we generate the container_time_index again'''
      container_time_index = np.linspace(rescaled_container_starttime,
                                         rescaled_container_starttime+len(actual_data_use)-1,
                                         len(actual_data_use))
      container_data = pd.Series(actual_data_use, index=container_time_index)
      # checking if all points in container data belongs to the snapshot timeframe
      check = set(container_time_index) - set(time)
      if len(check): #not empty
        raise Exception("Error, data point's mismatch")
      # matching the container data with the length of the snapshot
      container_data = container_data + zero_vector
      container_data = container_data.fillna(0)
      # do stackplot
      # create drawing vector based on base_vector
      container_data = container_data + base_vector
      base_vector = container_data # update base_vector for next iteration
      #ax.plot(container_data,'-y')
ax.plot(base_vector,'-y')

'''FOR MEMORY'''
total_phy_mem = SnapshotDFFiltered_group_node.n_mem.mean().sum() #assume capacity has no change
total_rsrv_mem = SnapshotDFFiltered_group_node.mem_rsrv.mean().sum() #assume capacity has no change
# convert from KB to GB
total_phy_mem = float(total_phy_mem) / (1024*1024)
total_rsrv_mem = float(total_rsrv_mem) / (1024*1024)
print('Total physical memory in these nodes: %s GBs' % total_phy_mem)
print('Total memory reserved for YARN in these nodes: %s GBs' % total_rsrv_mem)

phy_mem = np.linspace(total_phy_mem,total_phy_mem,rescaled_snapshot_duration)
rsrv_mem = np.linspace(total_rsrv_mem,total_rsrv_mem,rescaled_snapshot_duration)
phy_mem = pd.Series(phy_mem,index=time)
rsrv_mem = pd.Series(rsrv_mem,index=time)

fig_mem = plt.figure(figsize=(12,8))
ax_mem = fig_mem.add_subplot(111)
ax_mem.plot(phy_mem,'-b')
ax_mem.plot(rsrv_mem,'-g')

base_vector = zero_vector # reset base vector
for application in application_list:
  print('Processing %s' % (application))
  for index in SnapshotDFFiltered.index:
    if SnapshotDFFiltered.loc[index,'app'] == application:
      # get mem allocated for that container
      container_starttime = SnapshotDFFiltered.loc[index,'start']
      container_endtime = SnapshotDFFiltered.loc[index,'end']
      rescaled_container_starttime = container_starttime / 1000
      rescaled_container_endtime = container_endtime / 1000
      container_duration = rescaled_container_endtime - rescaled_container_starttime
      container_time_index = np.linspace(rescaled_container_starttime,rescaled_container_endtime-1,container_duration)
      mem = float(SnapshotDFFiltered.loc[index,'mem']) / (1024*1024)
      container_value = np.linspace(mem,mem,container_duration)
      container_data = pd.Series(container_value, index=container_time_index)
      # checking if all points in container data belongs to the snapshot timeframe
      check = set(container_time_index) - set(time)
      if len(check): #not empty
        raise Exception("Error, data point's mismatch")
      # matching the container data with the length of the snapshot
      container_data = container_data + zero_vector
      container_data = container_data.fillna(0)
      # do stackplot
      # create drawing vector based on base_vector
      container_data = container_data + base_vector
      base_vector = container_data # update base_vector for next iteration
      #ax_mem.plot(container_data,'-r')
ax_mem.plot(base_vector,'-r')

base_vector = zero_vector # reset base vector
for application in application_list:
  print('Processing %s' % (application))
  for index in SnapshotDFFiltered.index:
    if SnapshotDFFiltered.loc[index,'app'] == application:
      # get mem allocated for that container
      container_starttime = SnapshotDFFiltered.loc[index,'start']
      container_endtime = SnapshotDFFiltered.loc[index,'end']
      rescaled_container_starttime = container_starttime / 1000
      rescaled_container_endtime = container_endtime / 1000
      container_duration = rescaled_container_endtime - rescaled_container_starttime
      '''Get actual CPU used '''
      actual_data_use = get_mem_actual_use(index,snapshot_dataframe, snapshot_mem_profile)
      actual_data_use = actual_data_use.tolist()
      actual_data_use = [x / (1024*1024*1024) for x in actual_data_use]
      '''because the return may have lengh longer, we generate the container_time_index again'''
      container_time_index = np.linspace(rescaled_container_starttime,
                                         rescaled_container_starttime+len(actual_data_use)-1,
                                         len(actual_data_use))
      container_data = pd.Series(actual_data_use, index=container_time_index)
      # checking if all points in container data belongs to the snapshot timeframe
      check = set(container_time_index) - set(time)
      if len(check): #not empty
        raise Exception("Error, data point's mismatch")
      # matching the container data with the length of the snapshot
      container_data = container_data + zero_vector
      container_data = container_data.fillna(0)
      # do stackplot
      # create drawing vector based on base_vector
      container_data = container_data + base_vector
      base_vector = container_data # update base_vector for next iteration
      #ax_mem.plot(container_data,'-y')
ax_mem.plot(base_vector,'-y')

# Calculate free memory of the cluster during snapshot


Total physical cores in these nodes: 56 cores
Total virtual cores reserved for YARN in these nodes: 72 cores
Processing application_1456319042576_0003
Processing application_1456319042576_0004
Processing application_1456319042576_0005
Processing application_1456319042576_0006
Processing application_1456319042576_0007
Processing application_1456319042576_0003
set([Timestamp('2016-02-24 17:27:56', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:11', tz=None)])
set([Timestamp('2016-02-24 17:28:02', tz=None)])
set([Timestamp('2016-02-24 17:27:46', tz=None)])
set([Timestamp('2016-02-24 17:27:59', tz=None)])
set([Timestamp('2016-02-24 17:27:53', tz=None)])
set([Timestamp('2016-02-24 17:28:08', tz=None)])
set([Timestamp('2016-02-24 17:28:16', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:20', tz=None)])
set([Timestamp('2016-02-24 17:28:17', tz=None)])
Processing application_1456319042576_0004
set([Timestamp('2016-02-24 17:30:49', tz=None)])
Processing application_1456319042576_0005
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:23', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:17', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:35', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:44', tz=None)])
set([Timestamp('2016-02-24 17:31:42', tz=None)])
set([Timestamp('2016-02-24 17:31:56', tz=None)])
set([Timestamp('2016-02-24 17:31:51', tz=None)])
set([Timestamp('2016-02-24 17:31:53', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
Processing application_1456319042576_0006
set([Timestamp('2016-02-24 17:32:44', tz=None)])
set([Timestamp('2016-02-24 17:32:58', tz=None)])
set([Timestamp('2016-02-24 17:32:47', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:00', tz=None)])
set([Timestamp('2016-02-24 17:32:46', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:33:01', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:06', tz=None)])
Processing application_1456319042576_0007
set([Timestamp('2016-02-24 17:33:29', tz=None)])
set([Timestamp('2016-02-24 17:34:24', tz=None)])
set([Timestamp('2016-02-24 17:33:40', tz=None)])
set([Timestamp('2016-02-24 17:33:45', tz=None)])
set([Timestamp('2016-02-24 17:34:01', tz=None)])
set([Timestamp('2016-02-24 17:33:41', tz=None)])
set([Timestamp('2016-02-24 17:33:56', tz=None)])
set([Timestamp('2016-02-24 17:33:53', tz=None)])
set([Timestamp('2016-02-24 17:33:55', tz=None)])
Total physical memory in these nodes: 108.034534454 GBs
Total memory reserved for YARN in these nodes: 75.0 GBs
Processing application_1456319042576_0003
Processing application_1456319042576_0004
Processing application_1456319042576_0005
Processing application_1456319042576_0006
Processing application_1456319042576_0007
Processing application_1456319042576_0003
set([Timestamp('2016-02-24 17:27:56', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:00', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:11', tz=None)])
set([Timestamp('2016-02-24 17:28:02', tz=None)])
set([Timestamp('2016-02-24 17:27:46', tz=None)])
set([Timestamp('2016-02-24 17:27:59', tz=None)])
set([Timestamp('2016-02-24 17:27:53', tz=None)])
set([Timestamp('2016-02-24 17:28:08', tz=None)])
set([Timestamp('2016-02-24 17:28:16', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:19', tz=None)])
set([Timestamp('2016-02-24 17:28:14', tz=None)])
set([Timestamp('2016-02-24 17:28:20', tz=None)])
set([Timestamp('2016-02-24 17:28:17', tz=None)])
Processing application_1456319042576_0004
set([Timestamp('2016-02-24 17:30:49', tz=None)])
Processing application_1456319042576_0005
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:40', tz=None)])
set([Timestamp('2016-02-24 17:31:23', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:26', tz=None)])
set([Timestamp('2016-02-24 17:31:17', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:35', tz=None)])
set([Timestamp('2016-02-24 17:31:47', tz=None)])
set([Timestamp('2016-02-24 17:31:44', tz=None)])
set([Timestamp('2016-02-24 17:31:42', tz=None)])
set([Timestamp('2016-02-24 17:31:56', tz=None)])
set([Timestamp('2016-02-24 17:31:51', tz=None)])
set([Timestamp('2016-02-24 17:31:53', tz=None)])
set([Timestamp('2016-02-24 17:31:54', tz=None)])
Processing application_1456319042576_0006
set([Timestamp('2016-02-24 17:32:44', tz=None)])
set([Timestamp('2016-02-24 17:32:58', tz=None)])
set([Timestamp('2016-02-24 17:32:47', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:00', tz=None)])
set([Timestamp('2016-02-24 17:32:46', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:32:54', tz=None)])
set([Timestamp('2016-02-24 17:33:01', tz=None)])
set([Timestamp('2016-02-24 17:33:03', tz=None)])
set([Timestamp('2016-02-24 17:33:06', tz=None)])
Processing application_1456319042576_0007
set([Timestamp('2016-02-24 17:33:29', tz=None)])
set([Timestamp('2016-02-24 17:34:24', tz=None)])
set([Timestamp('2016-02-24 17:33:40', tz=None)])
set([Timestamp('2016-02-24 17:33:45', tz=None)])
set([Timestamp('2016-02-24 17:34:01', tz=None)])
set([Timestamp('2016-02-24 17:33:41', tz=None)])
set([Timestamp('2016-02-24 17:33:56', tz=None)])
set([Timestamp('2016-02-24 17:33:53', tz=None)])
set([Timestamp('2016-02-24 17:33:55', tz=None)])
Out[12]:
[<matplotlib.lines.Line2D at 0x7f3f2061b9d0>]

In [13]:
# Calculate free memory

In [ ]: