From 8c995891acc6e2d098d45ace729c34904654ca75 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 17:44:53 +0700 Subject: [PATCH 01/50] add protobuf --- .gitignore | 1 + hdfs/install-hadoop.sh | 0 hdfs/install-jdk7.sh | 5 ++++- hdfs/install-protobuf.sh | 29 +++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 hdfs/install-hadoop.sh create mode 100644 hdfs/install-protobuf.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45946d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.bak diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh new file mode 100644 index 0000000..e69de29 diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 3a8c3c4..23d8230 100644 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -1,7 +1,7 @@ #!/bin/bash # creating dirs -mkdir temp-jdk +mkdir -p temp-jdk # download zulu wget https://cdn.azul.com/zulu/bin/zulu7.29.0.5-ca-jdk7.0.222-linux_amd64.deb -O temp-jdk/jdk7.deb @@ -21,3 +21,6 @@ sudo apt-get update && sudo apt-get --fix-broken install \ # install jdk7 sudo dpkg -i temp-jdk/jdk7.deb + +# remove tmp +rm -rf temp-jdk diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh new file mode 100644 index 0000000..7ca3d02 --- /dev/null +++ b/hdfs/install-protobuf.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +PROTOBUF_VERSION="2.5.0" + +# creating dirs +mkdir -p temp-protobuf + +# download zulu jdk +wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-$PROTOBUF_VERSION.tar.gz -O temp-protobuf/protobuf-$PROTOBUF_VERSION.tar.gz + +# Untar +tar xvf temp-protobuf/protobuf-$PROTOBUF_VERSION.tar.gz + +# change dir +cd temp-protobuf/protobuf-$PROTOBUF_VERSION + +# autogen +./autogen.sh + +# configure +./configure --prefix=/usr + +# make and install +make && make install + +# check installation +if which gls &>/dev/null; then + exit 1 +fi From b777d40774c8e66d2cffb8b74b023f08ec9bb438 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 17:46:38 +0700 Subject: [PATCH 02/50] chmod scripts --- hdfs/install-hadoop.sh | 0 hdfs/install-jdk7.sh | 0 hdfs/install-protobuf.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 hdfs/install-hadoop.sh mode change 100644 => 100755 hdfs/install-jdk7.sh mode change 100644 => 100755 hdfs/install-protobuf.sh diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh old mode 100644 new mode 100755 diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh old mode 100644 new mode 100755 diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh old mode 100644 new mode 100755 From ee7c2320f9cc48d028265f9d51b8d53e7fa374cc Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 17:52:12 +0700 Subject: [PATCH 03/50] refactor code --- hdfs/install-jdk7.sh | 16 ++++++++++++---- hdfs/install-protobuf.sh | 15 ++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 23d8230..9a2b7aa 100755 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -1,10 +1,13 @@ #!/bin/bash +TEMP_FOLDER="temp-jdk" +JDK_VERSION="7.0.222" + # creating dirs -mkdir -p temp-jdk +mkdir -p $TEMP_FOLDER # download zulu -wget https://cdn.azul.com/zulu/bin/zulu7.29.0.5-ca-jdk7.0.222-linux_amd64.deb -O temp-jdk/jdk7.deb +wget https://cdn.azul.com/zulu/bin/zulu7.29.0.5-ca-jdk$JDK_VERSION-linux_amd64.deb -O $TEMP_FOLDER/jdk$JDK_VERSION.deb # install deps sudo apt-get update && sudo apt-get --fix-broken install \ @@ -20,7 +23,12 @@ sudo apt-get update && sudo apt-get --fix-broken install \ fonts-dejavu-core # install jdk7 -sudo dpkg -i temp-jdk/jdk7.deb +sudo dpkg -i $TEMP_FOLDER/jdk$JDK_VERSION.deb + +# check installation +if which java &>/dev/null; then + exit 1 +fi # remove tmp -rm -rf temp-jdk +rm -rf $TEMP_FOLDER diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index 7ca3d02..729381a 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -1,18 +1,20 @@ #!/bin/bash +TEMP_FOLDER="temp-protobuf" PROTOBUF_VERSION="2.5.0" # creating dirs -mkdir -p temp-protobuf +mkdir -p $TEMP_FOLDER # download zulu jdk -wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-$PROTOBUF_VERSION.tar.gz -O temp-protobuf/protobuf-$PROTOBUF_VERSION.tar.gz +wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-$PROTOBUF_VERSION.tar.gz \ + -O $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION.tar.gz # Untar -tar xvf temp-protobuf/protobuf-$PROTOBUF_VERSION.tar.gz +tar xvf $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION.tar.gz -C $TEMP_FOLDER # change dir -cd temp-protobuf/protobuf-$PROTOBUF_VERSION +cd $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION # autogen ./autogen.sh @@ -24,6 +26,9 @@ cd temp-protobuf/protobuf-$PROTOBUF_VERSION make && make install # check installation -if which gls &>/dev/null; then +if which protoc &>/dev/null; then exit 1 fi + +# remove dir +rm -rf $TEMP_FOLDER From 266fbc1f465d50aaec6adda45594fffbdce7aa1b Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 17:55:50 +0700 Subject: [PATCH 04/50] add build essentials --- hdfs/install-protobuf.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index 729381a..6c07e56 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -3,6 +3,9 @@ TEMP_FOLDER="temp-protobuf" PROTOBUF_VERSION="2.5.0" +# install build essentials +sudo apt-get update && sudo apt-get install build-essential -y + # creating dirs mkdir -p $TEMP_FOLDER From a2f9d21184e3404097563b94cda4bffb654729bc Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 18:36:00 +0700 Subject: [PATCH 05/50] add custom checker --- hdfs/install-jdk7.sh | 5 +++-- hdfs/install-maven.sh | 38 ++++++++++++++++++++++++++++++++++++++ hdfs/install-protobuf.sh | 5 +++-- 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 hdfs/install-maven.sh diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 9a2b7aa..975dae9 100755 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -26,9 +26,10 @@ sudo apt-get update && sudo apt-get --fix-broken install \ sudo dpkg -i $TEMP_FOLDER/jdk$JDK_VERSION.deb # check installation -if which java &>/dev/null; then +command -v java >/dev/null 2>&1 || { + echo >&2 "Java installation failed. Aborting." exit 1 -fi +} # remove tmp rm -rf $TEMP_FOLDER diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh new file mode 100644 index 0000000..82d973d --- /dev/null +++ b/hdfs/install-maven.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +TEMP_FOLDER="temp-maven" +MAVEN_VERSION="3.6.1" +JAVA_DIR="zulu-7-amd64" +DEST_FOLDER="/opt" +MAVEN_PROFILE="/etc/profile.d/maven.sh" + +# download maven +wget https://www-us.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz \ + -O $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz + +# Untar +tar xvf $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz -C $DEST_FOLDER + +# Make link +sudo ln -s /opt/apache-maven-$MAVEN_VERSION /opt/maven + +# create profile +sudo echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$MAVEN_PROFILE +sudo echo "export M2_HOME=/opt/maven" >>$MAVEN_PROFILE +sudo echo "export MAVEN_HOME=/opt/maven" >>$MAVEN_PROFILE +sudo echo "export PATH=${M2_HOME}/bin:${PATH}" >>$MAVEN_PROFILE + +# chmod +sudo chmod +x $MAVEN_PROFILE + +# source file +source $MAVEN_PROFILE + +# check installation +command -v mvn >/dev/null 2>&1 || { + echo >&2 "Maven installation failed. Aborting." + exit 1 +} + +# remove tmp +rm -rf $TEMP_FOLDER diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index 6c07e56..b4deccd 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -29,9 +29,10 @@ cd $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION make && make install # check installation -if which protoc &>/dev/null; then +command -v protoc >/dev/null 2>&1 || { + echo >&2 "Protobuf installation failed. Aborting." exit 1 -fi +} # remove dir rm -rf $TEMP_FOLDER From db7bfef5cf927d13e5c48c17964474bb4528afb8 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 18:55:46 +0700 Subject: [PATCH 06/50] add utils --- hdfs/_utils.sh | 4 ++++ hdfs/install-jdk7.sh | 4 +++- hdfs/install-maven.sh | 7 ++++--- hdfs/install-protobuf.sh | 9 +++++---- research.code-workspace | 3 +++ utils/check.sh | 3 +++ utils/index.sh | 6 ++++++ 7 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 hdfs/_utils.sh mode change 100644 => 100755 hdfs/install-maven.sh create mode 100644 utils/check.sh create mode 100644 utils/index.sh diff --git a/hdfs/_utils.sh b/hdfs/_utils.sh new file mode 100644 index 0000000..b8d1d45 --- /dev/null +++ b/hdfs/_utils.sh @@ -0,0 +1,4 @@ +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/../utils/index.sh" diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 975dae9..1095648 100755 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -1,5 +1,7 @@ #!/bin/bash +source "_utils.sh" + TEMP_FOLDER="temp-jdk" JDK_VERSION="7.0.222" @@ -26,7 +28,7 @@ sudo apt-get update && sudo apt-get --fix-broken install \ sudo dpkg -i $TEMP_FOLDER/jdk$JDK_VERSION.deb # check installation -command -v java >/dev/null 2>&1 || { +check_program java || { echo >&2 "Java installation failed. Aborting." exit 1 } diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh old mode 100644 new mode 100755 index 82d973d..f06b852 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -1,5 +1,7 @@ #!/bin/bash +source "_utils.sh" + TEMP_FOLDER="temp-maven" MAVEN_VERSION="3.6.1" JAVA_DIR="zulu-7-amd64" @@ -29,9 +31,8 @@ sudo chmod +x $MAVEN_PROFILE source $MAVEN_PROFILE # check installation -command -v mvn >/dev/null 2>&1 || { - echo >&2 "Maven installation failed. Aborting." - exit 1 +check_program mvn || { + echo >&2 "Maven program not found. Aborting." } # remove tmp diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index b4deccd..03f5b26 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -1,5 +1,7 @@ #!/bin/bash +source "_utils.sh" + TEMP_FOLDER="temp-protobuf" PROTOBUF_VERSION="2.5.0" @@ -26,12 +28,11 @@ cd $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION ./configure --prefix=/usr # make and install -make && make install +sudo make && sudo make install # check installation -command -v protoc >/dev/null 2>&1 || { - echo >&2 "Protobuf installation failed. Aborting." - exit 1 +check_program protoc || { + echo >&2 "Protoc program not found. Aborting." } # remove dir diff --git a/research.code-workspace b/research.code-workspace index da99f82..8a7f2a6 100644 --- a/research.code-workspace +++ b/research.code-workspace @@ -2,6 +2,9 @@ "folders": [ { "path": "hdfs" + }, + { + "path": "utils" } ], "settings": {} diff --git a/utils/check.sh b/utils/check.sh new file mode 100644 index 0000000..d9101ee --- /dev/null +++ b/utils/check.sh @@ -0,0 +1,3 @@ +check_program() { + command -v $1 >/dev/null 2>&1 +} diff --git a/utils/index.sh b/utils/index.sh new file mode 100644 index 0000000..2cbefff --- /dev/null +++ b/utils/index.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/check.sh" From 0b1a8a38d3af7b0c61de799726d34105788ce2e1 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 18:56:19 +0700 Subject: [PATCH 07/50] add utils --- hdfs/_utils.sh | 0 utils/check.sh | 0 utils/index.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 hdfs/_utils.sh mode change 100644 => 100755 utils/check.sh mode change 100644 => 100755 utils/index.sh diff --git a/hdfs/_utils.sh b/hdfs/_utils.sh old mode 100644 new mode 100755 diff --git a/utils/check.sh b/utils/check.sh old mode 100644 new mode 100755 diff --git a/utils/index.sh b/utils/index.sh old mode 100644 new mode 100755 From 993b74862b907d00201c8bef8738cd9dc5412014 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:00:21 +0700 Subject: [PATCH 08/50] add utils --- hdfs/_utils.sh | 2 ++ hdfs/install-jdk7.sh | 5 ++++- hdfs/install-maven.sh | 7 +++++-- hdfs/install-protobuf.sh | 5 ++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hdfs/_utils.sh b/hdfs/_utils.sh index b8d1d45..0537e79 100755 --- a/hdfs/_utils.sh +++ b/hdfs/_utils.sh @@ -1,3 +1,5 @@ +#!/bin/bash + DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 1095648..5593545 100755 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -1,6 +1,9 @@ #!/bin/bash -source "_utils.sh" +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/_utils.sh" TEMP_FOLDER="temp-jdk" JDK_VERSION="7.0.222" diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index f06b852..84c876a 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -1,6 +1,9 @@ #!/bin/bash -source "_utils.sh" +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/_utils.sh" TEMP_FOLDER="temp-maven" MAVEN_VERSION="3.6.1" @@ -30,7 +33,7 @@ sudo chmod +x $MAVEN_PROFILE # source file source $MAVEN_PROFILE -# check installation +# # check installation check_program mvn || { echo >&2 "Maven program not found. Aborting." } diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index 03f5b26..e935a73 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -1,6 +1,9 @@ #!/bin/bash -source "_utils.sh" +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/_utils.sh" TEMP_FOLDER="temp-protobuf" PROTOBUF_VERSION="2.5.0" From 24d458ffb41ad86222dc67dbad743ed95080ab08 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:01:50 +0700 Subject: [PATCH 09/50] add utils --- hdfs/install-maven.sh | 1 + hdfs/install-protobuf.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index 84c876a..e0e0513 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -36,6 +36,7 @@ source $MAVEN_PROFILE # # check installation check_program mvn || { echo >&2 "Maven program not found. Aborting." + exit 1 } # remove tmp diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index e935a73..21b4eb0 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -36,6 +36,7 @@ sudo make && sudo make install # check installation check_program protoc || { echo >&2 "Protoc program not found. Aborting." + exit 1 } # remove dir From a40d496b9c87b4dfd5ad8a0db532d9ff5947cd76 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:06:04 +0700 Subject: [PATCH 10/50] add maven --- hdfs/install-jdk7.sh | 2 ++ hdfs/install-maven.sh | 4 +++- hdfs/install-protobuf.sh | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/hdfs/install-jdk7.sh b/hdfs/install-jdk7.sh index 5593545..c666565 100755 --- a/hdfs/install-jdk7.sh +++ b/hdfs/install-jdk7.sh @@ -36,5 +36,7 @@ check_program java || { exit 1 } +echo "Java installation succeed!" + # remove tmp rm -rf $TEMP_FOLDER diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index e0e0513..b3f7da8 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -12,7 +12,7 @@ DEST_FOLDER="/opt" MAVEN_PROFILE="/etc/profile.d/maven.sh" # download maven -wget https://www-us.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz \ +wget https://www-us.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz \ -O $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz # Untar @@ -39,5 +39,7 @@ check_program mvn || { exit 1 } +echo "Maven installation succeed!" + # remove tmp rm -rf $TEMP_FOLDER diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index 21b4eb0..e41e94d 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -35,9 +35,11 @@ sudo make && sudo make install # check installation check_program protoc || { - echo >&2 "Protoc program not found. Aborting." + echo >&2 "Protobuf program not found. Aborting." exit 1 } +echo "Protobuf installation succeed!" + # remove dir rm -rf $TEMP_FOLDER From dbe820412b93e6adac75b304f40d75d5046ef8a3 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:07:53 +0700 Subject: [PATCH 11/50] add maven temp dir --- hdfs/install-maven.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index b3f7da8..3fac6b9 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -11,12 +11,15 @@ JAVA_DIR="zulu-7-amd64" DEST_FOLDER="/opt" MAVEN_PROFILE="/etc/profile.d/maven.sh" +# make temp +mkdir $TEMP_FOLDER + # download maven wget https://www-us.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz \ -O $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz # Untar -tar xvf $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz -C $DEST_FOLDER +sudo tar xvf $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz -C $DEST_FOLDER # Make link sudo ln -s /opt/apache-maven-$MAVEN_VERSION /opt/maven From 24f6e49192de4d470cf7dc811e4fb5f7301fe1ec Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:11:18 +0700 Subject: [PATCH 12/50] add maven temp dir --- hdfs/install-maven.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index 3fac6b9..af1cf84 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -9,6 +9,7 @@ TEMP_FOLDER="temp-maven" MAVEN_VERSION="3.6.1" JAVA_DIR="zulu-7-amd64" DEST_FOLDER="/opt" +M2_HOME="/opt/maven" MAVEN_PROFILE="/etc/profile.d/maven.sh" # make temp @@ -26,8 +27,8 @@ sudo ln -s /opt/apache-maven-$MAVEN_VERSION /opt/maven # create profile sudo echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$MAVEN_PROFILE -sudo echo "export M2_HOME=/opt/maven" >>$MAVEN_PROFILE -sudo echo "export MAVEN_HOME=/opt/maven" >>$MAVEN_PROFILE +sudo echo "export M2_HOME=${M2_HOME}" >>$MAVEN_PROFILE +sudo echo "export MAVEN_HOME=${M2_HOME}" >>$MAVEN_PROFILE sudo echo "export PATH=${M2_HOME}/bin:${PATH}" >>$MAVEN_PROFILE # chmod From b57238011366712de9d264414f82fa39aa83a742 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:26:47 +0700 Subject: [PATCH 13/50] add maven source --- hdfs/install-maven.sh | 17 ++++++++++------- utils/index.sh | 1 + utils/profile.sh | 3 +++ 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 utils/profile.sh diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index af1cf84..70f91cb 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -10,7 +10,7 @@ MAVEN_VERSION="3.6.1" JAVA_DIR="zulu-7-amd64" DEST_FOLDER="/opt" M2_HOME="/opt/maven" -MAVEN_PROFILE="/etc/profile.d/maven.sh" +BASHRC="~/.bashrc" # make temp mkdir $TEMP_FOLDER @@ -26,16 +26,19 @@ sudo tar xvf $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz -C $DEST_FOLDER sudo ln -s /opt/apache-maven-$MAVEN_VERSION /opt/maven # create profile -sudo echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$MAVEN_PROFILE -sudo echo "export M2_HOME=${M2_HOME}" >>$MAVEN_PROFILE -sudo echo "export MAVEN_HOME=${M2_HOME}" >>$MAVEN_PROFILE -sudo echo "export PATH=${M2_HOME}/bin:${PATH}" >>$MAVEN_PROFILE +check_var_exist $JAVA_HOME $(echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$BASHRC) +check_var_exist $M2_HOME \ + $( + echo "export M2_HOME=${M2_HOME}" >>$BASHRC + echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$BASHRC + echo "export PATH=${M2_HOME}/bin:${PATH}" >>$BASHRC + ) # chmod -sudo chmod +x $MAVEN_PROFILE +# sudo chmod +x $MAVEN_PROFILE # source file -source $MAVEN_PROFILE +source $BASHRC # # check installation check_program mvn || { diff --git a/utils/index.sh b/utils/index.sh index 2cbefff..12cc38a 100755 --- a/utils/index.sh +++ b/utils/index.sh @@ -4,3 +4,4 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi source "$DIR/check.sh" +source "$DIR/profile.sh" diff --git a/utils/profile.sh b/utils/profile.sh new file mode 100644 index 0000000..af754a4 --- /dev/null +++ b/utils/profile.sh @@ -0,0 +1,3 @@ +check_var_exist() { + if [ -z ${1+x} ]; then $2; fi +} From f92571c5f6826325d2a494b6604f89f7c8e3842c Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:28:03 +0700 Subject: [PATCH 14/50] add maven source --- hdfs/install-maven.sh | 2 ++ utils/profile.sh | 0 2 files changed, 2 insertions(+) mode change 100644 => 100755 utils/profile.sh diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index 70f91cb..37a37f0 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -12,6 +12,8 @@ DEST_FOLDER="/opt" M2_HOME="/opt/maven" BASHRC="~/.bashrc" +sudo rm -rf /opt/maven && sudo rm -rf /opt/apache-maven-$MAVEN_VERSION + # make temp mkdir $TEMP_FOLDER diff --git a/utils/profile.sh b/utils/profile.sh old mode 100644 new mode 100755 From 177a37ac601c191f726b26f53ad6b3f77d1eda9c Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 19:28:56 +0700 Subject: [PATCH 15/50] fix vars --- hdfs/install-maven.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index 37a37f0..e792c17 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -10,7 +10,7 @@ MAVEN_VERSION="3.6.1" JAVA_DIR="zulu-7-amd64" DEST_FOLDER="/opt" M2_HOME="/opt/maven" -BASHRC="~/.bashrc" +BASHRC="$HOME/.bashrc" sudo rm -rf /opt/maven && sudo rm -rf /opt/apache-maven-$MAVEN_VERSION From eb9bc93c6340f8953917b12625571ce577758155 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 23:14:03 +0700 Subject: [PATCH 16/50] add hadoop scripts --- .gitignore | 1 + hdfs/install-hadoop.sh | 1 + hdfs/install-maven.sh | 25 +++++++++++++------------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 45946d4..39c28d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .bak +.DS_Store diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh index e69de29..a9bf588 100755 --- a/hdfs/install-hadoop.sh +++ b/hdfs/install-hadoop.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/hdfs/install-maven.sh b/hdfs/install-maven.sh index e792c17..b907fa7 100755 --- a/hdfs/install-maven.sh +++ b/hdfs/install-maven.sh @@ -10,7 +10,8 @@ MAVEN_VERSION="3.6.1" JAVA_DIR="zulu-7-amd64" DEST_FOLDER="/opt" M2_HOME="/opt/maven" -BASHRC="$HOME/.bashrc" +# BASHRC="$HOME/.bashrc" +MAVEN_PROFILE="/etc/profile.d/maven.sh" sudo rm -rf /opt/maven && sudo rm -rf /opt/apache-maven-$MAVEN_VERSION @@ -28,27 +29,27 @@ sudo tar xvf $TEMP_FOLDER/maven-$MAVEN_VERSION.tar.gz -C $DEST_FOLDER sudo ln -s /opt/apache-maven-$MAVEN_VERSION /opt/maven # create profile -check_var_exist $JAVA_HOME $(echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$BASHRC) +check_var_exist $JAVA_HOME $(echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$MAVEN_PROFILE) check_var_exist $M2_HOME \ $( - echo "export M2_HOME=${M2_HOME}" >>$BASHRC - echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$BASHRC - echo "export PATH=${M2_HOME}/bin:${PATH}" >>$BASHRC + echo "export M2_HOME=${M2_HOME}" >>$MAVEN_PROFILE + echo "export JAVA_HOME=/usr/lib/jvm/$JAVA_DIR" >>$MAVEN_PROFILE + echo "export PATH=${M2_HOME}/bin:${PATH}" >>$MAVEN_PROFILE ) # chmod -# sudo chmod +x $MAVEN_PROFILE +sudo chmod +x $MAVEN_PROFILE # source file -source $BASHRC +source $MAVEN_PROFILE # # check installation -check_program mvn || { - echo >&2 "Maven program not found. Aborting." - exit 1 -} +# check_program mvn || { +# echo >&2 "Maven program not found. Aborting." +# exit 1 +# } -echo "Maven installation succeed!" +# echo "Maven installation succeed!" # remove tmp rm -rf $TEMP_FOLDER From a90c0ff02d3a645a841597c7e2d2de1984a87f01 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 23:39:45 +0700 Subject: [PATCH 17/50] add custom hadoop src --- .gitmodules | 3 +++ hdfs/source | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 hdfs/source diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a506411 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "hdfs/source"] + path = hdfs/source + url = git@github.com:rayandrews/custom-hadoop.git diff --git a/hdfs/source b/hdfs/source new file mode 160000 index 0000000..8d99895 --- /dev/null +++ b/hdfs/source @@ -0,0 +1 @@ +Subproject commit 8d9989544b1cf774a2557a6054da0feb5afc4875 From 7bc4e80afe45072a58391986766ebac372114088 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 23:50:55 +0700 Subject: [PATCH 18/50] add hadoop installation --- hdfs/install-hadoop.sh | 18 ++++++++++++++++++ research.code-workspace | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh index a9bf588..5adc50f 100755 --- a/hdfs/install-hadoop.sh +++ b/hdfs/install-hadoop.sh @@ -1 +1,19 @@ #!/bin/bash + +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +source "$DIR/_utils.sh" + +cd "$DIR/source" + +# check installation +check_program mvn || { + echo >&2 "Maven program not found. Aborting." + exit 1 +} + +# Compiling maven +echo "Compiling Hadoop" +mvn package -Pdist -DskipTests -Dtar +echo "Hadoop has been compiled!" diff --git a/research.code-workspace b/research.code-workspace index 8a7f2a6..c31d5f0 100644 --- a/research.code-workspace +++ b/research.code-workspace @@ -1,10 +1,10 @@ { "folders": [ { - "path": "hdfs" + "path": "/Users/rayandrew/Projects/research" }, { - "path": "utils" + "path": "/Users/rayandrew/Projects/custom-hadoop" } ], "settings": {} From b1a3d64a077b0ac6f5d900bd19df3a6625d283a0 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 2 Jul 2019 23:52:44 +0700 Subject: [PATCH 19/50] add hadoop installation --- hdfs/install-hadoop.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh index 5adc50f..c3b0274 100755 --- a/hdfs/install-hadoop.sh +++ b/hdfs/install-hadoop.sh @@ -5,6 +5,9 @@ if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi source "$DIR/_utils.sh" +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + cd "$DIR/source" # check installation From 8fdc30946fc28537516216610527499b11d596f9 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 13:31:56 +0700 Subject: [PATCH 20/50] add hdfs runner --- hdfs/install-hadoop.sh | 3 ++- hdfs/install-protobuf.sh | 2 +- hdfs/run-hadoop.sh | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 hdfs/run-hadoop.sh diff --git a/hdfs/install-hadoop.sh b/hdfs/install-hadoop.sh index c3b0274..18817bb 100755 --- a/hdfs/install-hadoop.sh +++ b/hdfs/install-hadoop.sh @@ -5,6 +5,7 @@ if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi source "$DIR/_utils.sh" +# we set dir 2 times to include files DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi @@ -18,5 +19,5 @@ check_program mvn || { # Compiling maven echo "Compiling Hadoop" -mvn package -Pdist -DskipTests -Dtar +mvn -Dhttps.protocols=TLSv1.2 package -Pdist -DskipTests -Dtar echo "Hadoop has been compiled!" diff --git a/hdfs/install-protobuf.sh b/hdfs/install-protobuf.sh index e41e94d..49e1c89 100755 --- a/hdfs/install-protobuf.sh +++ b/hdfs/install-protobuf.sh @@ -31,7 +31,7 @@ cd $TEMP_FOLDER/protobuf-$PROTOBUF_VERSION ./configure --prefix=/usr # make and install -sudo make && sudo make install +sudo make && sudo make check && sudo make install # check installation check_program protoc || { diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh new file mode 100644 index 0000000..b05a211 --- /dev/null +++ b/hdfs/run-hadoop.sh @@ -0,0 +1,36 @@ +# Taken from https://bigdata.wordpress.com/2010/05/27/hadoop-cookbook-4-how-to-run-multiple-data-nodes-on-one-machine/ + +#!/bin/sh +# This is used for starting multiple datanodes on the same machine. +# run it from hadoop-dir/ just like 'bin/hadoop' + +#Usage: run-additionalDN.sh [start|stop] dnnumber +#e.g. run-datanode.sh start 2 + +DIR="${BASH_SOURCE%/*}" +if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi + +DN_DIR_PREFIX="$DIR/dn_temp/" + +if [ -z $DN_DIR_PREFIX ]; then + echo $0: DN_DIR_PREFIX is not set. set it to something like "/hadoopTmp/dn" + exit 1 +fi + +run_datanode() { + DN=$2 + export HADOOP_LOG_DIR=$DN_DIR_PREFIX$DN/logs + export HADOOP_PID_DIR=$HADOOP_LOG_DIR + DN_CONF_OPTS="\ +-Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN-Ddfs.datanode.address=0.0.0.0:5001$DN \ +-Ddfs.datanode.http.address=0.0.0.0:5008$DN \ +-Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" + bin/hadoop-daemon.sh --script bin/hdfs $1 datanode $DN_CONF_OPTS +} + +cmd=$1 +shift + +for i in $*; do + run_datanode $cmd $i +done From 18683507691eb3ae137bebf1ae6dffe871142d0c Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 14:26:27 +0700 Subject: [PATCH 21/50] add hadoop runner --- hdfs/run-hadoop.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 hdfs/run-hadoop.sh diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh old mode 100644 new mode 100755 index b05a211..05da081 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,6 +10,7 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi +HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" DN_DIR_PREFIX="$DIR/dn_temp/" if [ -z $DN_DIR_PREFIX ]; then @@ -25,7 +26,7 @@ run_datanode() { -Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN-Ddfs.datanode.address=0.0.0.0:5001$DN \ -Ddfs.datanode.http.address=0.0.0.0:5008$DN \ -Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" - bin/hadoop-daemon.sh --script bin/hdfs $1 datanode $DN_CONF_OPTS + $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } cmd=$1 From 80f7729e3632151ee2f029699192a1f943555516 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 15:09:00 +0700 Subject: [PATCH 22/50] add hadoop runner --- hdfs/run-hadoop.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 05da081..49655eb 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -11,13 +11,15 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" -DN_DIR_PREFIX="$DIR/dn_temp/" +DN_DIR_PREFIX="/tmp/dn_temp/" if [ -z $DN_DIR_PREFIX ]; then echo $0: DN_DIR_PREFIX is not set. set it to something like "/hadoopTmp/dn" exit 1 fi +mkdir -p DN_DIR_PREFIX + run_datanode() { DN=$2 export HADOOP_LOG_DIR=$DN_DIR_PREFIX$DN/logs From c1e1128e6d1bd3b33fd2b8e1ed72ee31ac737784 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 18:17:24 +0700 Subject: [PATCH 23/50] add env --- hdfs/env.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 hdfs/env.sh diff --git a/hdfs/env.sh b/hdfs/env.sh new file mode 100644 index 0000000..c5f6851 --- /dev/null +++ b/hdfs/env.sh @@ -0,0 +1,2 @@ +HADOOP_HOME=/mnt/extra/ucare-research/hdfs/source/hadoop-dist/target/hadoop-2.7.1 +JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ From 55228e10d75f67637159ec9a78e7b7fb69ef5fbf Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 18:35:04 +0700 Subject: [PATCH 24/50] add env --- hdfs/env.sh | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 hdfs/env.sh diff --git a/hdfs/env.sh b/hdfs/env.sh old mode 100644 new mode 100755 index c5f6851..28f5fce --- a/hdfs/env.sh +++ b/hdfs/env.sh @@ -1,2 +1,3 @@ HADOOP_HOME=/mnt/extra/ucare-research/hdfs/source/hadoop-dist/target/hadoop-2.7.1 +HADOOP_CONF_DIR=/mnt/extra/ucare-research/hdfs/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ From c95712e02749d0cb9658bb0fda4af8dc16a2b010 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sat, 6 Jul 2019 23:58:14 +0700 Subject: [PATCH 25/50] fix for --- hdfs/run-hadoop.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 49655eb..482b999 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -25,15 +25,15 @@ run_datanode() { export HADOOP_LOG_DIR=$DN_DIR_PREFIX$DN/logs export HADOOP_PID_DIR=$HADOOP_LOG_DIR DN_CONF_OPTS="\ --Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN-Ddfs.datanode.address=0.0.0.0:5001$DN \ --Ddfs.datanode.http.address=0.0.0.0:5008$DN \ --Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" + -Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN-Ddfs.datanode.address=0.0.0.0:5001$DN \ + -Ddfs.datanode.http.address=0.0.0.0:5008$DN \ + -Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } cmd=$1 -shift +# shift -for i in $*; do +for ((i = 1; i <= $2; i++)); do run_datanode $cmd $i done From 85415e1e32692f8eaf4bd9b31d9b6eebfaaae825 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 00:04:25 +0700 Subject: [PATCH 26/50] fix spacing --- hdfs/run-hadoop.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 482b999..f4ab5ca 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -25,7 +25,8 @@ run_datanode() { export HADOOP_LOG_DIR=$DN_DIR_PREFIX$DN/logs export HADOOP_PID_DIR=$HADOOP_LOG_DIR DN_CONF_OPTS="\ - -Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN-Ddfs.datanode.address=0.0.0.0:5001$DN \ + -Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN \ + -Ddfs.datanode.address=0.0.0.0:5001$DN \ -Ddfs.datanode.http.address=0.0.0.0:5008$DN \ -Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS From 08680ec3f7397c062fdba1309229684b75d11f4e Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 01:11:43 +0700 Subject: [PATCH 27/50] [FEATS] add memory reader for hdfs --- hdfs/README.md | 0 hdfs/source | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 hdfs/README.md diff --git a/hdfs/README.md b/hdfs/README.md new file mode 100644 index 0000000..e69de29 diff --git a/hdfs/source b/hdfs/source index 8d99895..c669e99 160000 --- a/hdfs/source +++ b/hdfs/source @@ -1 +1 @@ -Subproject commit 8d9989544b1cf774a2557a6054da0feb5afc4875 +Subproject commit c669e9960f3641ba0632bca99a6924c427738292 From 7840577445e8d5a638919e27a0c083ee6b3aa960 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 01:13:46 +0700 Subject: [PATCH 28/50] [FEATS] add memory reader for hdfs --- hdfs/run-hadoop.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index f4ab5ca..ef5fdb5 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -1,6 +1,6 @@ # Taken from https://bigdata.wordpress.com/2010/05/27/hadoop-cookbook-4-how-to-run-multiple-data-nodes-on-one-machine/ -#!/bin/sh +#!/bin/bash # This is used for starting multiple datanodes on the same machine. # run it from hadoop-dir/ just like 'bin/hadoop' @@ -35,6 +35,10 @@ run_datanode() { cmd=$1 # shift +$HADOOP_HOME/sbin/start-dfs.sh + +sleep 2 + for ((i = 1; i <= $2; i++)); do run_datanode $cmd $i done From 81dd018a486dfe71aceae790cfe150b5fe0c3b0e Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 01:41:55 +0700 Subject: [PATCH 29/50] [FEATS] add memory reader for hdfs --- hdfs/source | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/source b/hdfs/source index c669e99..1d3bb09 160000 --- a/hdfs/source +++ b/hdfs/source @@ -1 +1 @@ -Subproject commit c669e9960f3641ba0632bca99a6924c427738292 +Subproject commit 1d3bb098dba36eeae512c8584e48fc7fbe0cc2b2 From 08a369747b9c53c56a8419772b485c06210df859 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 02:26:23 +0700 Subject: [PATCH 30/50] add config --- hdfs/conf/core-site.xml | 6 ++++++ hdfs/conf/hdfs-site.xml | 6 ++++++ hdfs/run-hadoop.sh | 12 ++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 hdfs/conf/core-site.xml create mode 100644 hdfs/conf/hdfs-site.xml diff --git a/hdfs/conf/core-site.xml b/hdfs/conf/core-site.xml new file mode 100644 index 0000000..e88f92a --- /dev/null +++ b/hdfs/conf/core-site.xml @@ -0,0 +1,6 @@ + + + fs.defaultFS + hdfs://localhost:9000 + + \ No newline at end of file diff --git a/hdfs/conf/hdfs-site.xml b/hdfs/conf/hdfs-site.xml new file mode 100644 index 0000000..9133e39 --- /dev/null +++ b/hdfs/conf/hdfs-site.xml @@ -0,0 +1,6 @@ + + + dfs.replication + 1 + + \ No newline at end of file diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index ef5fdb5..ccfa5c2 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -11,6 +11,7 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" +JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" DN_DIR_PREFIX="/tmp/dn_temp/" if [ -z $DN_DIR_PREFIX ]; then @@ -32,11 +33,18 @@ run_datanode() { $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } -cmd=$1 -# shift +echo "Moving conf file" +mv "$HADOOP_HOME/etc/hadoop/core-site.xml" "$HADOOP_HOME/etc/hadoop/core-site.bak.xml" +cp "$DIR/conf/core-site.xml" "$HADOOP_HOME/etc/hadoop" + +mv "$HADOOP_HOME/etc/hadoop/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop/hdfs-site.bak.xml" +cp "$DIR/conf/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop" $HADOOP_HOME/sbin/start-dfs.sh +cmd=$1 +# shift + sleep 2 for ((i = 1; i <= $2; i++)); do From 65cb4021afc135fbcbc01c5b72772a019c15241a Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 13:48:50 +0700 Subject: [PATCH 31/50] add custom log dir and cassandra --- cassandra/Visualization.ipynb | 472 +++++++++++++++++++++++++++++++++ cassandra/data.csv | 51 ++++ cassandra/data2_after_heap.csv | 20 ++ cassandra/deploy.py | 161 +++++++++++ cassandra/log.txt | 162 +++++++++++ cassandra/plot.png | Bin 0 -> 26682 bytes cassandra/plot2.png | Bin 0 -> 28021 bytes cassandra/reader.py | 47 ++++ hdfs/run-hadoop.sh | 10 +- 9 files changed, 920 insertions(+), 3 deletions(-) create mode 100644 cassandra/Visualization.ipynb create mode 100644 cassandra/data.csv create mode 100644 cassandra/data2_after_heap.csv create mode 100644 cassandra/deploy.py create mode 100644 cassandra/log.txt create mode 100644 cassandra/plot.png create mode 100644 cassandra/plot2.png create mode 100644 cassandra/reader.py diff --git a/cassandra/Visualization.ipynb b/cassandra/Visualization.ipynb new file mode 100644 index 0000000..b38a429 --- /dev/null +++ b/cassandra/Visualization.ipynb @@ -0,0 +1,472 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "# This line configures matplotlib to show figures embedded in the notebook, \n", + "# instead of poping up a new window. More about that later. \n", + "%pylab inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from pylab import *\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from scipy.interpolate import interp1d\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('./data.csv')\n", + "df = df.set_index('nodes')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
memory
nodes
11
22
33
44
55
\n", + "
" + ], + "text/plain": [ + " memory\n", + "nodes \n", + "1 1\n", + "2 2\n", + "3 3\n", + "4 4\n", + "5 5" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n", + " 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,\n", + " 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50],\n", + " dtype='int64', name='nodes')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.index" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Memory (MB)')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = df.plot.line()\n", + "ax.set_title('Before interpolation')\n", + "ax.set_xlabel(\"Nodes\")\n", + "ax.set_ylabel(\"Memory (MB)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "f = interp1d(df.index, df['memory'], kind='cubic')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "df_int = pd.DataFrame()\n", + "new_index = np.arange(1,50)\n", + "df_int['memory'] = f(new_index)\n", + "df_int.index = new_index" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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q1Yt3nrrLQCefvrpdaN5G3PmmWfSq1evjIzegQVPkiRJUjl33XXXsWrVKg499FAaN27Mddddt0WvHzJkCP379+fQQw/lww8/5Prrr9/kuqeddhr5+fn06tVrW2NvVFjbUkuyFi1axA8++CDpGCpH8vLyNnoSsFSSedyqtPLYVWnkcVs0n376KQcddFDSMUqU559/nhdffJGnn356k+ts7HMLIUyMMbbY3PY9B0+SJEmSisEll1zCmDFjeOWVVzK2DwueJEmSJBWDBx98cKteN2LEiCKv6zl4kiRJklSCbez+gJtiwZMkSZKUMaXhmh8lyfqf17hx41i0aBFVq1Yt8usteJIkSZIyokqVKsybN8+SV0QxRubNm0eVKlX46KOP6NKlC7///e+3aBuegydJkiQpI/bYYw9mzpzJjz/+mHSUUqNKlSrsvPPOdOzYkdq1azNw4MAter0FT5IkSVJGZGVl0ahRo6RjlDp9+vTh888/Z/z48dSpU2eLXusUTUmSJEkqIYYPH87jjz/OVVddxbHHHrvFr7fgSZIkSVIJ0apVKy6++GJuuummrXq9UzQlSZIkKWEFBQWEEGjQoMFW3y8PHMGTJEmSpMTdcMMNdOnShZUrV27Tdix4kiRJkpSg119/nUGDBlGvXj2ys7O3aVsWPEmSJElKyNy5czn99NPZf//9uf/++7d5e56DJ0mSJEkJiDFyzjnnMG/ePF555RV22GGHbd6mI3iSJEmSlICZM2cyadIk7rrrLpo1a7ZdtukIniRJkiQlYM8992TKlCnstNNO222bjuBJkiRJUjFasmQJd999N6tWraJWrVqEELbbti14kiRJklSM+vbtS//+/Zk4ceJ237YFT5IkSZKKSW5uLk888QQDBgygVatW2337FjxJkiRJKgZfffUVF1xwAUceeSQ33nhjRvZhwZMkSZKkDIsxcvbZZxNC4Nlnn6VSpcxc79KraEqSJElShoUQuPfee5kzZw4NGzbM2H4seJIkSZKUQfPmzaN27docfvjhGd+XUzQlSZIkKUN+/PFHGjduzK233los+7PgSZIkSVIGrD3vLj8/n86dOxfLPp2iKUmSJEkZMHjwYF555RUefPBBmjZtWiz7dARPkiRJkraz/Px8BgwYwNFHH81FF11UbPu14EmSJEnSdvbxxx+zZs0aHnjgAUIIxbZfp2hKkiRJ0nbWunVrvv32W6pVq1as+3UET5IkSZK2kxgjY8aMYc2aNcVe7sCCJ0mSJEnbzahRo+jUqRNDhw5NZP8WPEmSJEnaDpYvX87ll1/OwQcfTI8ePRLJ4Dl4kiRJkrQd3HvvvUyfPp3x48eTlZWVSAZH8CRJkiRpG3333XfceuutdOvWjfbt2yeWw4InSZIkSdto1qxZNGzYkLvvvjvRHE7RlCRJkqRtdMQRR/DJJ58U6z3vNsYRPEmSJEnaSmvWrOGPf/wjS5cuTbzcgQVPkiRJkrbaU089xUUXXcTo0aOTjgJY8CRJkiRpqyxYsICrr76aX/7yl4ndFmFDnoMnSZIkSVth4MCB/Pjjj7zyyislYnomZHgEL4SwUwjh+RDCZyGET0MIR4YQdg4hjA8hfJH+s1YmM0iSJEnS9vbZZ5/xwAMPcO6559K8efOk46yT6Sma9wNjY4wHAk2BT4GrgNdijPsBr6UfS5IkSVKp0qFDBwYNGpR0jJ/J2BTNEMKOwDHA2QAxxpXAyhDCiUCb9GpDgDzgykzlkCRJkqTt7cADD+Sll15KOsb/yOQI3t7Aj8CTIYTJIYTBIYQdgLoxxtkA6T93zWAGSZIkSdpuVqxYwRVXXMGsWbOSjrJRmbzISiXgcOCSGON7IYT72YLpmCGE84HzAerWrUteXl5GQkobs3jxYo85lToetyqtPHZVGnncll9Dhw7l0UcfZdddd6Vly5ZJx/kfIcaYmQ2HsBswIcbYMP34aFIFb1+gTYxxdgihHpAXYzygsG21aNEifvDBBxnJKW1MXl4ebdq0STqGtEU8blVaeeyqNPK4LZ9mz57N/vvvT5s2bYr9vnchhIkxxhabWy9jUzRjjHOAb0MIa8vbscC/gVHAWennzgJezFQGSZIkSdperr76alauXMm9996bdJRNyvR98C4BngkhZAPTgXNIlcrhIYTzgG+AUzOcQZIkSZK2yXvvvceQIUO48sor2XfffZOOs0kZLXgxxg+BjQ0jHpvJ/UqSJEnS9tSgQQMuueQSrrnmmqSjFCrTI3iSJEmSVOrVq1ePBx54IOkYm5XpG51LkiRJUqm1aNEiunfvzpQpU5KOUiQWPEmSJEnahFtuuYWRI0eydOnSpKMUiQVPkiRJkjbiiy++4N577+Xss88ukfe82xgLniRJkiRtxOWXX06VKlW47bbbko5SZF5kRZIkSZI2MH78eF566SX+8Ic/sNtuuyUdp8gcwZMkSZIkUhdUGTNmDABHHXUU99xzD/369Us41ZZxBE+SJElSubVs2TJefvllhg0bxksvvcTy5cv55ptv2HPPPbnsssuSjrfFLHiSJEmSyqVx48bRvXt3Fi9ezK677kqfPn3Iycmhfv36SUfbahY8SZIkSWXe6tWrycvLY9iwYbRr145evXrRtGlTevbsSa9evWjdujWVKpX+elT634EkSZIkbcI///lPhg4dynPPPccPP/xA9erV2X///QGoW7cugwcPTjjh9mXBkyRJklSmzJgxg4YNGwLQr18/pk6dSpcuXcjJyaFjx45UrVo12YAZZMGTJEmSVCbMnz+fvn37rhutq1GjBn/961+pX78+NWrUSDpesbDgSZIkSSr1/v73v3POOecwe/Zsrr76aipWrAjAgQcemHCy4mXBkyRJklRqrVmzhksvvZQHH3yQ/fffn3feeYeWLVsmHSsx3uhckiRJUqlVoUIFli5dSt++fZk8eXK5LnfgCJ4kSZKkUmbVqlXccsstnHTSSTRr1oxHH32UChUcuwILniRJkqRS5N///jdnnHEGkyZNokKFCjRr1sxytx4/CUmSJEkl3po1a7jnnns4/PDD+eabbxg5ciQ33HBD0rFKHAueJEmSpBLv8ccf53e/+x2//vWvmTJlCieddFLSkUokp2hKkiRJKpFijMyaNYv69etz1llnsfPOO3PyyScTQkg6WonlCJ4kSZKkEmfOnDl07dqVX/ziFyxYsIDs7Gy6d+9uudsMC54kSZKkEmXEiBE0btyYv//971xxxRXUqFEj6UilhgVPkiRJUomwbNkyzjjjDE455RQaNmzIpEmTuPTSS71K5hbwk5IkSZJUIlSpUoX8/HxuuOEG3n33XQ466KCkI5U6XmRFkiRJUmKWLl3KddddR79+/WjQoAGjRo1yxG4b+MlJkiRJSsSECRNo1qwZ99xzD2PHjgWw3G0jPz1JkiRJxWrlypVcd911HHXUUaxYsYLXX3+d888/P+lYZYIFT5IkSVKxGjRoELfccgtnnXUWH3/8MW3btk06UpnhOXiSJEmSMq6goIAff/yR3Xbbjcsuu4wjjjiCE044IelYZY4jeJIkSZIyavr06bRp04bjjz+elStXUrNmTctdhljwJEmSJGVEjJHHHnuMQw89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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax2 = df_int.plot.line(figsize=(15,8), style='k--', grid=True)\n", + "ax2.set_title('Cassandra JVM Memory Usage')\n", + "ax2.set_xlabel(\"Nodes\")\n", + "ax2.set_ylabel(\"Memory (MB)\")\n", + "plt.savefig('plot.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df_after = pd.read_csv('./data2_after_heap.csv')\n", + "df_after = df_after.set_index('nodes')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
memory
nodes
55
1010
1516
2035
2543
\n", + "
" + ], + "text/plain": [ + " memory\n", + "nodes \n", + "5 5\n", + "10 10\n", + "15 16\n", + "20 35\n", + "25 43" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_after.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Int64Index([5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85,\n", + " 90, 100],\n", + " dtype='int64', name='nodes')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_after.index" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Memory (MB)')" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEWCAYAAABxMXBSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd4VVXWx/HvovfeSwi9N4mA4giKfUSxDTIoqOMwOnadeXUcx94bOujYBbuOYkFFURQBCyC9dwMEMJRAqIGU9f5xT5wYQ0ggNyfl93me++SefU9Z9+Yk656999nb3B0REZG8KhN2ACIiUrwocYiISL4ocYiISL4ocYiISL4ocYiISL4ocYiISL4ocUixYmZXmlmime02s7pRPtatZvZiNI9RUMzsTjN7/Qi2X2xmAwowJCnBTPdxSGEys3igIZAOpALfA1e4+/o8bFse2An0dff50Ywzv8zsTqCNu19U1I9vZmOBBHe/LdpxScmkKw4JwyB3rwY0BhKB0XncriFQCVic3wNaRJE9382sXNgxiORVkf1DkpLP3VOA94BOmWVmVtHMHjWzdUGV1LNmVtnM2gHLg9V2mNnXwfrHmtmPZpYc/Dw2y76+MbP7zOw7YC/QysxqmtlLZrbJzDaY2b1mVjan+LJW/5hZrJm5mY0IYttqZv8MXjsNuBUYElShzQ/KD3osM7vEzL4zs1FmlgTcmaVsdPB+lpnZwCzxNDGz8WaWZGarzOzPB/tszexdM/s52M9UM+sclI8EhgH/F8T6cVAeb2YnZfkdPGFmG4PHE2ZWMXhtgJklmNlNZrY5eG+X5vFXLiWEEoeExsyqAEOA6VmKHwLaAT2ANkBT4HZ3XwF0Dtap5e4nmlkd4FPg30Bd4HHg02xtHxcDI4HqwFrgFSAt2HdP4BTg8nyEfRzQHhgI3G5mHd39c+B+4B13r+bu3YN1D3WsPsAaoAFwX7ayesAdwPvB+wR4C0gAmgDnA/dnTSzZfAa0DfY9B3gDwN2fD54/HMQ6KIdt/wn0JfI76A70BrJWazUCahL53fwJeNrMah8kDimJ3F0PPQrtAcQDu4EdRP6pbgS6Bq8ZsAdonWX9Y4CfguexgAPlguWLgZnZ9v8DcEnw/Bvg7iyvNQT2A5WzlA0FJh8k1juB17Mdu1mW12cCF2ZfNy/HAi4B1mU73iXB52HZjnEx0JxIu1D1LK89AIzN6fjZ9lsriL1msDwWuDeH38tJwfPVwBlZXjsViA+eDwD2Zf4OgrLNRNqdQj+/9Cich+pVJQyD3X1SUG1zNjDFzDoBGUAVYLaZZa5rQI5VSUS+ea/NVraWyDfhTFkb3VsA5YFNWfZfJts6h/Jzlud7gWoHWS8vx8rpuBs8+G8cWEvkfTYBktx9V7bX4rLvIPhc7wMuAOoT+VwhchWTfJB4s8r+uWbGkGmbu6dlWc7tc5ASSFVVEhp3T3f394l8kz4O2Erk22xnd68VPGp6pCE9JxuJ/IPOKgbYkPUwWZ6vJ3IVUC/L/mu4e2eOXPbuiXk5Vk5dGptalkxD5P1sDB51zKx6tteyvtdMfySSkE8iUqUUG5Rn7vdQXSmzf66ZMYgAShwSoqCn09lAbWCpu2cALwCjzKxBsE5TMzv1ILuYALQzsz+aWTkzG0Kkof2TnFZ2903AF8BjZlbDzMqYWWsz618AbycRiM3suXUEx2oAXGtm5c3sAqAjMMEj3ZW/Bx4ws0pm1o1I+8IbOeyjOpGktY3IFdz9OcTaKpcY3gJuM7P6ZlYPuB047HtEpORR4pAwfGxmu4nck3EfMMLdM7vY3gysAqab2U5gEpHG6N9w923AmcBNRP5J/h9wprtvzeXYw4EKwBJgO5FeXY2P+B3Bu8HPbWY25wiONYNIo/ZWIp/N+cH7hEgbSSyRb/8fAHe4+5c57ONVItVLG4JjT8/2+ktAJzPbYWYf5rD9vcAsYAGwkEjj+r2HiFtKEd0AKFJEmNklwOXuflzYsYjkRlccIiKSL0ocIiKSL6qqEhGRfNEVh4iI5EuxvgGwXr16HhsbG3YYIiLFyuzZs7e6e/3D3b5YJ47Y2FhmzZoVdhgiIsWKmWUfcSFfVFUlIiL5osQhIiL5osQhIiL5ErU2DjNrTmTog0ZERud83t2fDOYWeIfI0AnxwB/cfXswsNuTwBlERtu8xN3n5LTv3KSmppKQkEBKSkrBvJFSoFKlSjRr1ozy5cuHHYqIFAPRbBxPA25y9znBiJ6zzexLInMOfOXuD5rZLcAtRMYnOp3IGD1tiUxm80zwM18SEhKoXr06sbGx/HqQUcmJu7Nt2zYSEhJo2bJl2OGISDEQtaoqd9+UecUQzCGwlMg8CWcTmRmN4Ofg4PnZwKseMR2oZWb5HnwuJSWFunXrKmnkkZlRt25dXaGJSJ4VShuHmcUSmTpzBtAwGHI6c+jpBsFqTfn1xDYJ/HpCnsx9jTSzWWY2a8uWLQc7XoHFXhro8xKR/Ih64jCzasA44Hp335nbqjmU/WY8FHd/3t3j3D2ufv3Dvn9FRKRU+n51brMO5E1UbwA0s/JEksYbwUxvAIlm1tjdNwVVUZuD8gQi8ypnaoZmHRMRKRDJe1O5b8IS/jsr4Yj3FbUrjqCX1EtEZnZ7PMtL44ERwfMRwEdZyocHs8L1BZIzq7Tk8KSlpR16JREp0dydTxdsYuDjUxg3ZwN/6Z/b5I95E82qqn7AxcCJZjYveJwBPAicbGYrgZODZYhMA7qGyOxvLwB/jWJsURUfH0+HDh24/PLL6dKlC8OGDWPSpEn069ePtm3bMnPmTPbs2cNll13G0UcfTc+ePfnoo0j+HDt2LIMHD2bQoEG0bNmSp556iscff5yePXvSt29fkpKSAJg3bx59+/alW7dunHPOOWzfvh2AAQMGcOutt9K/f3/uu+8+WrZsSWpqKgA7d+4kNjb2l2URKdk2Je/jz6/O5qo359CoZkU+uqof/zi94xHvN2pVVe7+LTm3WwAMzGF9B64qyBju+ngxSzbm1qySf52a1OCOQZ0Pud6qVat49913ef755zn66KN58803+fbbbxk/fjz3338/nTp14sQTT+Tll19mx44d9O7dm5NOOgmARYsWMXfuXFJSUmjTpg0PPfQQc+fO5YYbbuDVV1/l+uuvZ/jw4YwePZr+/ftz++23c9ddd/HEE08AsGPHDqZMmQJEktinn37K4MGDefvttznvvPN0v4ZICZeR4bwxYy0Pfb6ctIwM/nlGRy7tF0u5sgVzrVCsBzksylq2bEnXrl0B6Ny5MwMHDsTM6Nq1K/Hx8SQkJDB+/HgeffRRINKNeN26dQCccMIJVK9enerVq1OzZk0GDRoEQNeuXVmwYAHJycns2LGD/v37AzBixAguuOCCX449ZMiQX55ffvnlPPzwwwwePJgxY8bwwgsvFMr7F5FwrEzcxS3vL2T22u38rm097hvclZi6VQr0GCU6ceTlyiBaKlas+MvzMmXK/LJcpkwZ0tLSKFu2LOPGjaN9+/a/2m7GjBmH3PZQqlat+svzfv36ER8fz5QpU0hPT6dLly5H9L5EpGjan5bOM9+s5unJq6hasRyPXdCdc49qGpXu9hqrKiSnnnoqo0ePJnMGxrlz5+Z525o1a1K7dm2mTZsGwGuvvfbL1UdOhg8fztChQ7n00kuPLGgRKZJmr03izH9/yxOTVnJ6l8ZMurE/5/VqFrV7tEr0FUdR9q9//Yvrr7+ebt264e7ExsbyySef5Hn7V155hSuuuIK9e/fSqlUrxowZc9B1hw0bxm233cbQoUMLInQRKSJ2paTyyMTlvDZ9LY1rVGLMJUdzQocGh97wCBXrOcfj4uI8+0ROS5cupWPHI+81UJK89957fPTRR7z22msHXUefm0jxMmlJIv/6aBE/70xhxDGx/O3U9lSrmLdrATOb7e5xh3tsXXGUcNdccw2fffYZEyZMCDsUESkAW3bt586PF/Ppgk20b1id/ww7ip4xtQs1BiWOEm706NFhhyAiBcDdeXdWAvdNWMq+A+ncdHI7/tK/NRXKFX5TdYlMHO6ugfvyoThXV4qUBvFb93DrBwv5fvU2esfW4f5zu9KmQbXQ4ilxiaNSpUps27ZNQ6vnUeZ8HJUqVQo7FBHJJi09gxe//YlRX66gQtky3HdOF4YeHUOZMuH+bytxiaNZs2YkJCRwsCHX5bcyZwAUkaJjYUIyN49bwJJNOzm1c0PuOqsLjWoWjS94JS5xlC9fXjPZiUixte9AOqMmreDFaWuoV60iz150FKd1yfecdlFV4hKHiEhxNW3lFm79YCHrk/YxtHcMt5zegZqVi97YckocIiIh277nAPd+upRxcxJoVa8qb4/sS99WdcMO66CUOEREQuLujJ+/kbs/XkLyvlSuPqENV5/Yhkrly4YdWq6UOEREQrBhxz5u+2Ahk5dvoXvzWrx+blc6Nq4Rdlh5osQhIlKI0jOcV3+I55GJywG4/cxOjDg2lrIhd7HNDyUOEZFCsvznXdw8bgHz1u+gf7v63Du4C83rFOxcGYUhaonDzF4GzgQ2u3uXoOwdIHMCilrADnfvYWaxwFJgefDadHe/IlqxiYgUppTUdJ6evIpnvllNjcrlefLCHpzVvUmxvUk5mlccY4GngFczC9z9l6npzOwxIDnL+qvdvUcU4xERKXSTl23m7k+W8NPWPZzbsym3ndmJOlUrhB3WEYnmnONTgyuJ37BImv0DcGK0ji8iEqbVW3ZzzydL+Gb5FlrVq8qrl/Xm+Hb1ww6rQITVxvE7INHdV2Ypa2lmc4GdwG3uPi2nDc1sJDASICYmJuqBiojkx86UVEZ/tZIx38VTuXxZ/nlGR0YcGxvKKLbRElbiGAq8lWV5ExDj7tvMrBfwoZl1dved2Td09+eB5yEykVOhRCsicggZGc57sxN4eOIytu05wB96Nedvp7anfvWKYYdW4Ao9cZhZOeBcoFdmmbvvB/YHz2eb2WqgHTArx52IiBQhs9cmcef4JSzckEyvFrUZc0lvujarGXZYURPGFcdJwDJ3T8gsMLP6QJK7p5tZK6AtsCaE2ERE8uzn5BQe/GwpH87bSMMaFXliSA/O7lF8e0vlVTS7474FDADqmVkCcIe7vwRcyK+rqQCOB+42szQgHbjC3ZOiFZuIyJFISU3nxWlreHryatLdufqENlw5oDVV8zjnd3EXzV5VQw9SfkkOZeOAcdGKRUSkILg7Excnct+EJaxP2sepnRvyzzM6EVO3+N3EdyRKR3oUETlCKxJ3cdfHi/lu1TbaNazGG5f3oV+bemGHFQolDhGRXCTvTWXUpBW8Nn0t1SqW466zOjOsTwzlypac7rX5pcQhIpKD9AznrZnreOyL5STvS+WPfWK48eT2xf6u74KgxCEiks30Ndu4c/xilv28iz4t63DHoM50alI8hjwvDEocIiKBhO17eWDCMj5duImmtSrzn2FHcXqXRiW+e21+KXGISKm370A6z0xZzXNTVmMGN5zUjr/0b1XkZ+ILixKHiJRa7s4nCzbxwISlbExO4cxujfnHGR1pWqty2KEVaUocIlIqLdqQzN0fL2FmfBKdGtfgiQt70rtlnbDDKhaUOESkVNm2ez+PfrGCt39cR+0qFbj/nK4MObp5sZq6NWxKHCJSKqSmZ/DaD2t5YtIK9h5I59JjW3LdwLbUrFI+7NCKHSUOESnxpq7Ywt2fLGHV5t38rm097hjUiTYNqocdVrGlxCEiJdbabXu455OlTFqaSIu6VXhheBwndWyg7rVHSIlDREqcfQfSGf31Sl6c9hPlyxo3n9aBy46LpWI5da8tCEocIlKifLtyK7d+sJB1SXs596im3HxaBxrWqBR2WCWKEoeIlAjb9xzg3k+XMm5OAi3rVeXtkX3p26pu2GGVSEocIlKsuTsfL9jEXeMXk7wvlatOaM01J7bVXd9RFLVxgc3sZTPbbGaLspTdaWYbzGxe8Dgjy2v/MLNVZrbczE6NVlwiUnJs2LGPy8b+yLVvzaVZ7cp8fM1x/P3UDkoaURbNK46xwFPAq9nKR7n7o1kLzKwTkSllOwNNgElm1s7d06MYn4gUU+kZzms/xPPwxOUA/OvMTlxybKxu4isk0Zw6dqqZxeZx9bOBt919P/CTma0CegM/RCk8ESmmlv+8i5vHLWDe+h30b1efewd3oXmd0jV1a9jCaOO42syGA7OAm9x9O9AUmJ5lnYSg7DfMbCQwEiAmJibKoYpIUZGSms5/Jq/imSmrqV6pPE9e2IOzujfRPRkhKOy5D58BWgM9gE3AY0F5Tr95z2kH7v68u8e5e1z9+vWjE6WIFCkzf0rijH9P499fr2JQtyZMurE/Z/doqqQRkkK94nD3xMznZvYC8EmwmAA0z7JqM2BjIYYmIkXQzpRUHvpsGW/MWEez2pV59bLeHN9OXxjDVqiJw8wau/umYPEcILPH1XjgTTN7nEjjeFtgZmHGJiJFy8TFP3P7R4vYsms/f/5dS244uR1VKugOgqIgar8FM3sLGADUM7ME4A5ggJn1IFINFQ/8BcDdF5vZf4ElQBpwlXpUiZROiTtTuHP8Yj5b9DMdG9fgheFxdGtWK+ywJAtzz7EpoViIi4vzWbNmhR2GiBSA5L2pPDt1NWO/iyfDnetPasflv2tJ+bKF3RRb8pnZbHePO9ztdd0nIqHasz+NMd/9xHNT17B7fxpnd2/CDSe3o0XdqmGHJgehxCEioUhJTefNGet4evIqtu05wMmdGnLTKe3o0KhG2KHJIShxiEihSkvPYNycBJ6ctJKNySn0a1OXv53Snp4xtcMOTfJIiUNECkVGhvPpwk2M+nIFa7buoUfzWjxyQXf6takXdmiST0ocIhJV7s7k5Zt5ZOIKlm7aSfuG1TUTXzGnxCEiUfPD6m08MnEZc9btoEXdKjx5YQ8GdWtCGQ1GWKwpcYhIgZu/fgePfrGcaSu30qhGJe4/pysXxDVT19oSQolDRArMisRdPPbFciYuTqRO1Qrc9vuOXNS3hebHKGGUOETkiK3btpcnJq3gg3kbqFahHDee3I7LjmtJtYr6F1MS6bcqIoctcWcKo79eydsz11O2jDHyd624on9raletEHZoEkVKHCKSb0l7DvDslNW88n086RnO0N4xXH1iGxrWqBR2aFIIlDhEJM92paTy0rc/8eK0n9hzII1zejbl+oHtiKmrGfhKEyUOETmklNR0XvthLf/5ZhXb96ZyWudG3HhKO9o1rB52aBKCXBOHmR0DXAT8DmgM7CMyh8anwOvunhz1CEUkNKnpGbzz43pGf72SxJ37Ob5dff52SjsNc17KHTRxmNlnRGbh+wi4D9gMVALaAScAH5nZ4+4+vjACFZHCk57hjJ+/gVFfrmRd0l7iWtTmyQt70rdV3bBDkyIgtyuOi919a7ay3cCc4PGYmWmQGZESxN35Ykkij32xnBWJu+nUuAZjLjmaAe3ra3gQ+cVBE0cOSYMgUWzzYPannNYRkeLH3fluVWR4kPkJybSqV5Wn/tiTM7o01vAg8hu5VVX1BR4EkoB7gNeAekAZMxvu7p/ntmMzexk4E9js7l2CskeAQcABYDVwqbvvMLNYYCmwPNh8urtfcQTvS0Ty6OfkFP7+3nymrdxKk5qVePi8bpx7VFPKaXgQOYjcqqqeAm4FagJfA6e7+3Qz6wC8BeSaOICxwT5ezVL2JfAPd08zs4eAfwA3B6+tdvce+X8LInK4pq7Ywg3vzGNfajq3n9mJYX1jqFhOw4NI7nJLHOXc/QsAM7vb3acDuPuyvNR1uvvU4Eoia9kXWRanA+fnN2AROXLpGc6Tk1YwevIq2jaoxn+G9aJNg2phhyXFRG6JIyPL833ZXvMCOPZlwDtZllua2VxgJ3Cbu0/LaSMzGwmMBIiJiSmAMERKl827UrjurXn8sGYb5/dqxj1nd6FyBV1lSN7llji6m9lOwIDKwXOC5SMaV8DM/gmkAW8ERZuAGHffZma9gA/NrLO778y+rbs/DzwPEBcXVxAJTKTU+H71Vq57ex67UlJ5+Pxu/CGuedghSTGUW6+qqHwFMbMRRBrNB2bpnbUf2B88n21mq4ncLzIrGjGIlDYZGc7Tk1cxatIKYutV5fU/9aF9I931LYcnt15VdXLb0N2T8nswMzuNSGN4f3ffm6W8PpDk7ulm1gpoC6zJ7/5F5Le27d7P9e/MY9rKrZzdown3n9OVqhruXI5AbmfPViCBSJUSRKqoMjnQKrcdm9lbwACgnpklAHcQ6UVVEfgyaGDP7HZ7PHC3maUB6cAVh5OYROTXfoxP4po355K09wD3n9OVob2b60Y+OWK5JY7RRP7xf0ek++23mVVLeeHuQ3Mofukg644DxuV13yKSu4wM5/lpa3hk4nKa167M+1ceS5emNcMOS0qI3No4rrPIV5MBwMXAaDP7AnjG3X8qpPhEJJ+27znATe/O5+tlmzmjayMePK8bNSqVDzssKUFyregMrjAmB91kLyRyB/lK4IVCiE1E8mnOuu1c8+ZcNu9K4a6zOjP8mBaqmpICl1vjeFXgbGAIUB94HzjK3dcXUmwikkfuzsvfxfPAhKU0qlmJcVceq6HPJWpyu+LYTOTq4i1gFZEG8aPN7GgAd38/+uGJyKEk70vl/96bz8TFiZzcqSGPnt+dmlVUNSXRk1vieJdIsugQPLJyIlcgIhKSjAxn2qqt3PbhQjbtSOG233fkT8e1VNWURF1ujeOXFGIcIpJHSXsO8N7s9bw5Yx3x2/bSpGYl3vnLMfRqUTvs0KSUyK2N4yLgTXfPOMjrrYHG7v5ttIITkQh3Z9ba7bwxfS0TFv7MgfQMesfW4YaT23Fal0Ya0VYKVW5VVXWBuWY2G5gNbCEyRlUboD+RGwRviXqEIqXYzpRUPpy7gTemr2N54i6qVyzH0N7NGda3Be0aasgQCUduVVVPmtlTwIlAP6AbkVFylxKZVnZd4YQoUvosTEjmjRlr+WjeRvalptOtWU0eOq8rg7o3oUoFDRci4TrUfRzpRCZf+rJwwhEpvfYeSOOT+Zt4Y8Za5ickU7l8Wc7u0YQ/9olR11opUvTVRSRkKxJ38eaMdYybk8CulDTaNazGXWd1ZnDPptSsrG61UvQocYiEICPD+WThJl7/YS0z45OoULYMZ3RtxLC+LYhrUVtdaqVIO2TiMLOyQZWViBSApD0HuPG/8/hm+RZa1K3CP07vwPm9mlG3WsWwQxPJk7xccawys/eAMe6+JNoBiZRks9cmcfWbc9m2+wB3n92Zi/q0oEwZXV1I8VImD+t0A1YAL5rZdDMbaWY1ohyXSIni7rwwdQ1DnptOubLGuCuPZfgxsUoaUiwd8orD3XcRGQ33BTM7nsjYVaOCq5B73H1VlGMUKdaS96Zy07vzmbQ0kVM7N+Th87ur0VuKtUNecZhZWTM7y8w+AJ4EHiMy+9/HwIRDbPuymW02s0VZyuqY2ZdmtjL4WTsoNzP7t5mtMrMFZnbUEb0zkSJg/vod/H70NL5Zvpl/ndmJZy/qpaQhxV5eqqpWEhle/RF37+nuj7t7oru/B3x+iG3HAqdlK7sF+Mrd2wJf8b+7z08nMtd4W2Ak8Eze3oJI0ePujPnuJ85/9nvc4d0rjtEAhFJi5FpVZWZlgbHufndOr7v7tblt7+5TzSw2W/HZRGYVBHgF+Aa4OSh/NZg8arqZ1TKzxu6+6RDvQaRI2ZmSys3vLeCzRT8zsEMDHvtDd2pVqRB2WCIF5pB3jpvZCUCOieMwNcxMBu6+ycwaBOVNgayTRCUEZUocUmws2pDMVW/OIWH7Pv5xegf+/LtWagCXEicv3XG/D8asegfYk1no7nMKOJac/rr8NyuZjSRSlUVMTEwBhyByeNydN2as4+5PllCnSgXeGdmXuNg6YYclEhV5SRzHBj+zXnU4kcEPD0diZhWUmTUmMtMgRK4wmmdZrxmwMfvG7v488DxAXFzcbxKLSGHbvT+NW99fyPj5Gzm+XX1G/aG7buaTEi0v3XFPKOBjjgdGAA8GPz/KUn61mb0N9AGS1b4hRd2yn3fy19fnEL9tD387pR1/HdBGVVNS4uVlyJGawB3A8UHRFOBud0/Ow7ZvEWkIr2dmCcF+HgT+a2Z/AtYBFwSrTwDOIDK/+V7g0ny9E5FC9t9Z6/nXh4uoUbk8b1zel2Na1w07JJFCkZeqqpeBRcAfguWLgTHAuYfa0N2HHuSlgTms68BVeYhHJFR7D6Txrw8XM25OAse2rsuTF/akfnVVTUnpkZfE0drdz8uyfJeZzYtWQCJFVUpqOu/OWs9zU9ewYcc+rhvYlmsHtqWsqqaklMlL4thnZsdlzi1uZv2IzAQoUiok703l1R/iGft9PNv2HKBH81o8fH43jm1dL+zQREKRl8RxJfBK0NZhQBJwSTSDEikKNu7Yx0vf/sRbM9ex90A6A9rX54r+renTso7uAJdSLS+9quYB3TNHxHX3nVGPSiREKxN38eyUNXw0bwMODOrWmL/0b03HxhoUWgTy1quqFjAciAXKZX7TOtRwIyLFzaz4JJ6dsppJSzdTqXwZLurbgj8d15LmdaqEHZpIkZKXqqoJwHRgIZAR3XBECldGhvP1ss08O2U1s9Zup1aV8lw3sC0jjo2lTlWNLyWSk7wkjkrufmPUIxEpRKnpGYyft5Hnpq5mReJumtaqzB2DOjHk6OZUqZCXPwuR0isvfyGvmdmfgU+A/ZmF7p4UtahEomTP/jTe/nE9L01bw8bkFNo3rM6oId05s1sTypfNyywDIpKXxHEAeAT4J/8bdNCJTOYkUiwcSMtg7Pc/8fTk1STvS6V3yzrcd05XBrSvrx5SIvmUl8RxI9DG3bdGOxiRaJi8bDP3fLKENVv3MKB9fa45sS29WtQOOyyRYisviWMxkbGjRIqV1Vt2c+8nS5i8fAut6ldlzKVHc0L7BofeUERylZfEkQ7MM7PJ/LqNQ91xpUjamZLK6K9WMua7eCqXL8ttv+/I8GNiqVBObRgiBSEviePD4CFSpGVkOO/NTuDhicvYtucAQ+Kac9Mp7TUAoUgBy8ud46+YWWUgxt2XF0JMIvk2e20Sd45fwsINyfQrsavsAAATCUlEQVRqUZsxl/Sma7OaYYclUiLl5c7xQcCjQAWgpZn1IDIfx1nRDk7kUH5OTuHBz5by4byNNKpRiScv7MFZ3Zuop5RIFOWlqupOoDfwDUTGrjKzllGMSeSQUlLTeXHaGp6evJp0d64+oQ1XDmhN1Yq6eU8k2vLyV5bm7snZvsFprm8JhbszcXEi901YwvqkfZzWuRH//H1HjSclUojykjgWmdkfgbJm1ha4Fvj+cA9oZu2Bd7IUtQJuB2oBfwa2BOW3uvuEwz2OlDwrEndx18eL+W7VNto3rM4bl/ehXxvNiSFS2PKSOK4hctf4fuAtYCJwz+EeMGhg7wFgZmWBDcAHROYYH+Xujx7uvqVk2rM/jUcmLue16WupVrEcd53VmWF9YiinIUJEQpGXXlV7iSSOf0bh+AOB1e6+Vo2ZkpM567Zz4zvzWJu0l2F9Yrjp5PbU1qi1IqE6aOIws/G5bVhAvaouJHIVk+lqMxsOzAJucvftOcQ1EhgJEBMTUwAhSFGUmp7B6K9W8tTkVTSuWZm3/9yXPq3qhh2WiADmnnM7t5ltAdYT+cc+g8i0sb9w9ylHdGCzCsBGoLO7J5pZQ2ArkYb3e4DG7n5ZbvuIi4vzWbNmHUkYUgSt3rKbG96Zx4KEZM47qhl3nNWJGpXKhx2WSIlhZrPdPe5wt8+tqqoRcDIwFPgj8CnwlrsvPtyDZXM6MMfdEwEyfwKY2QtEhnGXUsTdeX36Wu6bsJRK5cvyzLCjOL1r47DDEpFsDpo43D0d+Bz43MwqEkkg35jZ3e4+ugCOPZQs1VRm1tjdNwWL5wCLCuAYUkxs3pnC399bwJQVW+jfrj6PnN+NBjUqhR2WiOQg18bxIGH8nsg/+Vjg38D7R3pQM6tC5GrmL1mKHw7uSncgPttrUoJ9vmgT/3h/IftS07nn7M5c1LeF7vwWKcJyaxx/BegCfAbc5e4FdgUQ9NSqm63s4oLavxQPu1JSuXP8EsbNSaBbs5qMGtKD1vWrhR2WiBxCblccFwN7gHbAtVm+ARrg7l4jyrFJCTbzpyRueGcem5L3ce2JbbhmYFtN3SpSTOTWxqG/Yilw+9PSGfXlSp6bupqYOlV478pjOSpGs/GJFCcaEU4KzfKfd3H9O/NYumknQ3vHcNvvO2pQQpFiSH+1EnUZGc7L3/3EwxOXU6NSOV4cHsdJnRqGHZaIHCYlDomqhO17+b/3FvD96m2c1LEhD57XlXrVNCOfSHGmxCFRsTJxF89NXcNH8zZQvmwZHjy3K0OObq5utiIlgBKHFKjZa5N45ps1TFqaSKXyZRjWpwV/Pr4VTWtVDjs0ESkgShxyxDIynMnLN/PslNX8GL+dWlXKc93Atow4NpY6GslWpMRR4pDDlpqewfh5G3lu6mpWJO6maa3K3DGoE0OObk6VCjq1REoq/XVLvu3Zn8bbP67npWlr2JicQvuG1Rk1pDtndmuim/hESgElDsmzbbv388r38bzyw1qS96XSO7YO953TlQHt66vRW6QUUeKQQ1qftJcXpq3hv7PWk5KawcmdGnJF/9b0aqE7vkVKIyUOOaglG3fy7JTVfLpwE2UMBvdoyl/6t6JNg+phhyYiIVLikN84kJbBA58tZcx38VStUJbL+sVy2XEtaVxTXWpFRIlDsknYvper3pzL/PU7GHFMC248uT01q2jaVhH5HyUO+cWkJYnc9O58MjKc/ww7ijM0bauI5ECJQ0hNz+DRict5buoaOjWuwX+GHUVsvaphhyUiRVRoicPM4oFdQDqQ5u5xZlYHeIfINLXxwB/cfXtYMZYGm5L3cc2bc5m1djvD+sTwrzM7Ual82bDDEpEiLOy7tU5w9x7uHhcs3wJ85e5tga+CZYmSb5Zv5vf//palm3by5IU9uO+crkoaInJIRa2q6mxgQPD8FeAb4Oawgimp0tIzeGLSSp7+ZhXtG1bn6WFHaa5vEcmzMBOHA1+YmQPPufvzQEN33wTg7pvMrEH2jcxsJDASICYmpjDjLRE270zh2rfnMn1NEn+Ia8ZdZ3WhcgVdZYhI3oWZOPq5+8YgOXxpZsvyslGQYJ4HiIuL82gGWNJ8v2or1749j937U3n0gu6c36tZ2CGJSDEUWuJw943Bz81m9gHQG0g0s8bB1UZjYHNY8ZUk6RnOU1+v4omvVtC6fjXe/HMf2jXU3d8icnhCaRw3s6pmVj3zOXAKsAgYD4wIVhsBfBRGfCXJ1t37uWTMTEZNWsE5PZry0VX9lDRE5IiEdcXREPggGFG1HPCmu39uZj8C/zWzPwHrgAtCiq9EmLFmG9e+PZcde1M1dauIFJhQEoe7rwG651C+DRhY+BGVLBkZznNT1/DoF8uJqVOFMZf0plOTGmGHJSIlRFHrjitHaPba7Yz6cgXfrtrKmd0a88C5XaleSWNNiUjBUeIoAdwjc34/883/5vy+Z3AXLuoTo6opESlwShzFWGp6Bh/P38hzU9awPHGX5vwWkUKh/y7F0N4Dabw9cz0vffsTG3bs05zfIlKolDiKkaQ9Bxj7fTyv/hDPjr2p9G5Zh3sHd9Gc3yJSqJQ4ioH1SXt5cdoa3gnm/D6lU0OuGNCao2I057eIFD4ljiJsycadPDd1NZ8siMz5fU7Ppow8vjVtGmhAQhEJjxJHEePuTF+TxLNTVjNlxRaqVijLn45ryWX9WtKoZqWwwxMRUeIoSuav38Ht4xczf/0O6lWrwN9Pbc9FfVtQs7LuwxCRokOJo4hY9vNOLn5pBtUqluPewV04v1czTaokIkWSEkcRkLB9LyNenkmVCuV498pjaVqrctghiYgclDr9hyxpzwGGvzyTfQfSeeWy3koaIlLk6YojRHsPpHHZ2B/ZsH0fr/2pD+0babhzESn6dMURktT0DP76xhwWJOxg9NCe9G5ZJ+yQRETyRFccIcjIcG5+bwHfLN/Cg+d25ZTOjcIOSUQkz3TFEYKHPl/G+3M3cNPJ7biwd0zY4YiI5EuhJw4za25mk81sqZktNrPrgvI7zWyDmc0LHmcUdmyF4YWpa3hu6hqGH9OCq09sE3Y4IiL5FkZVVRpwk7vPCeYdn21mXwavjXL3R0OIqVB8MDeB+yYs5fddG3PHoM4amFBEiqVCTxzuvgnYFDzfZWZLgaaFHUdhm7JiC39/dwHHtq7L40O6U7aMkoaIFE+htnGYWSzQE5gRFF1tZgvM7GUzy3HoVzMbaWazzGzWli1bCinSIzNv/Q6ufH027RpW57mLe1GxnO4IF5HiK7TEYWbVgHHA9e6+E3gGaA30IHJF8lhO27n78+4e5+5x9evXL7R4D9fqLbu5bOyP1K1WgbGXHa35v0Wk2AslcZhZeSJJ4w13fx/A3RPdPd3dM4AXgN5hxFaQEnemMPylmRjw2mV9aFBdo9uKSPEXRq8qA14Clrr741nKG2dZ7RxgUWHHVpCS96Uy4uWZ7Nh7gLGX9ia2XtWwQxIRKRBh9KrqB1wMLDSzeUHZrcBQM+sBOBAP/CWE2ApESmo6f351Fqu37GbMJb3p2qxm2CGJiBSYMHpVfQvk1KVoQmHHEg3pGc51b89l5k9J/HtoT45rWy/skERECpTuHC9A7s5tHy5i4uJE7hjUibO6Nwk7JBGRAqfEUYCemLSSt2au468DWnNpv5ZhhyMiEhVKHAXktelrefKrlVzQqxl/P7V92OGIiESNRsc9Alt27efTBRv5aP5G5q7bwcAODXjg3K4aSkRESjQljnxK3pfKxMU/M37eRr5fvZUMhw6NqnPzaR24tF8s5crqIk5ESjYljjzYdyCdr5YlMn7eRr5ZvoUD6RnE1KnCVSe04azuTWjbUDP3iUjpocRxEKnpGXy7civj52/ki8U/s+dAOvWrV2RY3xjO7tGU7s1qqkpKREolJY4sMjKcH+OTGD9/IxMWbmL73lRqVCrHoO5NOKt7E/q0qqtRbUWk1Cv1icPdWbxxJ+Pnb+Tj+RvZlJxCpfJlOLlTI87q3oTj29XTaLYiIlmUysSRkprOjJ+SmLxsM5OXb2bttr2UK2P0b1efW07vwEkdG1K1Yqn8aEREDqnU/HfcsGMfk5dt5pvlm/lu1Tb2paZTsVwZjm1dl78c35rTuzSidtUKYYcpIlLkldjEkZqewZy125m8fAuTl21meeIuAJrVrswFcc04oX0Djmldl0rlVQ0lIpIfJSpxbN29n2+Wb2Hy8s1MXbGFXSlplCtj9G5Zh3/26sgJHerTun419YYSETkCxT5xzF+/g6+DKqj5CckA1K9ekdO7NOLEDg3o16aeZt0TESlA5u5hx3DYqjZt5/UvHoUZ9GxeixPaN+CEDg3o1LgGZdRtVkQkR2Y2293jDnf7Yn3FUa1iOZ4Y0oPj29Wnjhq2RUQKRbFOHM3rVGFwz6ZhhyEiUqoUuRH5zOw0M1tuZqvM7Jaw4xERkV8rUonDzMoCTwOnA52IzEPeKdyoREQkqyKVOIDewCp3X+PuB4C3gbNDjklERLIoaomjKbA+y3JCUPYLMxtpZrPMbNaWLVsKNTgRESl6iSOnPrS/6i/s7s+7e5y7x9WvX7+QwhIRkUxFLXEkAM2zLDcDNoYUi4iI5KCoJY4fgbZm1tLMKgAXAuNDjklERLIoUvdxuHuamV0NTATKAi+7++KQwxIRkSyK9ZAjZrYFWBt2HAWsHrA17CCKKH02OdPncnD6bHLW3t2rH+7GReqKI7/cvcS1jpvZrCMZQ6Yk02eTM30uB6fPJmdmNutIti9qbRwiIlLEKXGIiEi+KHEUPc+HHUARps8mZ/pcDk6fTc6O6HMp1o3jIiJS+HTFISIi+aLEISIi+aLEESIza25mk81sqZktNrPrgvI6Zvalma0MftYOO9YwmFlZM5trZp8Eyy3NbEbwubwTjC5Q6phZLTN7z8yWBefOMTpnwMxuCP6OFpnZW2ZWqbSeM2b2spltNrNFWcpyPEcs4t/BHEgLzOyoQ+1fiSNcacBN7t4R6AtcFcw/cgvwlbu3Bb4Klkuj64ClWZYfAkYFn8t24E+hRBW+J4HP3b0D0J3IZ1SqzxkzawpcC8S5exciI09cSOk9Z8YCp2UrO9g5cjrQNniMBJ451M6VOELk7pvcfU7wfBeRfwBNicxB8kqw2ivA4HAiDI+ZNQN+D7wYLBtwIvBesEpp/VxqAMcDLwG4+wF334HOGYjc0FzZzMoBVYBNlNJzxt2nAknZig92jpwNvOoR04FaZtY4t/0rcRQRZhYL9ARmAA3dfRNEkgvQILzIQvME8H9ARrBcF9jh7mnB8m/maiklWgFbgDFBNd6LZlaVUn7OuPsG4FFgHZGEkQzMRudMVgc7Rw45D1J2ShxFgJlVA8YB17v7zrDjCZuZnQlsdvfZWYtzWLU09iUvBxwFPOPuPYE9lLJqqZwE9fVnAy2BJkBVIlUw2ZXGc+ZQ8v23pcQRMjMrTyRpvOHu7wfFiZmXisHPzWHFF5J+wFlmFk9k+uATiVyB1AqqIaD0ztWSACS4+4xg+T0iiaS0nzMnAT+5+xZ3TwXeB45F50xWBztH8j0PkhJHiIJ6+5eApe7+eJaXxgMjgucjgI8KO7Ywufs/3L2Zu8cSaeD82t2HAZOB84PVSt3nAuDuPwPrzax9UDQQWEIpP2eIVFH1NbMqwd9V5udS6s+ZLA52jowHhge9q/oCyZlVWgejO8dDZGbHAdOAhfyvLv9WIu0c/wViiPxBXODu2Ru6SgUzGwD8zd3PNLNWRK5A6gBzgYvcfX+Y8YXBzHoQ6TRQAVgDXErkS2CpPmfM7C5gCJHeinOBy4nU1Ze6c8bM3gIGEBlWPhG4A/iQHM6RINE+RaQX1l7gUnfPdfRcJQ4REckXVVWJiEi+KHGIiEi+KHGIiEi+KHGIiEi+KHGIiEi+KHGI5MLM3Mwey7L8NzO7M5/72F3ggYmESIlDJHf7gXPNrF7YgYgUFUocIrlLIzI/8w3ZXzCzFmb2VTCHwVdmFhOUtzSzH8zsRzO7J9s2fw/KFwQ3rGFmVc3sUzObH8wlMaQw3pjI4VLiEDm0p4FhZlYzW/lTRIaj7ga8Afw7KH+SyCCERwM/Z65sZqcQmfOgN9AD6GVmxxO5Y3eju3cP5pL4PKrvRuQI6c5xkVyY2W53r2ZmdwOpwD6gmrvfaWZbgcbunhoMVrnJ3euZ2TagUVBeg0hSqGZmjxIZN2lHsPtqwANEhp2ZSGQ4iE/cfVohv02RfCl36FVEhMjovHOAMbms4wd5nsmAB9z9ud+8YNYLOAN4wMy+cPe7jyRYkWhSVZVIHgQDBv6XX089+j2R0XsBhgHfBs+/y1aeaSJwWTD/CmbW1MwamFkTYK+7v05kMqJDzvksEiZdcYjk3WPA1VmWrwVeNrO/E5mV79Kg/DrgTTO7jshcKwC4+xdm1hH4ITIgKbuBi4A2wCNmlkGkOuzKaL8RkSOhNg4REckXVVWJiEi+KHGIiEi+KHGIiEi+KHGIiEi+KHGIiEi+KHGIiEi+KHGIiEi+/D8PlQVFDV3FpQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax3 = df_after.plot.line()\n", + "ax3.set_title('Before interpolation')\n", + "ax3.set_xlabel(\"Nodes\")\n", + "ax3.set_ylabel(\"Memory (MB)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "f = interp1d(df_after.index, df_after['memory'], kind='cubic')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "df_int_after = pd.DataFrame()\n", + "new_index = np.arange(5, 100, 5)\n", + "# print(new_index)\n", + "df_int_after['memory'] = f(new_index)\n", + "df_int_after.index = new_index" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JCmjNm7cyLhx4/jzn//Mv//9bz766CP2228/Ro8enelo5Yrn/EmSJEnKiNzcXG699Vb2339/hgwZQvXq1XnkkUfYd999Mx2tXHLmT5IkSVJaxRgJIbBixQp+85vf0LlzZx544AGOP/54b9eQQpY/SZIkSWmxePFibr75ZhYvXsyUKVNo1KgRH374IU2bNs10tArBZZ+SJEmSUmrhwoUMHDiQZs2acffdd7PrrruyadMmAItfGjnzJ0mSJCllnnjiCfr27UutWrW46KKLuOSSS2jUqFGmY1VIlj9JkiRJO02Mkeeee45q1apx3HHH0b17d6677jrOO+88dtttt0zHq9Bc9ilJkiTpJ8vPz2fcuHEcdthhnHjiidx6660A7LLLLvzud7+z+JUClj9JkiRJP8njjz9O8+bNGTBgAIWFhYwdO5YpU6ZkOpa24LJPSZIkSTts5cqVVKtWjVq1apGXl8c+++zDbbfdxoknnkilSs4xlUb+VCRJkiSV2Oeff87//d//0bhxY+6++24ABg4cyKuvvspJJ51k8SvFnPmTJEmStF0ffPABN910E2PHjqWwsJDTTz+dHj16AHhj9jLC8idJkiRpuy644AJeffVVzj33XC677DLvz1cGOScrSZIk6XtijLzwwgt0796dpUuXAnDnnXeyePFicnJyLH5llOVPkiRJEgAFBQU88cQTtG/fnuOPP56FCxeyaNEiAFq0aMEee+yR4YT6KVz2KUmSJIkNGzbQpk0b3n//fQ488EDuv/9+BgwYQFZWVqajaSex/EmSJEkV1OrVq5k+fTp9+/YlKyuLM844g1atWnHKKadQuXLlTMfTTmb5kyRJkiqYr776ittuu4277rqLNWvW0K5dO5o1a8bVV1+d6WhKIc/5kyRJkiqIr7/+mvPPP58mTZpw44030r17d958802aNWuW6WhKA2f+JEmSpHIuNzeXWrVqUaVKFR577DEGDRrE5ZdfTvPmzTMdTWlk+ZMkSZLKoRgjL730EiNHjuSbb77hjTfeYNddd2XJkiXUrFkz0/GUAS77lCRJksqRwsJCJk+ezJFHHkm3bt2YP38+vXv3Jj8/H8DiV4E58ydJkiSVIxMmTKB///7sv//+3H333Zx55pnUqFEj07FUClj+JEmSpDJs7dq13H///ey2224MHDiQ3r17U6VKFX75y19SpYp/3dd/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cNmnJH1JF154IdOnT+enP/0pP/zhD9l1112zjiRJkvR3LH+S9Dlt2rSJW2+9laOPPpr999+fG2+8kYYNG9KmTZuso0mSJP1DLvuUpB2UUuLRRx+lS5cunHfeeVs/r2/fffe1+EmSpBrP8idJO+CFF17gqKOO4thjjyWlxCOPPMLYsWOzjiVJkrTDXPYpSTvgjjvu4IUXXuA//uM/OPvss2nYsGHWkSRJkj4Xj/xJ0mdYv349V1xxBc888wwAV1xxBa+99hrnnXeexU+SJNVKlj9J2saWLVv4r//6L9q3b8/YsWOZPn06AM2aNaN58+YZp5MkSfriLH+SlHPzzTez7777cvrpp9O6dWtmz57NlVdemXUsSZKkamH5k1S0Vq9eze2338769esB2LhxIwcddBBTp05l/vz5HH744RknlCRJqj5e8EVSUdmyZQszZ85k0qRJPPjgg9cOrlQAAB3qSURBVHzyySfssccefOc732H06NGMHj0664iSJEl5YfmTVDSWL19OSUkJ7733Hi1atGD48OGUl5dTUlKSdTRJkqS8s/xJqrNWrVrFfffdx+rVq7nkkkto2bIlgwcPpk+fPgwaNIidd94564iSJEkFY/mTVKds2bKFJ598krvuuouHHnqIjRs30qNHDy6++GIigokTJ2YdUZIkKRNe8EVSnTJ27FjKysqYMWMGZ511FgsWLGDevHlERNbRJEmSMmX5k1RrrVq1iltuuYUePXowa9YsAMrLy5k6dSpLly7lP//zPykpKbH4SZIk4bJPSbXMli1beOKJJ5g0aRIPP/wwGzdupHPnznzyyScAtG/fnvbt22ecUpIkqeax/EmqFVatWkXz5s2prKxk2LBhbN68mREjRjBs2DC6devm0T1JkqR/wfInqcZatWoVkydPZtKkSbz//vu88cYbNGzYkCeffJL27dt7tU5JkqTPwXP+JNU4zz//PCeccAJ77bUXI0eOZMOGDYwaNYpNmzYB0KVLF4ufJEnS5+SRP0k1wqJFi2jWrBlt2rTh/fff56mnnuLss89m2LBhdO3a1WWdkiRJX5JH/iRlZuXKldx8880ccsghdOrUaetn8JWVlbF06VImTJjg+XySJEnVxCN/kgoupUR5eTn33XcfFRUVfOMb3+DGG2/k5JNPBqB+/frUr18/45SSJEl1i+VPUkG88sorPPnkk4waNYqIoGnTpnz/+9/fuqxTkiRJ+WX5k5Q3a9as4aabbmLSpEksWLCABg0aMHToUNq0acNNN92UdTxJkqSi4jl/kvLigQceYOjQoZx77rls3ryZ8ePHs3TpUtq0aZN1NEmSpKLkkT9J1WbTpk28/fbb7L///gwcOJChQ4cyZswYl3VKkiTVAB75k1QtZs+eTbdu3RgwYAAVFRU0btyYs846y+InSZJUQ1j+JH0pK1asoLy8nH//939n7dq13HDDDey0005Zx5IkSdJ2XPYp6QtbvHgxhx12GOvWrePSSy/lsssuo3HjxlnHkiRJ0mew/En63FavXk2zZs3o0KED5eXlnH322XTs2DHrWJIkSfonXPYpaYetWrWKkSNHcsABB7BixQrq1avH+PHjLX6SJEm1gOVP0r+UUuLuu++mQ4cO3HrrrZx66qk0atQo61iSJEn6HFz2Kemf2rBhA2VlZcyePZsePXrwxBNPeAVPSZKkWsjyJ+kzbdmyhfr167PLLrvQqVMnTjvtNM4880zq1XPBgCRJUm2U2bu4iHgzIl6OiBciYkFuW4uImBERf859b55VPqlYpZSYOnUq7dq1Y9GiRQDcfPPNDB8+3OInSZJUi2X9Tq5PSqlrSql77v4lwMyUUjtgZu6+pAJ57bXXOProozn++OPZbbfdqKioyDqSJEmSqknW5W973wZ+mbv9S2BwhlmkonL11VfTuXNn5s2bx4QJE1iwYIHn9kmSJNUhWZa/BDwREc9HxIjctlYppWUAue8tM0snFZmPP/6Y4447jldffZXzzz+fBg08JViSJKkuiZRSNr84ok1KaWlEtARmAOcBj6SUmm3znFUppebb/dwIYARAq1atSiZPnlzI2NVm7dq1NGnSJOsYRcWZ/60VK1YwceJEBg0axCGHHEJlZWW1n9PnzAvPmReeMy88Z154zrzwnHnh1daZ9+nT5/ltTqP7pzL7X/sppaW57ysi4kHgEGB5RLROKS2LiNbAis/4uduA2wC6d++eevfuXcDU1WfWrFnU1uy1lTOvsmnTJsaPH89Pf/pTKisrOf300/M2F2deeM688Jx54TnzwnPmhefMC68YZp7Jss+I2DUimn56G+gPLAQeAcpzTysHHs4in1RXzZkzh27dunHRRRfRt29fFi1axPDhw7OOJUmSpALI6shfK+DBiPg0w69TStMi4jng/oj4LvA2MDSjfFKd9Morr7Bu3ToeeeQRjj322KzjSJIkqYAyKX8ppdeBgz5j+4dA38InkuqmLVu2cOutt9KkSRNOP/10zjrrLE477TQaN26cdTRJkiQVWE37qAdJ1eS5557j0EMP5ZxzzuG3v/0tAPXq1bP4SZIkFSnLn1THrFq1ipEjR3LooYeydOlS7r33Xu6///6sY0mSJCljlj+pjlmwYAG33XYbo0aNYsmSJZx44onkzq+VJElSEfNTnKU6YOHChTz77LOceeaZ9OvXj9dee422bdtmHUuSJEk1iEf+pFps7dq1jBkzhq5du/KjH/2I9evXA1j8JEmS9Hcsf1ItlFLigQceoGPHjlx//fWcccYZvPTSS17MRZIkSf+Qyz6lWujNN9/kpJNOonPnzkyZMoWePXtmHUmSJEk1nEf+pFpiw4YNTJkyBYD99tuPWbNm8dxzz1n8JEmStEMsf1It8Pjjj9O5c2dOOOEEXn75ZQB69epFgwYevJckSdKOsfxJNdiLL77IkCFDGDhwIA0bNmTmzJl06dIl61iSJEmqhTxsINUwmzZtomHDhmzatIl+/fqxdu1arr76ai644AJ23nnnrONJkiSplrL8STVARUUFjz32GJMmTWLRokUsWbKEhg0bMnXqVA488EB23333rCNKkiSplrP8SRn685//zE033cQ999zDBx98QKtWrTjttNPYsGEDu+66K4cffnjWESVJklRHWP6kAluxYgX16tVjjz32YMmSJdxyyy1861vfYtiwYQwYMMCLuEiSJCkvvOCLVAAVFRU8+OCDDB48mL333psJEyYAUFZWxrJly5gyZQrHHHOMxU+SJEl54ztNKc8uuugi7rzzTj788EP22msvRo8ezcknnwxAw4YNadGiRcYJJUmSVAwsf1I1W7FiBTNmzOCUU04BYNmyZRx55JEMGzaM/v37e3RPkiRJmfBdqFQNKioq+N3vfsekSZN47LHH2Lx5M7169aJt27bcfffdRETWESVJklTkPOdP+pLmzp1LmzZtOO6443juuee44IILeOWVV2jbti2AxU+SJEk1gkf+pM9p+fLl3HPPPey7774MGTKEAw88kH79+nH66afTr18/l3VKkiSpRvJdqrQDKioqePTRR7cu69yyZQvDhw9nyJAhNG/enHvvvTfriJIkSdI/ZfmTdsDgwYN5/PHH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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax4 = df_int_after.plot.line(figsize=(15,8), style='k--', grid=True)\n", + "ax4.set_title('Cassandra JVM Memory Usage')\n", + "ax4.set_xlabel(\"Nodes\")\n", + "ax4.set_ylabel(\"Memory (MB)\")\n", + "plt.savefig('plot2.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/cassandra/data.csv b/cassandra/data.csv new file mode 100644 index 0000000..aef71b7 --- /dev/null +++ b/cassandra/data.csv @@ -0,0 +1,51 @@ +nodes,memory +1,1 +2,2 +3,3 +4,4 +5,5 +6,6 +7,7 +8,8 +9,9 +10,10 +11,11 +12,12 +13,13 +14,14 +15,15 +16,16 +17,17 +18,18 +19,19 +20,20 +21,21 +22,22 +23,23 +24,24 +25,25 +26,26 +27,27 +28,28 +29,29 +30,30 +31,31 +32,32 +33,33 +34,35 +35,35 +36,38 +37,40 +38,43 +39,44 +40,46 +41,48 +42,50 +43,52 +44,53 +45,55 +46,57 +47,58 +48,63 +49,67 +50,74 diff --git a/cassandra/data2_after_heap.csv b/cassandra/data2_after_heap.csv new file mode 100644 index 0000000..055e806 --- /dev/null +++ b/cassandra/data2_after_heap.csv @@ -0,0 +1,20 @@ +nodes,memory +5,5 +10,10 +15,16 +20,35 +25,43 +30,56 +35,64 +40,76 +45,86 +50,94 +55,107 +60,114 +65,127 +70,136 +75,145 +80,156 +85,166 +90,176 +100,198 diff --git a/cassandra/deploy.py b/cassandra/deploy.py new file mode 100644 index 0000000..ebfe2b0 --- /dev/null +++ b/cassandra/deploy.py @@ -0,0 +1,161 @@ +import os +import argparse +import mmap +import time + +import itertools + +from ccmlib.cluster import Cluster +from ccmlib import common, extension, repository +from ccmlib.node import Node, NodeError, TimeoutError + +class CustomCluster(Cluster): + def __update_pids(self, started): + for node, p, _ in started: + node._update_pid(p) + + def start(self, no_wait=False, verbose=False, wait_for_binary_proto=True, + wait_other_notice=True, jvm_args=['-Xms1024M', '-Xmx1024M'], profile_options=None, + quiet_start=False, allow_root=False, **kwargs): + # if jvm_args is None: + # jvm_args = [] + + extension.pre_cluster_start(self) + + common.assert_jdk_valid_for_cassandra_version(self.cassandra_version()) + + # check whether all loopback aliases are available before starting any nodes + for node in list(self.nodes.values()): + if not node.is_running(): + for itf in node.network_interfaces.values(): + if itf is not None: + common.assert_socket_available(itf) + + started = [] + for node in list(self.nodes.values()): + if not node.is_running(): + mark = 0 + if os.path.exists(node.logfilename()): + mark = node.mark_log() + + p = node.start(update_pid=False, jvm_args=jvm_args, profile_options=profile_options, verbose=verbose, quiet_start=quiet_start, allow_root=allow_root) + + # Prior to JDK8, starting every node at once could lead to a + # nanotime collision where the RNG that generates a node's tokens + # gives identical tokens to several nodes. Thus, we stagger + # the node starts + # if common.get_jdk_version() < '1.8': + + # [RAYANDREW] modify this + # print('Waiting 10s before starting other node') + time.sleep(10) # wait 10 seconds before starting other node + + started.append((node, p, mark)) + + if no_wait: + time.sleep(2) # waiting 2 seconds to check for early errors and for the pid to be set + else: + for node, p, mark in started: + try: + start_message = "Listening for thrift clients..." if self.cassandra_version() < "2.2" else "Starting listening for CQL clients" + node.watch_log_for(start_message, timeout=kwargs.get('timeout',60), process=p, verbose=verbose, from_mark=mark) + except RuntimeError: + return None + + self.__update_pids(started) + + for node, p, _ in started: + if not node.is_running(): + raise NodeError("Error starting {0}.".format(node.name), p) + + if not no_wait: + if wait_other_notice: + for (node, _, mark), (other_node, _, _) in itertools.permutations(started, 2): + node.watch_log_for_alive(other_node, from_mark=mark) + + if wait_for_binary_proto: + for node, p, mark in started: + node.wait_for_binary_interface(process=p, verbose=verbose, from_mark=mark) + + extension.post_cluster_start(self) + + return started + + +def _read_logs(filename, text='Used Memory'): + line = None + + with open(filename, 'r') as f: + line = next((l for l in f if text in l), None) + + return line + +def _read_logs_2(filename, text='Used Memory'): + with open(filename, 'r') as f: + # memory-map the file, size 0 means whole file + m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) + # prot argument is *nix only + + i = m.rfind(b'Used Memory') # search for last occurrence of 'word' + m.seek(i) # seek to the location + line = m.readline() # read to the end of the line + return str(line) + +def log_parser(args, node_count): + mems = [] + + for i in range(node_count): + line = _read_logs(os.path.join(args.cluster_path, args.cluster_name, 'node{}'.format(i + 1), 'logs', 'system.log')) + if line is not None: + mem_digits = [int(s) for s in line.split(' ') if s.isdigit()] + mems.append(mem_digits[0]) + return mems + +def deploy_cluster(args, node_count): + cluster = CustomCluster( + path=args.cluster_path, + name=args.cluster_name, + install_dir=args.cassandra_dir) + cluster.populate(node_count).start() + + return cluster + +def stop_remove_cluster(cluster): + cluster.stop() + cluster.remove() + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='[Cassandra] - Memory Reader') + + parser.add_argument('--node_count', '-nc', default=5, type=int, help='Cassandra Node Count') + parser.add_argument('--cassandra_dir', '-cd', default='/mnt/extra/cassandra', help='cassandra source dir') + parser.add_argument('--cluster_name', '-cn', default='test', help='cluster name') + parser.add_argument('--cluster_path', '-cp', default='/mnt/extra/working', help='ccm conf dir') + args = parser.parse_args() + + for node_count in range(-5, args.node_count - 5, 5): + print('Starting Cluster consists of {} nodes'.format(node_count + 10)) + cluster = deploy_cluster(args, node_count + 10) + + print('Delay about 1 minute before trying to read memory logs') + time.sleep(60) + + print('Start reading the logs') + + mems = [] + + while True: + mems = log_parser(args, node_count + 10) + time.sleep(2) + if len(mems) == (node_count + 10): + break + + print('List of mem used ', mems) + print('Total memory used for {} nodes is : {} MB'.format(node_count + 10, sum(mems))) + + print('Stopping and Remove Cluster') + stop_remove_cluster(cluster) + + print('Delaying 10 secs before spawning another cluster\n') + time.sleep(10) \ No newline at end of file diff --git a/cassandra/log.txt b/cassandra/log.txt new file mode 100644 index 0000000..cea4a3e --- /dev/null +++ b/cassandra/log.txt @@ -0,0 +1,162 @@ +Starting Cluster consists of 5 nodes +/usr/local/lib/python3.4/dist-packages/ccmlib/node.py:1501: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. + data = yaml.load(f) +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [1, 1, 1, 1, 1] +Total memory used for 5 nodes is : 5 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 10 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +Total memory used for 10 nodes is : 10 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 15 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +Total memory used for 15 nodes is : 16 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 20 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [1, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2] +Total memory used for 20 nodes is : 35 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 25 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 25 nodes is : 43 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 30 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2] +Total memory used for 30 nodes is : 56 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 35 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2] +Total memory used for 35 nodes is : 64 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 40 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 1] +Total memory used for 40 nodes is : 76 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 45 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2] +Total memory used for 45 nodes is : 86 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 50 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 50 nodes is : 94 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 55 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1] +Total memory used for 55 nodes is : 107 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 60 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2] +Total memory used for 60 nodes is : 114 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 65 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 65 nodes is : 127 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 70 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2] +Total memory used for 70 nodes is : 136 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 75 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 75 nodes is : 145 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 80 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 80 nodes is : 156 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 85 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 85 nodes is : 166 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 90 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 90 nodes is : 176 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 95 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 95 nodes is : 186 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + +Starting Cluster consists of 100 nodes +Delay about 1 minute before trying to read memory logs +Start reading the logs +List of mem used [3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 100 nodes is : 198 MB +Stopping and Remove Cluster +Delaying 10 secs before spawning another cluster + diff --git a/cassandra/plot.png b/cassandra/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..15db9ef14ece9955dbe15dc7544c3255a643c1e0 GIT binary patch literal 26682 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

