-
Notifications
You must be signed in to change notification settings - Fork 0
Instalação
A ferramenta TeMIA-NT, tendo em mente atender as necessidades de escalabilidade essenciais para a classificação de altas taxas de tráfego, foi desenvolvida utilizando ferramentas de código aberto que operam em aglomerados computacionais.
Para facilitar o teste da ferramenta e de suas funcionalidades, foi desenvolvido um script para automatizar sua instalação em uma única máquina. Esta seção contém o guia para a instalação da ferramenta em uma única máquina a partir do script, assim como o guia para a instalação completa da ferramenta em um aglomerado computacional.
Sistema Operacional: Ubuntu 18.04
Memória: 8GB de RAM
Armazenamento: 15GB de espaço disponível
Primeiramente baixe o script de instalação disponível neste link.
Acesse como root o local onde o script foi baixado (usualmente ~/Downloads
). A seguir, use o comando abaixo para dar permissão de execução ao script.
chmod +x install.sh
Dada a permissão, utilize o comando abaixo para instalar a ferramenta:
. ./install.sh
Configure o arquivo /etc/hosts
para que este tenha um formato similar ao apresentado abaixo:
127.0.0.1 localhost
10.10.10.6 master
10.10.10.9 slave01
10.10.10.13 slave02
10.10.10.11 slave03
10.10.10.7 kafka01
10.10.10.3 kafka02
10.10.10.15 elastic01
10.10.10.10 kibana01
Esta configuração deve ser feita de acordo com as configurações de rede do ambiente no qual a ferramenta será instalada. O nó master
atuará como o mestre dos ambientes Hadoop e Spark, enquanto os nós slave
atuarão como os escravos. Os nós do Kafka, Elasticsearch e Kibana também são definidos neste arquivo. Os nomes dados devem obrigatoriamente seguir o formato acima; por exemplo, o nó mestre deve ser nomeado master
.
Instale os requisitos básicos da ferramenta:
apt-get update
apt-get upgrade -y
apt-get install python-setuptools python3-dev build-essential python3-pip openssh-server openssh-client openjdk-8-jdk openjdk-8-jre scala git net-tools curl libpcap-dev -y
pip3 install cython
pip3 install numpy sklearn ipython scipy python-geoip python-geoip-geolite2 netifaces scapy kafka-python python-libpcap
Caso seu ambiente possua uma firewall ativa, adicione as permissão necessárias para que o Hadoop e o Spark possam realizar a comunicação entre os nós. Isto pode ser feito com o comando abaixo, executando-o em cada nó para todos os IPs que compõem o ambiente.
ufw allow from <IP_address>
Certifique-se que o nó master
pode ser acessado pelas máquinas do ambiente. Execute o comando abaixo, e responda yes
quando solicitado para continuar a conexão:
ssh master
Os nós devem comunicar-se entre si para enviar e receber comandos. Para a comunicação entre os nós do aglomerado, é necessário estabelecer comunicação por ssh.
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
A seguir, é necessário copiar o conteúdo de ~/.ssh/id_rsa.pub
do mestre e colá-lo ao final do arquivo ~/.ssh/authorized_keys
de todos os nós, tanto do mestre quanto dos escravos.
Tendo feito isso, reinicie o serviço ssh em cada nó com:
service ssh restart
Antes de se instalar o Apache Kafka, é necessário ter o Zookeeper disponível e em execução. O Zookeeper é um serviço de código aberto para manter informações de configuração, fornecendo sincronização distribuída, nomeando e fornecendo serviços de grupo.
Por padrão, o pacote Zookeeper está disponível no repositório padrão do Ubuntu. Para instalá-lo, basta executar:
apt-get install zookeeperd -y
Para a ferramenta, o Apache Kafka atua como uma pipeline, sendo responsável por enviar os fluxos conforme estes são abstraídos para a camada de processamento do Spark. Para baixar o Apache Kafka, utilize o link abaixo:
wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11-2.4.1.tgz
Crie um diretório para o Kafka, e a seguir extraia o conteúdo do arquivo .tgz neste diretório.
mkdir -p /opt/kafka
tar -xvf kafka_2.11-2.4.1.tgz -C /opt/kafka/
Inicie o Zookeeper:
systemctl restart zookeeper
O Hadoop é utilizado na ferramenta pelo seu sistema de armazenamento distribuído de dados (Hadoop Distributed File System - HDFS). Primeiramente, baixe o Hadoop com o comando abaixo:
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
Crie um diretório para o Hadoop, e a seguir extraia o conteúdo do arquivo .tar.gz neste diretório.
mkdir -p /opt/hadoop
tar -xzvf hadoop-3.3.1.tar.gz -C /opt/hadoop/ --strip-components=1
Atualize as variáveis de ambiente para atender ao Hadoop. Primeiramente abra o arquivo .bashrc com um editor de texto:
nano ~/.bashrc
A seguir, cole no fim do arquivo o bloco de texto abaixo:
# -- HADOOP ENVIRONMENT VARIABLES START -- #
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
# -- HADOOP ENVIRONMENT VARIABLES END -- #
Por fim, carregue as variáveis de ambiente atualizadas:
source ~/.bashrc
Acesse o arquivo hadoop-env.sh
com:
nano /opt/hadoop/etc/hadoop/hadoop-env.sh
Insira ao final deste arquivo:
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
Acesse o arquivo core-site.xml
com:
nano /opt/hadoop/etc/hadoop/core-site.xml
Insira entre as tags <configuration>
:
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
Acesse o arquivo hdfs-site.xml
com:
nano /opt/hadoop/etc/hadoop/hdfs-site.xml
Insira entre as tags <configuration>
:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop_tmp/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/hadoop_tmp/hdfs/datanode</value>
</property>
Acesse o arquivo yarn-site.xml
com:
nano /opt/hadoop/etc/hadoop/yarn-site.xml
Insira entre as tags <configuration>
:
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8050</value>
</property>
Acesse o arquivo mapred-site.xml
com:
nano /opt/hadoop/etc/hadoop/mapred-site.xml
Insira entre as tags <configuration>
:
<property>
<name>mapreduce.job.tracker</name>
<value>master:5431</value>
</property>
<property>
<name>mapred.framework.name</name>
<value>yarn</value>
</property>
Acesse o arquivo masters
com:
sudo nano /opt/hadoop/etc/hadoop/masters
Adicione o nó mestre ao arquivo:
master
Acesse o arquivo workers
com:
sudo nano /opt/hadoop/etc/hadoop/workers
Adicione os nós escravos ao arquivo:
slave01
slave02
slave03
Crie um diretório para namenode:
mkdir -p /opt/hadoop_tmp/hdfs/namenode
Crie um diretório para datanode:
mkdir -p /opt/hadoop_tmp/hdfs/datanode
Formate o Namenode com o comando:
hdfs namenode -format
Inicie o HDFS com:
/opt/hadoop/sbin/start-dfs.sh
/opt/hadoop/sbin/start-yarn.sh
Crie um diretório no HDFS:
hdfs dfsadmin -safemode leave
hadoop fs -mkdir /user
hadoop fs -mkdir /user/app
hadoop fs -mkdir /user/app/elasticCheckpoint
Adicione o dataset ao HDFS:
wget http://gta.ufrj.br/~chagas/dataset-ids.tar.gz
tar -xvf dataset-ids.tar.gz
cd dataset-ids
hdfs dfs -put Network* /user/app
O Apache Spark é responsável por grande parte do processamento da ferramenta, sendo ele o responsável por obter o modelo de classificação, assim como por realizar a classificação dos fluxos conforme eles são adicionados ao Kafka. Ele também trata do envio de mensagens ao Elasticsearch. Primeiramente, baixe o Spark com o comando abaixo:
wget https://ftp.unicamp.br/pub/apache/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz
Crie um diretório para o Spark, e a seguir extraia o conteúdo do arquivo .tgz neste diretório.
mkdir -p /opt/spark
tar xzf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/spark --strip-components=1
Atualize as variáveis de ambiente para atender ao Spark. Primeiramente abra o arquivo .bashrc com um editor de texto:
nano ~/.bashrc
A seguir, cole no fim do arquivo o bloco de texto abaixo:
# -- SPARK ENVIRONMENT VARIABLES START -- #
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
export PYSPARK_DRIVER_PYTHON=ipython
# -- SPARK ENVIRONMENT VARIABLES END -- #
Por fim, carregue as variáveis de ambiente atualizadas:
source ~/.bashrc
Edite o arquivo de configuração spark-env.sh
com:
cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh
nano $SPARK_HOME/conf/spark-env.sh
A seguir, cole no fim do arquivo o bloco de texto abaixo (ajuste o valor de SPARK_WORKER_CORES de acordo com a quantidade de núcleos disponíveis na máquina):
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SPARK_WORKER_CORES=8
SPARK_MASTER_HOST=master
Crie o arquivo de configuração para os escravos com:
nano $SPARK_HOME/conf/slaves
Adicione ao arquivo os nós escravos:
localhost
slave01
slave02
slave03
Edite o arquivo de configuração spark-defaults.conf
com:
mv /opt/spark/conf/spark-defaults.conf.template /opt/spark/conf/spark-defaults.conf
nano $SPARK_HOME/conf/spark-defaults.conf
A seguir, cole no fim do arquivo o bloco de texto abaixo:
spark.master spark://master:7077
spark.eventLog.enabled true
spark.eventLog.dir /tmp/
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 5g
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="on$
Por fim, crie o diretório spark-events:
mkdir /tmp/spark-events
Elasticsearch e Kibana são responsáveis por fornecer a camada de visualização ao usuário, apresentando através de uma dashboard os resultados da classificação do tráfego em tempo real.
Instale o Elasticsearch com os comandos abaixo:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'
apt update
apt install elasticsearch
Abra o arquivo de configurações do Elasticsearch com:
/etc/elasticsearch/elasticsearch.yml
Insira no fim do arquivo o texto abaixo. O conteúdo de <nó_atual>
deve ser substituído pelo nome do nó; por exemplo, no nó mestre este valor é master
. Também certifique-se que o conteúdo de discovery.seed_hosts
contém todos os nós do aglomerado, de acordo com a configuração de rede do ambiente de instalação da ferramenta.
cluster.name: spark
node.name: <nó_atual>
network.bind_host: 0.0.0.0
network.publish_host: <nó_atual>
discovery.seed_hosts: [master, slave01, slave02, slave03]
cluster.initial_master_nodes: [master]
Inicie o Elasticsearch e o configure para iniciar automaticamente com:
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
update-rc.d elasticsearch defaults 95 10
Para instalar o Kibana, basta usar:
apt install kibana
Abra o arquivo de configurações do Kibana com:
nano /etc/kibana/kibana.yml
Insira no fim do arquivo o texto abaixo:
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://master:9200"]
Inicie o Kibana e o configure para iniciar automaticamente com:
systemctl restart kibana
systemctl enable kibana
update-rc.d kibana defaults 96 9
O sbt (Scala Build Tool) é necessário para compilar a parte do código responsável pelo processamento no Spark, desenvolvida na linguagem de programação Scala. Para instalar, basta executar os comandos:
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add
apt-get update
apt-get install sbt
Para substituir alguma máquina em falha ou adicionar mais máquinas ao aglomerado, realize os seguintes passos: Atenção: realizar o procedimento a seguir removerá todos os arquivos do HDFS.
Invocar o script que interrompe os serviços do HDFS (datanodes e namenodes):
/opt/hadoop/sbin/stop-all.sh
Verificar que os serviços não estão mais rodando:
root@slave03:~# jps
121905 Jps
Remover os metadados do HDFS e formatar o namenode:
rm -r /tmp/*
rm -r /opt/hadoop_tmp/hdfs/namenode
rm -r /opt/hadoop_tmp/hdfs/datanode
hadoop namenode -format
Adicionar o nome das novas máquinas nos arquivos de configuração do HDFS (/opt/hadoop/etc/hadoop/workers
) e do Spark (/opt/spark/conf/slaves
):
master # adicionar esta linha caso deseje que o nó mestre também processe as tarefas do Spark
slave01
slave02
slave03
...
A partir deste momento, o comando hdfs dfs -ls /user/app
deve retornar um erro. Caso a estrutura de diretórios do HDFS ainda esteja visível no comando, interrompa todos os processos relacionados ao HDFS no nó mestre e formate novamente:
ps aux | grep hdfs
kill <número dos processos encontrados no comando anterior>
hdfs namenode -format
Finalmente, iniciar os serviços formatados com a nova configuração e verificar que há uma nova estrutura de diretórios em branco:
/opt/hadoop/sbin/stop-all.sh
/opt/hadoop/sbin/start-all.sh
hdfs dfs -ls /