0enRR}l6hJp@t?o(W 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 Iz4_q(0?dPEu>b%7 literal 0 HcmV?d00001 diff --git a/cassandra/plot2.png b/cassandra/plot2.png new file mode 100644 index 0000000000000000000000000000000000000000..fce964cda09a63d844481a7e12ccd4a24fde121a GIT binary patch literal 28021 zcmeIbd05SR`!@W=mTjtyA{wzGl|rFX%2bxpoQft&s8muKXuzgzsw||4P|`dgl{DB% z5z<^5QJM%5snl~`YuUg1{@u^-eUIn;^F5BIGZ!b z6;1xb_(K(s4dx!kt_~hv+ue6Ed$)VIIlFo|@7W=FV5j^3J+3a2itU`z9an(;aU{KbNuQPG)bM7p5ik&FaRh>6@yy z#B5sk`wl0=o1R;H;w!qp8whSVR#7zl&lUHKw%yzjFWnxO@biyH;(wYSv48hnyDY-S zSZ931!gCL7YO50?I(!`ZB3A7?tKU21uRHTp(L6jhepbD+_2B&~uz176G2CCi7au=? z`-`-Lf}-4C6!aRp@jjKK{eM67|HmN+Egl#ea{4*guT_kR^u8gDh3@^^(&kr_M|S0(491KVs=NzMqS!{Ms;;{@!cHD6!_D!3f(YcpMOg0krGJ_clSh}KQFkqF>7h%=jBc{CHBj@ZeFzJu!I&Ft>2dEQeAXvR&wpL z2u1Do(u<=FW&3^(dVXlisU7rwcx3#f-+%XRd!|4A=5Gx1_(m)C+T;|=>>JbOYe~z< zY)Z`=Oqe7neeKYXzOMF*HZ=>Q4$Wh~%Ja+Vu8NOddu&p?_vbg=wW(1qEqROC7z*Ex zD_(6qJ+k`x`lhMYO@rfx5=;|KvfX!P=j8On-?~~c@cFG2`=Wx)mfgGKP6{r%@%ORG zvPw!OY&N?_ckbM|b5aIza_44vszW0^MlP6DVzLb}j%a|sde~_EI+_5T7_hUz) zfQCuKy}i}h`*-yIBhtE@T^FpsVkD zIxV)$GT@v)d-l3(-Vd!Ss-A-lWz%NQj#t_L&ffQfyw!dC`|rMXRZf~b+4$_d4T69C zacz-tti5mkhgTWK9WSo5_x7eZRws15yuNO5;B82IPfsF8O2@J3zGsAWqG{rmzP>)A z`rAAEi)Pt0dcA*qdiMO4D>HSAp1-)V$~0!tw-Mo1-e)HuO-*X?Amm5a;55{xOox2bkdMztU8GpRFLPEpa z<<(tw5WkqwrcEbjF5b#=b#-M|IHl&s&Q^4gUcTJ);P>9@Qwn*~>}8jqcQ@ze;3g?p zb|ux-rq~pvUsYzwnP0QGy_x5hP850v{d`l0L;&uPPhlIL1^QH$r#uXCBUY-<^?Uk8(-=k~C;;uOwQvFR^KzhQic4aIm;b8tKyAMo;p<-!#;QS zz=y3p%VoDD8Q9y$$lK&4UArcUb+7Ai$KsaWm5RTn&9BPwa_z~OHf>tpmoJrFmA8aM zL=v%q%C;^W_I%GbMfh51=pTMxp0BL=^5xxgV~ovt1)IE}Ir$o^ygyxw)w_})w(0;4 zjZ@uDwZ8dRs+*t~f0VlaPnNJB;0exxT~?}{o` zYlf((Xj^ypV8L*}EtjVIGF$J)g~?mVum|5=b~VX6+tM<;w# znf%s&czDd2I45r5%rcZ!e3oxv6t;OW9TRr$t2@4j(@3 z`?J4RNKDMHCB5fWM&i5Ymlt-0L@Zjmbm_^{rw_$_|7I2(9DLuiC+ypYhFhz=dP`bb zY<509fA(wZ$8_wycx({g{%W&!+%&Vre_PQ>p*wlKr)MjEEejYiz93_Y9dWMt;74_g z&}9o`ZEm90oaue=psb3@kHbTYMO8gEUcY`_W=m4Inwr{IeAeRP=?4REPEl+d{PrR7 z#)eY~W~tWqeftwwdp^G@+M3~b0e8L0H+7Em+_`Hw9&aB{?eA^cc5~AOPEb$~zLtuJ zywl#^T%#i@AkcIF{>lueTGr3>M>p)BaBB9CpCp*}Lik6NM$~A|u)y20JBl}=qpR_e zgVwVUl;VwVITjwDDiAqse`;-%`oViUcI>D^2+{4Jy;*rnKhfa&+L}?V5b@;w9WN|W z7hxXz?aa)~u+B;lF9*#zDONeL_+V*isZMWiZ%vO5o)(+ZLSoeOy|quf(1(UheeDqO zY5|R5NknV)?~VJvACl11)AL$vg*ye)LTPQic6(>3V?_*m@Kd1x#XL-6C!!=re0cd_ zPi>?9vL|I_3YEhBA6r^fS6f?KQ#Nd##W3IgIx>z4ltUN@wzRao>s)_($Qn;0VVY!a z7$hK3Q=MqG-1lpzuGdVTp%0lE`#bc0jtqTN_2>-s{206|%5MwOTkVf89Td2a1qJDF z7U+gwJ32w28>2~I&e&7AfPKHmMe4iJ1MhuT)O;!i2OgghiTL(c=*YkrW!WF2dRW1N zvu52wgv7qxjQ#we!}ILfvzJ!vy|nf2?zsrhLH<9}(w6v*{`@Xub^k7=^Fo&;wy_Xm zKPImyAU-}G^IW|ye`NH$wBcG@(8$p-p}+3LjD=sTjPI({-48N%I;$pk-H^l&6=g6s@jdcb4ep0kCHpG z`IExJLe)e`d_5&4MaCp96d5q)?0oIj9?kdmHaNCFz3}Sx&QnP1$v^@n&MP!NsR%qB zT|#T#x4(PQym@OkUs8Ial+#u=cI?=@``$jzS+V-(DlF@lAsQp$dn%ue`t)XZw7q_P z9lN|6JNju!$;;;4gBfLVC}8-l#C@MHv4;*FGRZlxx97ta2`$7T zK_Q`=!D6ct0Gwnjv)p3aCw=d`HvIidZNwC-oCDRL-xiM^a6N-DR=jQIF{dN_d-gTdU>`SN<-=g)@e zJBmC;hJDV6t8cA1nymJm}Pt=Lbv|7J220)X#mZTIQ}h9=9%t zzwgs0gX#p+3_Q5@9OORt>F1owF=1&x~*&1 z9-%uoWV$B0w?Cyl)z80_VcNFH8S*N;10hl}+kCt83!!e!G0>r%-8SHyb4TLEz`p!Jjw2 zdHYsq`t%+Duis9^0GCe-9sjRqLO7+LI`v6-L;To&uRA){0~W@J8Ut9I4jxM%&z>`W!fn=~MQr4PzVF`=iI%Cp@Vgls`?RU4>E)D} zr#1k?nHU*yu$!km=Y2&?$0Ss0&z?Pf-@d&lZ`ab>zAU2c!-p$xcjeF(HC;3x9+r!4 z^!7e2M8B`&`?tclVE!h3{gtZR>$K)eE8BV@Dw?M6*pNFi*psj|BLUz%roX2)kuZo^ zO5{D)mXw~_)I=mC-*5H1gaid+uv&CD4rN!9Ym&G1VCc4JY6cQ8L-3W6mfna|Sp(d` zV&`~$+yabln(OO{q@ab;B8+wH&p$g+FBu=@o2ukkB|ZMP-#UTAIWdW5sZU#4S_Xyb zfo)d_il*sk2a6hxj{MBnRVFT`?52sL?TK=^6fsEr2&vzpq&r#YPnqreL z&wiETl{yok7)jKrE^WIz(tG~sPuJ>rV{PQ)3oOsBiVX;K)d(0S$y=A75ml)e%r-VM zLZH;5?S_i5{Ci7)0()zg+jYRYEGap9B;mk@M{m;q{PWL7PdPO;OB5=x6!3xB8$I)| z*iji>29^QFZqV((I+E!A!uQ*6aY#~}7=qG<(OM`s6SgE@!f<=Oc{DNE;*J*H;o{fg zCL0uvbJ>n{Y1dJEpqi0K($5|4E9JzXtl0zjcHh1Iq>+(P)wMO_*haM}R@Et1t9m++ z0do7_VxL;QeSF3k0TDP`&hK;4EP)Hy3wpS^J_9*iDdNi+yeAQi0m*9v&|4yEc24 zi;IhZ+Q+wVzr0jjaXSHTHTeEc+1L7AQCPNJEu$luM~)m3@6Nt@^(sPW+6vd^q*>P9 zYk+%d>P5d-+|-!`1ipLV(`$X1)pTLWQ`jrn6|E1CdSbtzF112feeV8a$*vconA45G z6ScifIm>rE`fJF#A>MeQRo)>B)D9scBJ}l7e<2v?=%-Rat)R>2pXzaR44jtp;H&lj%CGPp-8x;)UB>b8q5~ zPKcIT+7xmE)y^Cl=RGCL?^{IqH2R?0c0{LIgu^qzhvldw$4{$1AHQf^OTehrm@#9t zwAai`dm?@N*^YE!v4<{8w%`MrFD|0!+mgJs3xz&sq^{#**--z()dp^oIzV6^s6qVQ z0)FRh^z)}qohmn^%QhAQvc$x0zAS@mJaOX0SNQ??tay*E3U@EBmC9nbPfE#@OxMuR zK#(CUuchsC?e5*XqK0x=Sy?4zWo4b*tu(??SGU3oR{^6_{yZbHQqOPjt0CxxGr`A; zDNsDQs1Rk9wC+?$h?#*wXgMM-Vy@)Sw-3gE8U)-?8Yb+ijP-qcW~IqB%`wr@uP54` zAoh`wG^1}}`@RC6H`Lig2C*D@dOBfp zh9)NGC(V*ilJFl`gGK*r+Db{yZ+5&#DsZuon@Kf0aG3GA1)IM%d9`$*KIO!;w%R^D zqxL5+T-#p6J_Mpma(I5J>(PlBgh&ELzDWG|@ng2wRK8#DSKwkUH}i_hel4j@=M9j1 zS!^I>Gi3Vq_wSwERE1CQE*AQh?zuH%6S$`;Kx5C&mvghTvQU0J?A%>4_n%ixmz#NN zOOpBZj;jatP|{FM+8i+I7ooc#I(lx zgxv8HYKNy4zum_%#x4D7tkn%9~AIg^EA=N$np6RpmmspzW%r9n6>JufA!kXQUyq)qa;H8CS)jD3 z$qKdWCLJAP50AU32_zRT^f%d1v-BwU!E6<0&z=nge-;H<%E-?l9S#E6P2{~qgx>Qa z-uApZ20C8^mk=H{DOw}V4OoEO=uD$xl)`E~*-fD*?)W?gf`<8&V!zVJtfopQd zjvFT=EG!)m5P&*(69uQOb5jy-vne3fhd&sdb+ z(ROoZZSM`aLIHZPzvmXfw0X$lt#?ZXKL?H(hrGPU&k`^O^=CuuY})f}R++9XHGq}G zjj=0wQuB#jS|lfTx_(Z{%tL1N@wg0Xx1OsVn9sZ)??e#N>Xa$d20rKo`~kq@JUzcC z8ga|1w=tU&b1TY!EAn7;qvpNWt7K=rdf;;hWKRMxjztL4m+qQ1YaCx*JB(oIY^#dP zFxk~$QodqVdaigi8%8YKdDpk!(GS^It9Y&Wb`)|mqt~^Tvlc9n0Y3+d=()!O{ixM4 z+wLWSKapfpISy>K0A$jK#%yD3h8j?q@&W=OIm8k~TvFK|3&636hUwYJO3qX&Nb$mR z#OCX7|97zT4{{oQLi8rkavQL&&zE;y1&7C-{Od0RVCJOSx}I%Rrsx!S7>)50 zCg@bCmrgC%l6C6j6?!Fb#7N`q9UZq&adl_ZT2~^retc!=Q5m~=&e9!!Mn*=`ARucF z=ZT!B&{gm={JDeY$7U-qqEw61bpggj#3qNXf4DspsJ_?d5QtDOvB@AX&CShMETpf6 zHpJYz)pOZ3uY8uxq3ai9%@Q;ZkKKCP{>1RlpQaRL-;Rk$TR)zjJoE{wPjIeE_!PJz z&k71L!vp)+MwkHUm7(+h*?yki-dj)(oh5H+fX^xId@7jXTyMnBKkP56BEkcKZTpCa zLoO7YIWrbx77t)Y)fp;*;>Xw1M0i^?R9j5V+aT&t--&lGt|TJgB_aVJ@zjPdwL2Zm zXFq%YX?ilr5Eb{fzYr`EQGMo}!J&e`+DsB5w z;(T&{erxFK?_aJe{;7@^wS;-rx#>z5nWPWU*G9nFr#of z7u1#T9&E%(3+xGl=vcibx4iw}cK72^g0VI?Z z8=Q7!*1oqUH`Y%)I%DkPXx`|GK6PHr)G` zFF@7-h7!?2Fc9lV7GPFSZ&-LjTA}PL$5XbyeOuUM z5SagvH~dSuR7*&}@H!fhlC$%vFsQ0BVH<&>mtGkdR4|2G4J~&~%;+ms; zllb{->eB6!OAUO#y=P~SQCq;fREfjr$oG8Yi8$c$PJDtwF)DiEWuv3VWb^5ma9>fR z5u`VigLC=$`2aTyw6(RLUsc}*T=_IgBftD}pk)v*(_SUEiKu!236Q@Rs7N5iDd)h4 zWvX*R6M6Dt!3;NWAbx{gw}3m38yOo{Kk(Tv>Y>BTdda| zpJI4s&hpd2zqKuLUdBaIA*~l}{0(tkrGwv`*#V6c+dsW7+?r-Prk&50;k}*rMgS=! zVKcz}exUB|APN7ML|wASPo8PgRdI8w-tTQzyt*_ns4DlM*K_DfU|ea*5bF*_Mp$fe zAaAR+=App536Ml1xP9cA+}M$a|u!pwuilk5)*KAvlchG`T(<>XQ?PF@5a({ zY|KhWed*Fifvzc@G@@1Bx3v=M4Mm9ZK-+3^Wi6DolBGEcC=jLj^!8p9J zR`J+R;k?0UbHtSrwRvg zfc5y%x07uYt#t-V-tsti(P*aZNA6kfTxS5Ry#;l%fOg zlV-|EBSl})2(UJe)ip%%(*EYn4h&ZPY3_vrn;P!y3eh?(d_7t_#1WvAm>ML+oy#H+ zf(x{G*D7$K;ut8(04qvRLLwEI2a=XH2T!DSoEMeeSD=ij0)dl#|31ph?Q@pcG6$U* zA7Nff$l2G|#>N#k;tEE1WvyV*c-$v(4|(p?@MbjZ)o zG{e!fCmnpZ0V!}itQQCDXHiDvAORZ`YuB*W=S-VTk8&IGiqr7GXGnsThsRC$3TZFS zB;E)!8agh00xtV6uxGD2@?zD;-K_Vk++I2|!?(iw4gYJ&@r4a}a8xZ=4gjj1&;=CH3_dDEjCDv5v1kpNKUc z807Wk-Dct}@i!=V!u>~odZ9i5%zrwS5jb{a{>2DY&jf;j z-nKnCSF;~tv5eu3N9s1wkYor9u;Nkof>U{tS5Pm#dUdnQod((eq~-cvh3~SrC(#}S z-E|NMUq58FY~nzmbi6agXYaH9V;_s&E5O^fp??!x8!J{9^g8j#2Rpos7*>; z*fm&CrI1XZUMV^}3uT$c8*KonNU+Sl4a5gxxJZmrhpjPb{*=?>jigAV!~#5bbX>mc z_)l#HZguhD;o&*Kx!+zneb4o$eYV2c{D2lsWfEX(O{z^QP<8?!TsNdNDglt2`bt+Y z^+%ox;zI>9GJL)`fFX+m*qXD_C6X17Er|LrrV+F&FH)&ZgT{cx@Z2Qd-;eezmQFPw zDiW$>2(M}lT=)hRM+N4YxU&APN^OufTH0engO+g1w1WBdpc4KrETjyt!}0yzn@j-) zDCE2d;~dNjVqv7aVZ$2om}5r};F~#Z@88QIl^(4eQjqaEDs}>6J+qcLb4HY;0_h!u25wbVFZ7>UHo?W72p$irYon)G#j~>m7D! zey|9!(G%_qRLTgp0EtZFFh>!h@ZvGKmai}G!2NeqXeTn&thT2e>i&?ka~ zn0BU~7v(kOKV$1-#kv#ciLeDBYab%|roFH38UmUli!t>lxd|aqEC&JXft@ z7)MkSrYKmcMnaUe#b>v|{@`R?ReiM`}AzhG1?w+0(Scs+rGk8O;@)sxstSk~SpuB7Vpsyh| z1MxZ@f)F6DmiBLfqCC2$WDKY#C2*w#?0_@@`%lq+CY}d^3eAsb2zR9|c?pF~aK?;i zs(JCq3EMJLQ0zFVV|*9^9!5+{C)NAm!!>}`zpKnm}j!bo0BYRX1$duxQ1KEndBi zhS={(I{MJR+uGZAx@}_80=Pwj=880PIlLU1L#pD>5k;KoYC}676#Yu9+%{G2=L%-f zzT6zO+6u;um*6EpUnSuql*wfbt_7BVW+ZEO2oPXzT?%-YjJyLn%Lo%mkkvGKt0|Yf zuZ}Z3iU++toA;o_=Rs>;wDx6VtN22y#RMpD`LoGPpCA_kNS^xE+msj=CykWi_$+)W z0e64_!pGpHMZ^S{J{AvM2)u?2fFNQDmXM-0s)imakXUeZL1r*^VFC~H7EjO;`;tEZ z1@s`>)&kj5YI|~SA?j`BlMU~6ZNQL7u~_7EAwv`^9?591H|L{ATgfzHm7ANJ`ELEj z4A17`pHDU`U7M>Ap-iCYfe~;*eWH43AdMA|^4RxB`$YmQ81#Z%5W5(nYZ@;7TM=vs z9hfGVltXkUzY~(o%g)_M|C+S71J#~5uOO`Wi>`!bPo4~tFYyGSl)~r1&&A!{foiy; z?4@NpPeLgm#@7)xhE4FKu{LOF$*@>|V$9$F!F|@g(+ELbaBCSs8EJ2CCjbwL-H3-$ zFnj4-${>3SHf`Qe?<#U2LG7U62TlJv$geoeEUiklHQcc(@q7`bk%|>)M9e18Dg?S} z=;Bx%`aq>iv4|u^c>6p1DN?-YZF@FV)Ln>ZK+ih`)XXjXJ{J4mUbQBMJp-;gvxDE>8zRQ`e=e5TR(4^Lu@)4p z8f=&TA01H*s`8Yf`vXS52arHQF%ZtE1opWF6kd?;g#S8Hs7LM|gtCZW^2q7w1vCoZ zf;75m)23zf=76NUXAaREdqS2yXVrlu8XHtKWE4_Vp3O)uyw+NBGjC+jX}N22y{u4oQ@f6V3d$6H6ETmN0bCFY+&~xEH8AY9ccq?HZNRI9ME@Brc%7khVAMf}404HOVYMsksZg3mAh=P8!HOB+8a*wP*rPa60Y zE{)PFSFY^&jB0>tJ;ZKREEax=)sar4hq1@sH^4;YfwHJN$-)@g(iZ5{sP}YM{4t&x zUi_^!%@||>sr3BfYSIv4h^Qw+5*7d8Zgn${HX)f2#s_*Pv1t&lkB_ge0p=BKMA8Sy zG{BOq!cIfHMOg+W_dK@wCxdV-OyUexfg)3zzPv)7MTNf8i-nk?eH(6^+#l~QQ&d~K zb}ewJ)PxEC0uz{$Iox8821>9$JQ7L8Wx{0mip-M z7Xp}MOaVSJa)F@F+riEbfKntyUiJHCL8U273Mdx?Cke?=9Upjw%Q?9tp2z#B8A9eB?2Ha+10{=z*u+^q*f}4mU-RA$E}wQaoT3XnII6@% zX1XfiCwl%ErtfzyG-ypnl=19sw7|@tJ9_k}|G?`BWH$va1A74ilZ$c+=7V<(WuZg^ zf>=Xdle2v|i7R`f@4( zBMg{*TSIy$=iEOJIGMx>zdG8hr6WI?<+!O?-ojRF_vi1%f(P7x0z-VAI@ zR2p(7a?6uW5FO?`diOioDquV$Duxq-0fiVAj3pEL)_~Z~R(VV=bk+oe>ql0P4)2F7 z$mSsH*e{EiqBnslXyTT)s&iL`;XCr$CPT&G@%>_gdlX?=N zxQiHY6gcPn$1o}qG-sOP4(aA!AvO^-0q<0`zfAoWpph*6gD@~qW@)|7jqh!1D4go* z67lMZ#0$;wL382r(69pGiD2r$~Vx8f2P_lbGg&-Mtn6ntg zhwL$ow-T36F1h*4;m$pmCbF+Cwtiraa7C0dHiVM*CtJ!+Nbp+4zcH;RxZ_@O45fMu z1PHnuD%)b zR;o?u>FJKm53*tJOh5qI{r8^}`4;@f6e#oF?jacq0B~e5!epd{v5h7TDY3g!UjqT@ z4lOzlU51&W{c!s=u&0m*^udGGV8Y-aO#psM*jXCZ-I#p`9q7ww-@r|_C1yL z{odq-R4f}EjlxzW3%1KGDVFh=3M!h&7Xc?Y7ib{r5pf+EIdBUC-S@&44&RC3;INPo z{a8CJ))-h1k6yuf@r=U zPT6zW_!{H{fd}Y&smp9@vnRh`O|gw%|Ahk|o0G9ux~UKbIIPYO2pC7x5ryy?iU;HR zsrvdVK(d1IjK_BohM!+qWu}n(l~X=#3^Khtd{&FC?weq;XmugA0--LHkdW|$EfOpc zmxfsYUHZ(CLP?mhD?7`hJ=>oO<-(f^c$nc>o05#mMS9-6BPb>UE$4yX0AL6MGm-7y zu0$YqZ^IU>RF3^m4RkfA$r&!)2-t>zkbtZkZ=Sv*0rn{_3gugf!3p_A^ZUL&Hj9`K zHgR>wr;5bd1pG9eARrFLDq2ub@X_h140CmfgPZW9hp$JybjXAE;*aws`iYy=hrVZK{<28*S>Uw2QHSZ#^t zzO>vajMjbEMR0PGLxyg`toic`JF(hYmjZxeK%uozJxV+fV2Bh&=IAj@=t6w74P}6U zTA4;L*t~2c(KyT&VW~OG?Eiv>N}!1wlVHFoltfhqs^(5gS%$e>&3@>+K!nR>fTyxT zNUz3=54N4thXFel8(mmzBEt;N8XvT#*|%qLQE@RjnMm3Lny9lBWCBIy!2Xbu0z)57 zzW(YT>#@6+tIlMY0fkBYM|I&pz&itJoD2@GAyWu2c>U_~!jyagV4@0-7;%sQ#z0-7Vq%LxUzR+? z*WbVejQf!T6x;s-&>nL8U06=pB<(x8tpyi;6-s;;smchW2|xA zbND7$RS$5cx*fU;W>DPc+lVND8UOllg2Zm5F86)=ma3we%zLAtC|?BJ8g}aWm=!{G z;Bzy)K3cOe!xyXa{0>SjSO9C6P0OJ#XJFcpgNy?bnLIYcQ-Ehg5O}`u6VP>90BkN~ zA6WhKD|y2=E!2xN;2KpRgWmq@SPWmpO4qB;9KQIKjdo~^mctF!dyvdmTMBWmT!;n^vQ~)K+Zn1RlO^^#H(w=!Z1HPXO z3AxDf{P4<@8f5@5!@v)t*dnt9!GAWp9I=_4#mBgG2qDrq z{E7Yjj*NdV1Zrl_{q_z!^1p*_eaC01Hu))-Vd8Jx-Q6qTp)o}wv3lTrHnq#ATBsY@jSea`&;IpfAgZ zMGi&%%QcWTe#PwP8^}R}2BM7|l%vsR);>kPhmhP!eZIH%GSZ^O)v-)TKLKDuFW53b zgfF4|CSk8bAV#SLZb?{ii;O78^V4Mk6A(!1dN8;aGam zQsYq`LX_J_KIN0M6jHz;cY`1&R41uT(Tmy|z*P{jK`@O}eD2-HrL8Zrh52U?tpX^i z<*?_8P$pK2Jb+Y{p*;&E93xpwQ%7zFlr>#g#-{M~p9%gA7-j9l?P(M*w-+8KJ13Zk zEny&goL5IkO2N`(#mDyWZFe{$Ay0p+9<=X z(&2rv&E(=GW&)+N!jfghi;tL{#qN-|aB_c#PzW`EjR*e!TU4EdA96F2nCT z)E@yAlW6q7=Zgtwq1;b@Pv)=!0s<(UNS-)SC=E*+CZp723ZUZyYN3Lm59I^txHLnR zs1G#x3ug)yqKZl)(>5$UAUvL{T4%ag9gRnHSJ{$kjZo$rkM;nvhoRP%3o6`B8LMPF zB7XyU1NXdnbi$%ols|~bW@B7*i99S9RD`gI0U_lAE~}Wa<0lF00WrDDOyV!BgZr*v zbcUE%GGvlu%WNZ(o3KeuvfQ@k4t6KTB40!Ma&i+s&{MORmOW{oVDZR$i^v;+f-g`9 z?Tv=Wc~lP*sf;Ek;u_%rrLQxW5zUfNpiw6Tb(Ud7QKYOTH}Phqoq~82&Hb-~B)YM% zI5EVgHZ*Lb7SA0!ZqVmf?0w~yjIsO_l)j-TO(I~}5N^T}Uo}K6s$6t`V*>Y^hus9t zg^jWa+H)1|K-|1jN$6ZEH>%LxQVC2Kcm}{DOe4UbxE?I33oH@@QH!mNoWuma_Z%JZ zqwEb{(F|rIV!=>9#{n8}9&MugXX5Mkc9+j1f)#`nXQu@*_4DS>r`Kq8WpCbG4ayQO zhec=LbV63Bd>f*XLT*1O8)hgqbg}*!m*YnY)6f+srr~c1r&$;a&4ndy^Wet66qR{x zy_Oc-W~R`-F5%*&qA#+^J9G(ouj?;l26}@7kQbB9)7L^Nz_Ke-9RWm{tvjA6i26=S z=gVtr$QJ(UNZ+Fw`X!~OE&_ZP{O~T?Zhm>iUJ`+Ec^z@_#wtF>RshU9QT})bA*^X+ ztj;G3qs|w;HlR?1&_cteDZlRF_ByQF<*+7HE(O#Hkt?l0W8Iy5*DUk>tw3HH1Eol@ z{r&x^q?`(BmB|(wAGDn;9AR=6H;@9KG&HR0QJ!Tpj%gDl<*mQ}0*kt`@Dd0T#x*kq zu}ca`Kb2NKU3z(CsG0Wy6+b>z;@ zfT^J9ak$b;;7!AZ)szoI_r~43O5`%CO|_{7sKIOhdF)vFcz}|+v3N_YbE4^X@9rE| z+uFJ!ondy}4;b~YnRy;@BZ0bu;Oas!^8~7(jzN$0pmH>hVHE(LC1Bac+F>`I1sZii z)5`sQZ;wL-CIb|$vx@xGaT}mEFz>-GrUAQmqQoRO9=IhJ;Ld`n6lxJkC}Lvo69EO6 z6D?f8I_EX`rpv=ZkHE&>bNZ_d;RJ>5C&dO&Kwi4n&@{c=S_{UIG=Oob1^QQ$ko0yoxhTNp4^X=t+s1YmV6rbndJ^P_1)HOI-|_U^ zf4l$=r}d&%Cxd9c6pWD5s^o0A^ck#^vkqPn;}5#7gnmDY=f9L%KpV76Yz9I#C3d@~ z$BDppU?tZ4OxQaBRTm*0qxI0YCpohU_p8KMuh{poS)D*LK#K|3XPV~r=aV{?wHY*05beD*(dJV0Sy7~xNQR5aB{D=vqrKd)7z^i1> zNIf#;3p`NBnPjM|G{imKF=muYi9aQV87c4dVw5tHX3?!n+BBLLwPWWWFr3Z=iVedO zcnP+kr(uf|YpoA%hN?_WmLNEEQ4=sF)38)k+*$*P7NRC5*qd(4m3pv{5(vpsASLrO z0uo}=6831GLW0Kl8T9-VktTe{6knIP($CO_{kWf{k@Zi&tE^mezheY=kVHw)N)&%R^ z`{eRNitEnqxN3ZT?J-?o0;Z%KPfzF;b#?;eAHoHMi$Eq{c(2T2k@LLiq z9@Z78^$ep&N^(Jq2RT1eEU7huTtdjCLXa(iM7jGe)G2KP@^pSHaJ=fiH-Eyi0fU1S z-Z24C1B-ZhrZ1w|l0YIVG+x8*NwqyiZs3hYAPbPojN!TO+D#i`&iJ6qDo}wzb6)LN zM)8!I`|T2KB6Lf}!NtOfq1}Z18oOg`;D<+#A3LHS{S|t|xH{Y%b>F*ysJozdFbs@B zna03O8??1`I9P8Kl*uJXEv7Vh=nz6qD7Z?E1 zSf=pzm{x_27oqp!%eI}T@nb|d<|p^FpALVd(w z5`=a67!@;A)l|MA4R?|M7rW+sM8qOC38k++aE*b*{H3?$D(8m&M6e}mBN0L}Xj4V{ zj6t?3dF@7&9%@5cO#YvJ(3D;SSy+m+3zVv75~FvWiiu(QPusWDq1X4B+7R)Qkl$*t zHNKY251|wes-eVJL(xl}KGE18p53!_f9;)~XWEc+fE_OfAJ#xZ*bHr-O^s3T^ZI|z z!?^+kR~PDE9d62>udG~mujLsvVL>|S63(7PSG(%BOi{5Ny`S`1m!_>`eFc{B-o1-kEdm2`sn20tf%B>Yn;^TwhlB9aM7!A#kB9&?O`N$sbDcvzZ%#_dKsuH z-mR*%Ez%Z357A6<``&9seb=BLK<5%CgR*cZ!Di<6M9>-q$s}2#*rjKxd3_ZAF-}azGbKuT&ufTGFnwJ&3?Y@!J&rsB|O)Km|2GBCFd% zreGLL>RYkhW|m@Ej%F$P6oFXycIdDYinUDO7)$6bwmMj3SUd)>-cbiBg;VTHCGMjf zC#Ar-@U|RTmuTG+(7+y}$`mO~iSi|LJRPyZb~1?|RUijQ&;&^1#K0D5;DW!`oQ{E$ z3>pF_LGMb48CZZkNOWulcUVFTDc*$IHD&EvhgeSi#eYtmp#zY8l}t$CkNBo+K3Hpx|L z#euPh>H#wMP-8HxzKsyQkfa2+0V>JcS%gudgrrA)LIl%`tVKNCj$r~O(|YPcNFbO@ z7@O2f2>IBN@+fs92mmoF$qwvx5=Lo)|D5v+^~H(q=6Q`Oz*15F=?Y1FvT;&vD@X{D z(%aUh6Sg!*!qANSG_2bK2?vWXSl=&Y zjBiIA^+k6fm8`_Cfyz+g-aK0nZ{8}9E~kU3dj-oX!uv&h{=~woOSmhFM3~|GzmPl8 zFVxhHJWZ&Rv{l3(YE7eB0|yh(Bg%#C>;ms#vCV+A5L{0dNr(U{m@KM;n1WQA`x0)t zr^Xn^hI`5Q7&ehA(Vs~1NQ1n`8?eF^Lv@<+18h(`rr)@60}PDu8JzZlPZ2b~>f61@ zrH9nFZJ(EjVU)HKHAhARgl|falrlkTO0fw&w&ZIN{$iYigmBr(Q~(jgU{U+*uMn4n zL5J27xmX&XOCzz!%~->A%?Z>j5Xh03=Yt&}%?4kzyFeFfoP;6Fihz`Zl4k<~Y7PFH znov+>$)f(_!~}`^mJor3e%vi{-z(oTaDF`|5?rVEOA(+GA(5WK7dIg{O z^4{281aFdd0 zyTL2LE*TBViD5`BRe6PVLS-kl;{z@kLFL!gMkHh0S@+_Ae={JM{ZfZWUnWTk3pE^| z9d`lm%!C%2he-t$USGEJX&l%QIzs^u#HB?*xj}{0KeD#1`@ zNePY?&=?trCd33C!@blDPe}06Z5`4M@g5)?$*qIT-GgmJ`wUcm8~Rp>3?a}LJvKXd zrv({HsNveH*+(1FI9XWx-aU8XW&m5KVYBO(Dd@oW=ZVsQT>&PMx_Hn@hXAt&_POIT z#%7lRMO4LZ7U9y3{Gu%Lkl_KVnLu@Dda_jBaOPXaPk`f05 zt*mG0V?I|RZ!h9sgNsP6QjzQ3(0M@KGV2;>zAo%n$MPG;n*E3NqA6mvlga~@(BiEo zP$&nAI^?Y%C?^V@2nnghg0u`9X4X>d*2!b{vh! z5&s_%(}j!=5|FQhE?-vjxlJ-HG9sPVK)!8i1D!to1~T|)ZwKFm2@T&a`{1u&SzanO z-)#H4(J&l>fz`7IdxH`g^^L=Nduw>xf59?Ku^r@+xptUN-7tS+31luup(D6toLOLh%Rf2}K#vFO+|Bk&g#1yBWty5iTb z?P;h+R?>rx?yv}httSqTN)-!jSP|C;yjT#}0?v{duz6P&l?qBb0YwURQ`2_kvO^S5 zTD{T`0$G$Ms6_>A5{%J{QRLC_J17H{pc*lCV`Pvuo#>*iDV7`9 zoPpCcQ^*-WH^S^dDW-y??e)Vwl&RC^j~tw?nR55wcNdc5i6jL5MXjr_WL@TlHVPa} z>o;(0(8)-kEGW<>h`7f72wp^`4lP#E@ObQ=%}GCI#vOPZUIiuM@lEImP0@R z(XW}CIhcC*rvtY^ae4B}aT%NvvLGA^f)3Y{sik*604_AA(rr|8~=$VwU|Ymua60q+q~ zD5BnjLm~-~ooxiUn+{7Mat%NCy+7Z8rWcFlS_i)+eo`Le<0{Q%+YE43I$DhEnWTu~ z(7EZ;r<=fx$VCl|Fv?&_ZJ4+t$UTT_188c}?bokgUo%7sDZ^|87z{1M!E;W?yEuVI zuf`5}m>2=-qed=-wL-CQ5kLsjri6uQYw6$+Oa4`&#?erYfup13un$SRCz_u(1tqUB z1;U<4GCLJo(o zIPkFt`TaU~n}*tbYM6+~13U)eEfnQwEFC7mWyt8o81VwEy!;+`dwr24m&4A(Cb0}s z-h6uH%@g=V4Ny0FqQHcfRplW{e>bohgXdqZE#Vh~jFbom2Zb3>zni(RCa?vtr*#%G zKb=uU!Z7_c2Gp4wtC?YW`DK$@XOTS|eTEbsP#46$r7IT%P!-9E0ro-*@{p?ka2C0a08%b-127YS(`Q0Y zA$wb3&ME-N$oxu*8xe50ug%{xg(PRm!ht~14mt+6^kUMMZ*gO?U*avP?Sc&A5b>9Z z!6<-uyn_Dj8BU6#Gs%bwiH)W|*SvSV)lIRZEXoXhx**r$0|OaC!Q3+=z>!&l5(JT6 zfe#oF8wsY&@Jma28Adh@QKv48}NDLzi~zj|ARAnJWL0B!RyIl)A5z! z2j4HfHF`PQ@7;nW`)mLAn`K`KSoriz-HkU6a-~N3{y(WtX~NSpj~+cr%G4PCv<^o% zT>5LmtU4%8L_tDhMDJpO6cn{ZK|Qnu$4x-pz}D!8 zkAIHdq+MA7qj_XN#Ui54TgnJs8)=!fP6sC#3$MdqhLtwRmZhP5DZmDJBAlW@ZQB6W zFTxIr(n4rW1;=2!A0#W8chPD&xAZoh3dEbUZ2s{RZ0!*CyI)>EN|YcPMJ@#sl4c%* z;7E(d;Tm+72Kg~iPF3Xx1n`z--%J%M?*VO5FWatzN&FJp z05N-odu{1iK!^k;J0m5N%tWpe#HP!_gP4+i<`2iT*+OT7 z7D-giUFdLJ1}Euk8|y^M>0b z>1hMG`A%MpgiAsb-5a#wk8l#qcltt990v^A} z1KbpEgt|>mv;!1j=h38CkF* zDS;A07AZ(~_~eDtus$T=pj5ELFL6|v2jqTW?nF?~79U%1qT)jj`W&(&y-0ng)Xze)Cz-*hGX$yf1P)UZ(P-(iN93QQ=x`cJYAjkL zK$Z|2h@qv)$LZ6ibS4L=ve^0DP-6M0(1U5M1r4J5^peDZhMR+v7qR3Pvyni_)AuBczQ$a>-Wq63E->1A zkg~}sh@+O{an$hrLqBd~HG!X4fck}OzX%OVVzcOLw)+J|2O7}rL%ECqE|`>ypg5a- zI>eB=bpYJ9AjpzLO4g#D{pjnqU9yzETF_+R)~bL3DJN+Uw<8e^n&nxR`sYV8=-udG zVCsl~h(r(Y`YwHq@hZL`@;L`-1G)xr!}JMaH(7Mr79F932-W}hWCdW$)dZY~7h$7N zx?qB{uz0~UPzTVP>y$@aHNf$PtaviMyiYIwN+)N4n=eOU(S{|YEXBPiUQ!I?gE8oE zVyf^eCfL28GS9O>xIHO7bxVLgC%LP2rO9wCf(Vq~SL7?g&&d1~kZSbf%J#u z@ri__A6w!C>8IcuHF1+c0WpOZCWhUC2N}^&iXQb6a2;3*{W#i<%!K4<#;o$R6Et@m z!AF#FCM>BnL@$87Fbxq`C!0B!SVugX3AX8Ly%M;vDJk@C1gysZ5ZLaogS3O~z&C^Y zxS@UzbSDHlnTPeCvf~eWJF9r6f^`yvZ5<9kP6q1aUE2FkqHbz%$dvsLiHgU%h${xk z8o0Gh2S2O|`*_V;82FJ}dS^+jbZgb5oX8QxL0^!!%{DyS0;>Ps-UB&1{^4x?gE7h) zyUoP?1PUctBr}9KQ@HPeGkM9FyJn!z(O@UT5&D`1>%}cQD6tC-$GZL+Tk~x+&@zIy3a|3ZC!3g$;;vN#qs1Zd1mPl+?rqqe{59CBN)P;}bm4E$}UH0PRLy!BLJXT#m5r z1YI3xiua5w#x{vX;{*<*l9rRxMaWS+|3V#mlZp{;i|MD*HJ73L6J>f2kUSj@i+hG=&p_iVoq|GQk|(4w9CW=K5i+vu z3ejw&cTh77F5`rba(FUc`|#JMF_%|iu(5(e`?DZ()*x-lmEKN5bBZ}~m!i;Ov)!-@ zpe6$O7T-}y)=+%XY85R{41u(W;7AL3@ zc+Nme^otHXVu2FTscsQsbMV7*Cs+&A%3e=TY7J~47zme*ESqRuI0l@R&kj*X_OEj7 zU9UY1s^rwd3Zjst>9hV5CP>Gs41BMd_(N{ZEEYT}cV1wg2Vo(>-3Z#J9rR-7$w+=WR*vxCuibH1_ z{(NJHTy@yKcMs+f=%{L3=AAqK?Xh;x)DDuZ5oY{qoYoyn4N7Rxi=CgH0Wd-eDxK^M z>1`>TGq>#52V?`C`iXMd%pgAJOLr}Qw|js?^|8A8oRa%hhNd? zfw$_xZhbCuj@cEB(O(1u1hA158=00cgl3*m&JBP2dH=Td_-`&pAI{kswf#MHom zrfU=Mf2>8QD_|j1jC|qu9?wl09m+hyfpnHB4mVN8(uwM@NHAGMOce@>H;r%BBiPe1 zy6BB%v9VdIA(TaAPd)@GkSGCoxE7y?y8eQiAJo6TTt^)g;P0aWj-7y?u^9ja{Rz&I zV;a*F4|SE+k)WvCs{bVFBTI4t&gdusY&_Uc>}&SD>s2EKf}|BT@^vMk9>p3m4WSc= z6Yg{1AP&o<(|Ax`(@C%RWG%pW1hyvz6pvxy>Wb4`5PPt{@zk6?^3Yl-Q;M#onFS?oM-+MPR z?F2LmIxmReIl0-)Z2U}t*iFFnd*BPiwvv^KYe@AJL1-oNh9vkTry07ax6#sK+pFh} zLu$$3giQn4nZ8VC0TexcO#RsRanLeY$7qBk8!GwU-oJu%>;$hp?4*i{UPQstY*plE z>V3swQK=95PNGnd zrlm7^iFPHKL}T=e#-@!MTMzZFM@XY%`$<42pAV#5-t=*ETERE+HPg@kDHH;rH3m?p z-Yts|G=s#0{TYqVkA~t@50@j8McOCybG$2QbWmO$Rq@Aeb_Ayi;$g&B0@i@Nv}4vs zaz>CWN75{E1mu=;EOM72AsJzHEZ_e3pA%N^f@+#zlb=T>7_>dHIlRMzx2c1xq#n}= z5{Fuc6@cv8q`9}~A`Jzo2JNxi1VklZ)V%8RZuS-BeQSZ)Yf!47BlY;yN{!JU`h;&~ z(7Rt#OiK)QNjkfqG(!k06m&?vK$n3BP7tJ{1K?GY|2c>O@Zs5-@T(#6Iza@c2`Bde zfDRoEKn76gCG<~4`1G|I!fZ*VMyyggF`dYJ+G2EiH+sH^ZU*&4J&*KH-5{c!k3k^D zdFKw;Y8Q}8W5IvMGfrh zVicOa@EUY#Ka8`csFs%Rd-Lf1L`;tJVS*wBQs|S61p}}L9pDzlR6inUZRAjoB69a8 z4hosRg3nRVnm19ch1X({UWD^4DC+@>M~@Dsj?%N!5t3$p7J%D9wotklw+N^nhQKdn zzQeFwQ_nFOJMnJ`!~_28a0ohp|K04a^Ar{7=vkbPMAZyHbb2EFwuYi*DGFG^iAH2?qr literal 0 HcmV?d00001 diff --git a/cassandra/reader.py b/cassandra/reader.py new file mode 100644 index 0000000..42f99ea --- /dev/null +++ b/cassandra/reader.py @@ -0,0 +1,47 @@ +import os +import argparse +import mmap + +def _read_logs(filename, text='Used Memory'): + line = None + + with open(filename, 'r') as f: + line = next((l for l in f if text in l), None) + + return line + +def _read_logs_2(filename, text='Used Memory'): + with open(filename, 'r') as f: + # memory-map the file, size 0 means whole file + m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) + # prot argument is *nix only + + i = m.rfind(b'Used Memory') # search for last occurrence of 'word' + m.seek(i) # seek to the location + line = m.readline() # read to the end of the line + # nextline = m.readline() + return str(line) + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='[Cassandra] - Memory Reader') + + parser.add_argument('--node_count', '-nc', default=5, type=int, help='Cassandra Node Count') + parser.add_argument('--cluster_name', '-cn', default='test', help='cluster name') + parser.add_argument('--conf_dir', '-cd', default='/mnt/extra/working', help='ccm conf dir') + args = parser.parse_args() + + + mems = [] + for i in range(args.node_count): + line = _read_logs_2(os.path.join(args.conf_dir, args.cluster_name, 'node{}'.format(i + 1), 'logs', 'system.log')) + if line is not None: + digs = [int(s) for s in line.split(' ') if s.isdigit()] + mems.append(digs[0]) + + assert len(mems) == args.node_count, 'All nodes are not up yet' + + print('List of mem used ', mems) + print('Total memory used for {} is {} MB'.format(args.node_count, sum(mems))) \ No newline at end of file diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index ccfa5c2..01d3162 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,16 +10,20 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" +export HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" +export HADOOP_CONF_DIR="$DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" +export HADOOP_LOG_DIR="/mnt/extra/logs/master" + JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" -DN_DIR_PREFIX="/tmp/dn_temp/" +DN_DIR_PREFIX="/mnt/extra/logs/slaves" if [ -z $DN_DIR_PREFIX ]; then echo $0: DN_DIR_PREFIX is not set. set it to something like "/hadoopTmp/dn" exit 1 fi -mkdir -p DN_DIR_PREFIX +mkdir -p $HADOOP_LOG_DIR +mkdir -p $DN_DIR_PREFIX run_datanode() { DN=$2 From 70231722bc7ebb6a5fe6017e60b01ebe959d6752 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 13:53:39 +0700 Subject: [PATCH 32/50] add custom log dir and cassandra --- hdfs/run-hadoop.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 01d3162..32aebcf 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,8 +10,8 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -export HADOOP_HOME="$DIR/source/hadoop-dist/target/hadoop-2.7.1" -export HADOOP_CONF_DIR="$DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" +export HADOOP_HOME="/mnt/extra/source/hadoop-dist/target/hadoop-2.7.1" +export HADOOP_CONF_DIR="/mnt/extra/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" export HADOOP_LOG_DIR="/mnt/extra/logs/master" JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" From ded270bc38de1b54b120e833186bdcaf989a9514 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 13:55:38 +0700 Subject: [PATCH 33/50] add custom log dir and cassandra --- hdfs/run-hadoop.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 32aebcf..c1f3f38 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,8 +10,10 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -export HADOOP_HOME="/mnt/extra/source/hadoop-dist/target/hadoop-2.7.1" -export HADOOP_CONF_DIR="/mnt/extra/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" +$PROJ_DIR="/mnt/extra/ucare-research" + +export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" +export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" export HADOOP_LOG_DIR="/mnt/extra/logs/master" JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" From d5950d7f1baaf44cdeb0d139e7f11f820c16c3b2 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 13:56:08 +0700 Subject: [PATCH 34/50] add custom log dir and cassandra --- hdfs/run-hadoop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index c1f3f38..71daada 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,7 +10,7 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -$PROJ_DIR="/mnt/extra/ucare-research" +PROJ_DIR="/mnt/extra/ucare-research" export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" From 4cf9240ce8480d010c760210010281634692d2a9 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 13:57:17 +0700 Subject: [PATCH 35/50] add custom log dir and cassandra --- hdfs/run-hadoop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 71daada..bdfa1fc 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,7 +10,7 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -PROJ_DIR="/mnt/extra/ucare-research" +PROJ_DIR="/mnt/extra/ucare-research/hdfs" export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" From e9b089ae54a59cc795712c8e6fa7125653214cdf Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 15:02:03 +0700 Subject: [PATCH 36/50] fix env --- hdfs/run-hadoop.sh | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index bdfa1fc..25ad00f 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -10,14 +10,13 @@ DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -PROJ_DIR="/mnt/extra/ucare-research/hdfs" +export PROJ_DIR="/mnt/extra/ucare-research/hdfs" export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" -export HADOOP_LOG_DIR="/mnt/extra/logs/master" -JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" -DN_DIR_PREFIX="/mnt/extra/logs/slaves" +export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" +export DN_DIR_PREFIX="/mnt/extra/logs/slaves" if [ -z $DN_DIR_PREFIX ]; then echo $0: DN_DIR_PREFIX is not set. set it to something like "/hadoopTmp/dn" @@ -27,6 +26,18 @@ fi mkdir -p $HADOOP_LOG_DIR mkdir -p $DN_DIR_PREFIX +echo "Moving conf file" +mv "$HADOOP_HOME/etc/hadoop/core-site.xml" "$HADOOP_HOME/etc/hadoop/core-site.bak.xml" +cp "$DIR/conf/core-site.xml" "$HADOOP_HOME/etc/hadoop" + +mv "$HADOOP_HOME/etc/hadoop/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop/hdfs-site.bak.xml" +cp "$DIR/conf/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop" + +run_master() { + export HADOOP_LOG_DIR="/mnt/extra/logs/master" + $HADOOP_HOME/sbin/start-dfs.sh +} + run_datanode() { DN=$2 export HADOOP_LOG_DIR=$DN_DIR_PREFIX$DN/logs @@ -39,17 +50,7 @@ run_datanode() { $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } -echo "Moving conf file" -mv "$HADOOP_HOME/etc/hadoop/core-site.xml" "$HADOOP_HOME/etc/hadoop/core-site.bak.xml" -cp "$DIR/conf/core-site.xml" "$HADOOP_HOME/etc/hadoop" - -mv "$HADOOP_HOME/etc/hadoop/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop/hdfs-site.bak.xml" -cp "$DIR/conf/hdfs-site.xml" "$HADOOP_HOME/etc/hadoop" - -$HADOOP_HOME/sbin/start-dfs.sh - cmd=$1 -# shift sleep 2 From eceaacd20a7e6b8ea66f67f714ea8da90b4e231a Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 15:03:09 +0700 Subject: [PATCH 37/50] fix env --- hdfs/run-hadoop.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 25ad00f..0554403 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -14,6 +14,7 @@ export PROJ_DIR="/mnt/extra/ucare-research/hdfs" export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" +export HADOOP_LOG_DIR="/mnt/extra/logs/master" export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" export DN_DIR_PREFIX="/mnt/extra/logs/slaves" @@ -50,6 +51,8 @@ run_datanode() { $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } +run_master + cmd=$1 sleep 2 From c2a9172e0bf53cb2e40c9ccacdfb36bb882dcc5b Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:20:41 +0700 Subject: [PATCH 38/50] fix env --- hdfs/run-hadoop.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 0554403..6f7d959 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -14,10 +14,10 @@ export PROJ_DIR="/mnt/extra/ucare-research/hdfs" export HADOOP_HOME="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1" export HADOOP_CONF_DIR="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/etc/hadoop" -export HADOOP_LOG_DIR="/mnt/extra/logs/master" +# export HADOOP_LOG_DIR="/mnt/extra/logs/master" export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" -export DN_DIR_PREFIX="/mnt/extra/logs/slaves" +export DN_DIR_PREFIX="$PROJ_DIR/source/hadoop-dist/target/hadoop-2.7.1/logs/slaves-" if [ -z $DN_DIR_PREFIX ]; then echo $0: DN_DIR_PREFIX is not set. set it to something like "/hadoopTmp/dn" From 96347f050e467b369d70a5c5f547a3287cb4b721 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:28:38 +0700 Subject: [PATCH 39/50] fix env and add reader --- hdfs/reader.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++ hdfs/run-hadoop.sh | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 hdfs/reader.py diff --git a/hdfs/reader.py b/hdfs/reader.py new file mode 100644 index 0000000..34b3afc --- /dev/null +++ b/hdfs/reader.py @@ -0,0 +1,55 @@ +import os +import argparse +import mmap + + +def _read_logs(filename, text='Used Memory'): + line = None + + with open(filename, 'r') as f: + line = next((l for l in f if text in l), None) + + return line + + +def _read_logs_2(filename, text='Used Memory'): + with open(filename, 'r') as f: + # memory-map the file, size 0 means whole file + m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) + # prot argument is *nix only + + i = m.rfind(b'Used Memory') # search for last occurrence of 'word' + m.seek(i) # seek to the location + line = m.readline() # read to the end of the line + # nextline = m.readline() + return str(line) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='[HDFS] - Memory Reader') + + parser.add_argument('--node_count', '-nc', default=5, + type=int, help='HDFS Node Count') + parser.add_argument('--cluster_name', '-cn', + default='hsgucare-datanode-node-0.j8gc.ucare.emulab.net', help='cluster name') + parser.add_argument('--logs_dir', '-cd', + default='/mnt/extra/ucare-research/hdfs/source/hadoop-dist/target/hadoop-2.7.1/logs/', help='hdfs logs dir') + args = parser.parse_args() + + mems = [] + + line = _read_logs_2(os.path.join( + args.logs_dir, 'hadoop-', args.cluster_name, '.log')) + + for i in range(1, args.node_count + 1): + line = _read_logs_2(os.path.join( + args.logs_dir, 'slaves-{}'.format(i), args.cluster_name, '.log')) + if line is not None: + digs = [int(s) for s in line.split(' ') if s.isdigit()] + mems.append(digs[0]) + + assert len(mems) == args.node_count, 'All nodes are not up yet' + + print('List of mem used ', mems) + print('Total memory used for {} is {} MB'.format(args.node_count, sum(mems))) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 6f7d959..b4cdf72 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -25,7 +25,7 @@ if [ -z $DN_DIR_PREFIX ]; then fi mkdir -p $HADOOP_LOG_DIR -mkdir -p $DN_DIR_PREFIX +# mkdir -p $DN_DIR_PREFIX echo "Moving conf file" mv "$HADOOP_HOME/etc/hadoop/core-site.xml" "$HADOOP_HOME/etc/hadoop/core-site.bak.xml" From 2b5949bf3ef90f6b244ca10d20a631c0b6fcf311 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:31:01 +0700 Subject: [PATCH 40/50] fix env and add reader --- hdfs/reader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index 34b3afc..d108edb 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -40,16 +40,16 @@ def _read_logs_2(filename, text='Used Memory'): mems = [] line = _read_logs_2(os.path.join( - args.logs_dir, 'hadoop-', args.cluster_name, '.log')) + args.logs_dir, 'hadoop-', args.cluster_name + '.log')) for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( - args.logs_dir, 'slaves-{}'.format(i), args.cluster_name, '.log')) + args.logs_dir, 'slaves-{}'.format(i), args.cluster_name + '.log')) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] mems.append(digs[0]) - assert len(mems) == args.node_count, 'All nodes are not up yet' + assert len(mems) == args.node_count + 1, 'All nodes are not up yet' print('List of mem used ', mems) print('Total memory used for {} is {} MB'.format(args.node_count, sum(mems))) From 79cca27205a18c89df54690609f7e722609af4ab Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:32:18 +0700 Subject: [PATCH 41/50] fix env and add reader --- hdfs/reader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index d108edb..c29cd77 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -40,11 +40,11 @@ def _read_logs_2(filename, text='Used Memory'): mems = [] line = _read_logs_2(os.path.join( - args.logs_dir, 'hadoop-', args.cluster_name + '.log')) + args.logs_dir, 'hadoop-{}.log'.format(args.cluster_name))) for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( - args.logs_dir, 'slaves-{}'.format(i), args.cluster_name + '.log')) + args.logs_dir, 'slaves-{}'.format(i), 'hadoop-{}.log'.format(args.cluster_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] mems.append(digs[0]) From 0aec2d8d1a8600f980f369d29e19f4a077afedc7 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:33:55 +0700 Subject: [PATCH 42/50] fix env and add reader --- hdfs/reader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index c29cd77..ccc39cd 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -39,12 +39,14 @@ def _read_logs_2(filename, text='Used Memory'): mems = [] + # master line = _read_logs_2(os.path.join( args.logs_dir, 'hadoop-{}.log'.format(args.cluster_name))) + # slaves for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( - args.logs_dir, 'slaves-{}'.format(i), 'hadoop-{}.log'.format(args.cluster_name))) + args.logs_dir, 'logs', 'slaves-{}'.format(i), 'hadoop-{}.log'.format(args.cluster_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] mems.append(digs[0]) From 4706c63ed24b14aedb163f3a06253fbe2e32cc9e Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:34:24 +0700 Subject: [PATCH 43/50] fix env and add reader --- hdfs/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index ccc39cd..2386eb5 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -46,7 +46,7 @@ def _read_logs_2(filename, text='Used Memory'): # slaves for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( - args.logs_dir, 'logs', 'slaves-{}'.format(i), 'hadoop-{}.log'.format(args.cluster_name))) + args.logs_dir, 'slaves-{}'.format(i), 'logs', 'hadoop-{}.log'.format(args.cluster_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] mems.append(digs[0]) From cdc50c8e97c39bf3722ba1fcc0251f6f5d7af90b Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:36:03 +0700 Subject: [PATCH 44/50] fix env and add reader --- hdfs/reader.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hdfs/reader.py b/hdfs/reader.py index 2386eb5..e2081f5 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -43,6 +43,10 @@ def _read_logs_2(filename, text='Used Memory'): line = _read_logs_2(os.path.join( args.logs_dir, 'hadoop-{}.log'.format(args.cluster_name))) + if line is not None: + digs = [int(s) for s in line.split(' ') if s.isdigit()] + mems.append(digs[0]) + # slaves for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( From f5f415608b831e93160f6fb4990a32a42fff7194 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:44:40 +0700 Subject: [PATCH 45/50] fix env and add reader --- hdfs/reader.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index e2081f5..c94532c 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -31,31 +31,44 @@ def _read_logs_2(filename, text='Used Memory'): parser.add_argument('--node_count', '-nc', default=5, type=int, help='HDFS Node Count') - parser.add_argument('--cluster_name', '-cn', + parser.add_argument('--namenode_name', '-nn', + default='hsgucare-namenode-node-0.j8gc.ucare.emulab.net', help='cluster name') + parser.add_argument('--datanode_name', '-dn', default='hsgucare-datanode-node-0.j8gc.ucare.emulab.net', help='cluster name') parser.add_argument('--logs_dir', '-cd', default='/mnt/extra/ucare-research/hdfs/source/hadoop-dist/target/hadoop-2.7.1/logs/', help='hdfs logs dir') args = parser.parse_args() - mems = [] + nn_mems = 0 + dn_mems = [] - # master + # namenode line = _read_logs_2(os.path.join( - args.logs_dir, 'hadoop-{}.log'.format(args.cluster_name))) + args.logs_dir, 'hadoop-{}.log'.format(args.namenode_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] - mems.append(digs[0]) + nn_mems = digs[0] + + # datanode + line = _read_logs_2(os.path.join( + args.logs_dir, 'hadoop-{}.log'.format(args.datanode_name))) + + if line is not None: + digs = [int(s) for s in line.split(' ') if s.isdigit()] + dn_mems.append(digs[0]) # slaves for i in range(1, args.node_count + 1): line = _read_logs_2(os.path.join( - args.logs_dir, 'slaves-{}'.format(i), 'logs', 'hadoop-{}.log'.format(args.cluster_name))) + args.logs_dir, 'slaves-{}'.format(i), 'logs', 'hadoop-{}.log'.format(args.datanode_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] - mems.append(digs[0]) + dn_mems.append(digs[0]) - assert len(mems) == args.node_count + 1, 'All nodes are not up yet' + assert len(dn_mems) == args.node_count + 1, 'All nodes are not up yet' - print('List of mem used ', mems) - print('Total memory used for {} is {} MB'.format(args.node_count, sum(mems))) + print('NN used ', nn_mems) + print('List of dn mems used ', dn_mems) + print('Total memory used for {} is {} MB'.format( + args.node_count, sum(dn_mems) + nn_mems)) From 40e225989186050631f8248133d24762f5bfdfc5 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:46:45 +0700 Subject: [PATCH 46/50] fix env and add reader --- hdfs/reader.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index c94532c..ffe16cc 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -29,7 +29,7 @@ def _read_logs_2(filename, text='Used Memory'): parser = argparse.ArgumentParser( description='[HDFS] - Memory Reader') - parser.add_argument('--node_count', '-nc', default=5, + parser.add_argument('--additional_datanode', '-adn', default=4, type=int, help='HDFS Node Count') parser.add_argument('--namenode_name', '-nn', default='hsgucare-namenode-node-0.j8gc.ucare.emulab.net', help='cluster name') @@ -59,14 +59,15 @@ def _read_logs_2(filename, text='Used Memory'): dn_mems.append(digs[0]) # slaves - for i in range(1, args.node_count + 1): + for i in range(1, args.additional_datanode + 1): line = _read_logs_2(os.path.join( args.logs_dir, 'slaves-{}'.format(i), 'logs', 'hadoop-{}.log'.format(args.datanode_name))) if line is not None: digs = [int(s) for s in line.split(' ') if s.isdigit()] dn_mems.append(digs[0]) - assert len(dn_mems) == args.node_count + 1, 'All nodes are not up yet' + assert len(dn_mems) == args.additional_datanode + \ + 1, 'All nodes are not up yet' print('NN used ', nn_mems) print('List of dn mems used ', dn_mems) From a8778bd881252d38cacc0617751d82c7972e8eb8 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:47:16 +0700 Subject: [PATCH 47/50] fix env and add reader --- hdfs/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hdfs/reader.py b/hdfs/reader.py index ffe16cc..e6b4a24 100644 --- a/hdfs/reader.py +++ b/hdfs/reader.py @@ -72,4 +72,4 @@ def _read_logs_2(filename, text='Used Memory'): print('NN used ', nn_mems) print('List of dn mems used ', dn_mems) print('Total memory used for {} is {} MB'.format( - args.node_count, sum(dn_mems) + nn_mems)) + args.additional_datanode + 1, sum(dn_mems) + nn_mems)) From fc8f0e62f130428258b8815171efae3e1b6f7b36 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 18:50:14 +0700 Subject: [PATCH 48/50] fix env and add reader --- hdfs/run-hadoop.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index b4cdf72..67cb7ad 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -24,7 +24,8 @@ if [ -z $DN_DIR_PREFIX ]; then exit 1 fi -mkdir -p $HADOOP_LOG_DIR +rm -rf $HADOOP_HOME/logs +mkdir -p $HADOOP_HOME/logs # mkdir -p $DN_DIR_PREFIX echo "Moving conf file" From 40016375d3a4eb318fbffb09b602998bbe0b77b3 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 7 Jul 2019 19:11:29 +0700 Subject: [PATCH 49/50] fix env and add reader --- hdfs/run-hadoop.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hdfs/run-hadoop.sh b/hdfs/run-hadoop.sh index 67cb7ad..db3fcb0 100755 --- a/hdfs/run-hadoop.sh +++ b/hdfs/run-hadoop.sh @@ -46,9 +46,9 @@ run_datanode() { export HADOOP_PID_DIR=$HADOOP_LOG_DIR DN_CONF_OPTS="\ -Dhadoop.tmp.dir=$DN_DIR_PREFIX$DN \ - -Ddfs.datanode.address=0.0.0.0:5001$DN \ - -Ddfs.datanode.http.address=0.0.0.0:5008$DN \ - -Ddfs.datanode.ipc.address=0.0.0.0:5002$DN" + -Ddfs.datanode.address=0.0.0.0:200$DN \ + -Ddfs.datanode.http.address=0.0.0.0:300$DN \ + -Ddfs.datanode.ipc.address=0.0.0.0:400$DN" $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs $1 datanode $DN_CONF_OPTS } From 02e130bc237ee508d92e679c2d6c320657001146 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Mon, 8 Jul 2019 00:11:42 +0700 Subject: [PATCH 50/50] add plot --- .gitignore | 1 + .gitmodules | 3 + README.md | 14 ++ cassandra/README.md | 47 +++++++ cassandra/source | 1 + hdfs/README.md | 52 ++++++++ hdfs/Visualization.ipynb | 279 +++++++++++++++++++++++++++++++++++++++ hdfs/data.csv | 11 ++ hdfs/data.txt | 30 +++++ hdfs/plot.png | Bin 0 -> 26430 bytes 10 files changed, 438 insertions(+) create mode 100644 cassandra/README.md create mode 160000 cassandra/source create mode 100644 hdfs/Visualization.ipynb create mode 100644 hdfs/data.csv create mode 100644 hdfs/data.txt create mode 100644 hdfs/plot.png diff --git a/.gitignore b/.gitignore index 39c28d6..9a9c587 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .bak .DS_Store +.ipynb_checkpoints diff --git a/.gitmodules b/.gitmodules index a506411..fd78b93 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "hdfs/source"] path = hdfs/source url = git@github.com:rayandrews/custom-hadoop.git +[submodule "cassandra/source"] + path = cassandra/source + url = git@github.com:rayandrews/custom-cassandra.git diff --git a/README.md b/README.md index b709a9f..fb62989 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ # ucare-research + +Projects containing all of my UCARE Research + +## Projects + +### Memory Usage Tracker + +- [Cassandra](https://github.com/rayandrews/ucare-research/tree/master/cassandra) +- [HDFS](https://github.com/rayandrews/ucare-research/tree/master/hdfs) + +## Author + +- Ray Andrew +- Cesar Stuardo diff --git a/cassandra/README.md b/cassandra/README.md new file mode 100644 index 0000000..d9eac5f --- /dev/null +++ b/cassandra/README.md @@ -0,0 +1,47 @@ +# Cassandra Memory Usage + +This project uses [CCM](https://github.com/riptano/ccm) by Riptano + +## Installation + +1. Building cassandra + +```bash +ant +``` + +## Running + +1. Run CCM + +```bash +python3 deploy.py \ + --node_count N \ + --cassandra_dir CASSANDRA_DIR \ + --cluster_name CLUSTER_NAME \ + --cluster_path CLUSTER_PATH >> log.txt +``` + +or background task + +```bash +nohup python3 deploy.py \ + --node_count N \ + --cassandra_dir CASSANDRA_DIR \ + --cluster_name CLUSTER_NAME \ + --cluster_path CLUSTER_PATH >> log.txt & +``` + +3. Preprocess the data + +Just copy paste it to the csv or create the script + +4. Plot the data + +```bash +jupyter lab # open Visualization.ipynb +``` + +## Results + +![cassandra-mem-usage](plot2.png) diff --git a/cassandra/source b/cassandra/source new file mode 160000 index 0000000..61b46e2 --- /dev/null +++ b/cassandra/source @@ -0,0 +1 @@ +Subproject commit 61b46e27ec767dc7f3f3ed3f78b27567cc29e532 diff --git a/hdfs/README.md b/hdfs/README.md index e69de29..72a8fa2 100644 --- a/hdfs/README.md +++ b/hdfs/README.md @@ -0,0 +1,52 @@ +# HDFS Memory Usage + +## Installation + +1. Install JDK7 (using zulu) + +```bash +sudo ./install-jdk7.sh +``` + +2. Install Maven + +```bash +sudo ./install-maven.sh +``` + +3. Install Protobuf + +```bash +sudo ./install-protobuf.sh +``` + +## Running + +1. Source env + +```bash +source ./env.sh +``` + +2. Run Hadoop + +```bash +./run-hadoop.sh start N # N is number of datanodes +``` + +3. Run reader + +```bash +touch data.txt +python3 reader.py -adn Nx >> data.txt # Nx is (number of datanodes - 1) +``` + +4. Plot the data + +```bash +jupyter lab # open Visualization.ipynb +``` + +## Results + +![hdfs-mem-usage](plot.png) diff --git a/hdfs/Visualization.ipynb b/hdfs/Visualization.ipynb new file mode 100644 index 0000000..fc25369 --- /dev/null +++ b/hdfs/Visualization.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "# This line configures matplotlib to show figures embedded in the notebook, \n", + "# instead of poping up a new window. More about that later. \n", + "%pylab inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from pylab import *\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from scipy.interpolate import interp1d\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('./data.csv')\n", + "df = df.set_index('nodes')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nndn
nodes
10626
20546
30566
40589
505109
\n", + "
" + ], + "text/plain": [ + " nn dn\n", + "nodes \n", + "10 6 26\n", + "20 5 46\n", + "30 5 66\n", + "40 5 89\n", + "50 5 109" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Int64Index([10, 20, 30, 40, 50, 60, 70, 80, 90, 100], dtype='int64', name='nodes')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.index" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Memory (MB)')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = df.plot.line()\n", + "ax.set_title('Before interpolation')\n", + "ax.set_xlabel(\"Nodes\")\n", + "ax.set_ylabel(\"Memory (MB)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "f1 = interp1d(df.index, df['nn'], kind='cubic')\n", + "f2 = interp1d(df.index, df['dn'], kind='cubic')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "df_int = pd.DataFrame()\n", + "new_index = np.arange(10, 110, 10)\n", + "df_int['NameNodes'] = f1(new_index)\n", + "df_int['DataNodes'] = f2(new_index)\n", + "df_int.index = new_index" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ffdx8803c+uttwIwb948Xn31VWbNmsXAgQN55plnuPnmmznllFN48cUXGTFiBD/60Y947rnnaNasGU8++STXX3/9tlnBfffdl0GDBvHwww9zwgknbLvm2LFjmTp1KtOmTWPZsmUMGDCAwYMH8+abbzJnzhymT5/O4sWL6dq1KxdffDH5+fk7vM7IkSOZP38+tWrVYtWqVXtwZCVJkiTlWqUOhGnae++9Of/887nzzjupU6fOtu0LFizgrLPOYtGiRWzZsuUr7RmGDx9OjRo16NGjB4WFhRx77LEA9OjRg/nz5zNnzhxmzJjBUUcdBUBhYSEtW7b8ynV//vOfc+KJJzJixIht28aPH88555xDtWrVaNGiBUOGDGHixIm89tpr27a3atWKww8/HKDU63Tr1o1vf/vbnHzyyZx88slZGDlJkiRJuVKpA2FZZvKy6corr6Rv375cdNFF27b96Ec/4qqrruLEE09k3LhxX1lsplatWgDk5eVRo0aNbSt25uXlUVBQQIyRbt268eabb+7wmh07dqR379489dRT27bFGHe4f0mrgpZ2nTFjxvDuu+/y/PPP8+tf/5qZM2dSvXql/mMkSZIkVVo+Q5hFjRs35swzz2TUqFHbtq1evZrWrVsDMHr06F06X+fOnVm6dOm2oJafn8/MmTO/tt/111/PLbfcsu314MGDefLJJyksLGTp0qW89tprHHTQQQwePJgnnniCwsJCFi1axKuvvlrqdYqKiliwYAHDhg3j5ptvZtWqVaxbt27XBkWSJElSuWEgzLKrr776K6uN3nDDDZxxxhkcdthhNG3adJfOVbNmTcaMGcO1115Lr1696N27NxMmTPjaft26daNv377bXp9yyin07NmTXr16cfjhh3PzzTezzz77cMopp9CpUyd69OjBD37wA4YMGVLqdQoLC/ne975Hjx496NOnDz/96U9p2LDhbo6MJEmSpLSF0m4nLO86d+4c58yZ85Vts2fP5sADD0ypospv7dq11K9fv9R9/BnsWePGjWPo0KFpl1GlOOa555jnnmOee4557jnmueeY514IYXKMsf/uHu8MoSRJkiRVRHtgcs/VQCRJkiSpItm4EqY9AZPu/8anMhBKkiRJUkWwcDJMvB9mPAMFG6H1bt8puo2BUJIkSZLKqy3rYfqYZDZw0VSoURd6nQX9L4aWveDSr7eR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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax2 = df_int.plot.line(figsize=(15,8), grid=True)\n", + "ax2.set_title('HDFS JVM Memory Usage')\n", + "ax2.set_xlabel(\"Nodes\")\n", + "ax2.set_ylabel(\"Memory (MB)\")\n", + "plt.savefig('plot.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/hdfs/data.csv b/hdfs/data.csv new file mode 100644 index 0000000..95dfa05 --- /dev/null +++ b/hdfs/data.csv @@ -0,0 +1,11 @@ +nodes,nn,dn +10,6,26 +20,5,46 +30,5,66 +40,5,89 +50,5,109 +60,5,129 +70,5,152 +80,5,170 +90,6,193 +100,5,213 \ No newline at end of file diff --git a/hdfs/data.txt b/hdfs/data.txt new file mode 100644 index 0000000..8501ffd --- /dev/null +++ b/hdfs/data.txt @@ -0,0 +1,30 @@ +NN used 6 +List of dn mems used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 10 is 26 MB +NN used 5 +List of dn mems used [2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 20 is 46 MB +NN used 5 +List of dn mems used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2] +Total memory used for 30 is 66 MB +NN used 5 +List of dn mems used [3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 40 is 89 MB +NN used 5 +List of dn mems used [2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 50 is 109 MB +NN used 5 +List of dn mems used [2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 60 is 129 MB +NN used 5 +List of dn mems used [2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 70 is 152 MB +NN used 5 +List of dn mems used [2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 80 is 170 MB +NN used 6 +List of dn mems used [2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 90 is 193 MB +NN used 5 +List of dn mems used [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] +Total memory used for 100 is 213 MB diff --git a/hdfs/plot.png b/hdfs/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5000bd9823e775d0b64b90dd0dac901cbc3005 GIT binary patch literal 26430 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 literal 0 HcmV?d00001