Esse tutorial é sobre a construção do pacote do Hadoop 2.7.1 para o CentOS6 / RHEL6 usando Docker. Esse procedimento é necessário para gerar as bibliotecas nativas compatíveis. O principal objetivo que motivou esse trabalho foi configurar o FairScheduler do YARN usando CGroups rodando no Red Hat Enterprise Linux 6 (RHEL6). O pacote Hadoop distribuído pela Apache tem executável binário que não é compatível com a Glibc que faz parte do CentOS6/RHEL6.
O RHEL6 é o sistema operacional homologado para as máquinas do cluster que usamos na Globo.com e foi necessário criar uma distribuição própria do Hadoop para que pudéssemos fazer uso do FairScheduler juntamente com o CGroups para limitar o uso de processamento entre as aplicações rodando nos mesmos NodeManagers.
Esse trabalho de configuração do Hadoop para uso compartilhado será assunto de outro artigo.
Nesse artigo, o foco é um passo a passo de como usar o Docker para gerar um pacote do Hadoop adaptado para o Red Hat Enterprise Linux 6 (RHEL6) usando CentOS6.
Pré-requisito
Nesse procedimento, é necessário que o Docker esteja instalado e funcionando; também é necessário acesso à Internet.
Originalmente, esse procedimento foi testado no ArchLinux atualizado até final de Agosto/2015.
https://wiki.archlinux.org/index.php/Docker
sudo docker version
> Client:
> Version: 1.8.1
> API version: 1.20
> Go version: go1.4.2
> Git commit: d12ea79
> Built: Sat Aug 15 17:29:10 UTC 2015
> OS/Arch: linux/amd64
>
> Server:
> Version: 1.8.1
> API version: 1.20
> Go version: go1.4.2
> Git commit: d12ea79
> Built: Sat Aug 15 17:29:10 UTC 2015
> OS/Arch: linux/amd64
Compilação
Documento com instruções de build do Hadoop aqui.
O resultado desse procedimento é um pacote do Hadoop com os executáveis e bibliotecas nativas compilados para o CentOS6 que rodam no RHEL6.
/hadoop/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1.tar.gz
…
Começamos com a criação de um conainer do Docker com a imagem do CentOS6.
Ao executar o comando run
, o Docker automaticamente fará o download da imagem e a shell será inicializada dentro de um novo container.
sudo docker run -i -t centos:6 /bin/bash
> Unable to find image 'centos:6' locally
> 6: Pulling from library/centos
>
> f1b10cd84249: Pull complete
> fb9cc58bde0c: Pull complete
> a005304e4e74: Already exists
> library/centos:6: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
>
> Digest: sha256:25d94c55b37cb7a33ad706d5f440e36376fec20f59e57d16fe02c64698b531c1
> Status: Downloaded newer image for centos:6
> [root@3cc2bc5e593b /]#
Já dentro do container criamos um usuário e local que serão usados na compilação e geração do pacote.
adduser -m -d /hadoop hadoop
cd hadoop
Para a compilação das bibliotecas nativas é necessária a instalação do compilador C e mais alguns pacotes de desenvolvimento (cabeçalhos das bibliotecas usadas pelo Hadoop).
yum install -y tar gzip gcc-c++ cmake zlib zlib-devel openssl openssl-devel fuse fuse-devel bzip2 bzip2-devel snappy snappy-devel
> (...)
O Hadoop ainda depende de duas outras bibliotecas que precisam ser instaladas manualmente no CentOS: Google ProtoBuf 2.5 (RPC), Jansson (JSON).
Para instalar o ProtoBuf, é necessário baixar o pacote, configurar para as pastas do CentOS (64 bits) e instalar.
curl -L -O https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
tar zxf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install
cd ..
Para instalar o Jansson, é necessário baixar o pacote, configurar para as pastas do CentOS (64 bits) e instalar.
curl -O http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
tar zxf jansson-2.7.tar.gz
cd jansson-2.7
./configure --prefix=/usr --libdir=/usr/lib64
make
make install
cd ..
Para completar o ambiente de compilação, precisamos do JDK e do Maven.
No caso do JDK, usaremos o pacote RPM já disponibilizado pela Oracle.
curl -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" -O http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm
rpm -i jdk-8u60-linux-x64.rpm
No caso do Maven, usaremos o pacote binário de distribuição da Apache.
curl -O http://archive.apache.org/dist/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz
tar zxf apache-maven-3.3.3-bin.tar.gz
O ambiente de compilação está completo.
Agora estamos pronto para a compilação do Hadoop. Nesse caso, estaremos gerando o pacote de distribuição somente com o binário Java e as bibliotecas nativas.
su - hadoop
export PATH=$PATH:/hadoop/apache-maven-3.3.3/bin
curl -O http://archive.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz
tar zxf hadoop-2.7.1-src.tar.gz
cd hadoop-2.7.1-src
mvn clean package -Pdist,native -DskipTests -Drequire.snappy -Drequire.openssl -Dtar
> (...)
> main:
> [exec] $ tar cf hadoop-2.7.1.tar hadoop-2.7.1
> [exec] $ gzip -f hadoop-2.7.1.tar
> [exec]
> [exec] Hadoop dist tar available at: /hadoop/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1.tar.gz
> [exec]
> [INFO] Executed tasks
> [INFO]
> [INFO] --- maven-javadoc-plugin:2.8.1:jar (module-javadocs) @ hadoop-dist ---
> [INFO] Building jar: /hadoop/hadoop-2.7.1-src/hadoop-dist/target/hadoop-dist-2.7.1-javadoc.jar
> [INFO] ------------------------------------------------------------------------
> [INFO] Reactor Summary:
> [INFO]
> [INFO] Apache Hadoop Main ................................. SUCCESS [01:56 min]
> [INFO] Apache Hadoop Project POM .......................... SUCCESS [ 42.134 s]
> [INFO] Apache Hadoop Annotations .......................... SUCCESS [ 37.761 s]
> [INFO] Apache Hadoop Assemblies ........................... SUCCESS [ 0.125 s]
> [INFO] Apache Hadoop Project Dist POM ..................... SUCCESS [ 23.183 s]
> [INFO] Apache Hadoop Maven Plugins ........................ SUCCESS [ 25.962 s]
> [INFO] Apache Hadoop MiniKDC .............................. SUCCESS [03:23 min]
> [INFO] Apache Hadoop Auth ................................. SUCCESS [02:11 min]
> [INFO] Apache Hadoop Auth Examples ........................ SUCCESS [ 10.145 s]
> [INFO] Apache Hadoop Common ............................... SUCCESS [03:29 min]
> [INFO] Apache Hadoop NFS .................................. SUCCESS [ 4.724 s]
> [INFO] Apache Hadoop KMS .................................. SUCCESS [02:35 min]
> [INFO] Apache Hadoop Common Project ....................... SUCCESS [ 0.024 s]
> [INFO] Apache Hadoop HDFS ................................. SUCCESS [02:15 min]
> [INFO] Apache Hadoop HttpFS ............................... SUCCESS [02:13 min]
> [INFO] Apache Hadoop HDFS BookKeeper Journal .............. SUCCESS [ 38.598 s]
> [INFO] Apache Hadoop HDFS-NFS ............................. SUCCESS [ 3.213 s]
> [INFO] Apache Hadoop HDFS Project ......................... SUCCESS [ 0.032 s]
> [INFO] hadoop-yarn ........................................ SUCCESS [ 0.030 s]
> [INFO] hadoop-yarn-api .................................... SUCCESS [ 29.193 s]
> [INFO] hadoop-yarn-common ................................. SUCCESS [02:02 min]
> [INFO] hadoop-yarn-server ................................. SUCCESS [ 0.040 s]
> [INFO] hadoop-yarn-server-common .......................... SUCCESS [ 8.499 s]
> [INFO] hadoop-yarn-server-nodemanager ..................... SUCCESS [ 12.283 s]
> [INFO] hadoop-yarn-server-web-proxy ....................... SUCCESS [ 2.359 s]
> [INFO] hadoop-yarn-server-applicationhistoryservice ....... SUCCESS [ 5.298 s]
> [INFO] hadoop-yarn-server-resourcemanager ................. SUCCESS [ 15.095 s]
> [INFO] hadoop-yarn-server-tests ........................... SUCCESS [ 3.772 s]
> [INFO] hadoop-yarn-client ................................. SUCCESS [ 4.641 s]
> [INFO] hadoop-yarn-server-sharedcachemanager .............. SUCCESS [ 2.433 s]
> [INFO] hadoop-yarn-applications ........................... SUCCESS [ 0.019 s]
> [INFO] hadoop-yarn-applications-distributedshell .......... SUCCESS [ 1.884 s]
> [INFO] hadoop-yarn-applications-unmanaged-am-launcher ..... SUCCESS [ 1.263 s]
> [INFO] hadoop-yarn-site ................................... SUCCESS [ 0.020 s]
> [INFO] hadoop-yarn-registry ............................... SUCCESS [ 3.532 s]
> [INFO] hadoop-yarn-project ................................ SUCCESS [ 3.452 s]
> [INFO] hadoop-mapreduce-client ............................ SUCCESS [ 0.036 s]
> [INFO] hadoop-mapreduce-client-core ....................... SUCCESS [ 15.195 s]
> [INFO] hadoop-mapreduce-client-common ..................... SUCCESS [ 12.459 s]
> [INFO] hadoop-mapreduce-client-shuffle .................... SUCCESS [ 2.645 s]
> [INFO] hadoop-mapreduce-client-app ........................ SUCCESS [ 6.342 s]
> [INFO] hadoop-mapreduce-client-hs ......................... SUCCESS [ 3.845 s]
> [INFO] hadoop-mapreduce-client-jobclient .................. SUCCESS [ 11.295 s]
> [INFO] hadoop-mapreduce-client-hs-plugins ................. SUCCESS [ 1.546 s]
> [INFO] Apache Hadoop MapReduce Examples ................... SUCCESS [ 4.573 s]
> [INFO] hadoop-mapreduce ................................... SUCCESS [ 2.164 s]
> [INFO] Apache Hadoop MapReduce Streaming .................. SUCCESS [ 7.874 s]
> [INFO] Apache Hadoop Distributed Copy ..................... SUCCESS [ 19.660 s]
> [INFO] Apache Hadoop Archives ............................. SUCCESS [ 2.071 s]
> [INFO] Apache Hadoop Rumen ................................ SUCCESS [ 3.966 s]
> [INFO] Apache Hadoop Gridmix .............................. SUCCESS [ 3.215 s]
> [INFO] Apache Hadoop Data Join ............................ SUCCESS [ 1.818 s]
> [INFO] Apache Hadoop Ant Tasks ............................ SUCCESS [ 1.478 s]
> [INFO] Apache Hadoop Extras ............................... SUCCESS [ 2.037 s]
> [INFO] Apache Hadoop Pipes ................................ SUCCESS [ 5.880 s]
> [INFO] Apache Hadoop OpenStack support .................... SUCCESS [ 3.407 s]
> [INFO] Apache Hadoop Amazon Web Services support .......... SUCCESS [ 40.013 s]
> [INFO] Apache Hadoop Azure support ........................ SUCCESS [ 11.557 s]
> [INFO] Apache Hadoop Client ............................... SUCCESS [ 7.659 s]
> [INFO] Apache Hadoop Mini-Cluster ......................... SUCCESS [ 0.042 s]
> [INFO] Apache Hadoop Scheduler Load Simulator ............. SUCCESS [ 3.072 s]
> [INFO] Apache Hadoop Tools Dist ........................... SUCCESS [ 8.519 s]
> [INFO] Apache Hadoop Tools ................................ SUCCESS [ 0.014 s]
> [INFO] Apache Hadoop Distribution ......................... SUCCESS [ 30.616 s]
> [INFO] ------------------------------------------------------------------------
> [INFO] BUILD SUCCESS
> [INFO] ------------------------------------------------------------------------
> [INFO] Total time: 29:26 min
> [INFO] Finished at: 2015-09-01T00:47:31+00:00
> [INFO] Final Memory: 224M/785M
> [INFO] ------------------------------------------------------------------------
Para completar a compilação, executamos os testes, contudo, alguns deles podem apresentar falhas intermitentes (acontecem algumas vezes, outras não).
Os testes podem levar algumas horas para rodar por completo.
mkdir hadoop-common-project/hadoop-common/target/test-classes/webapps/test
mvn test -Pnative -Drequire.snappy -Drequire.openssl -Dmaven.test.failure.ignore=true -Dsurefire.rerunFailingTestsCount=3
> (...)
(alguns testes com falha intermitente)
- org.apache.hadoop.ipc.TestDecayRpcScheduler#testAccumulate
- org.apache.hadoop.ipc.TestDecayRpcScheduler#testPriority
- org.apache.hadoop.hdfs.server.datanode.TestDataNodeMetrics#testDataNodeTimeSpend
- org.apache.hadoop.hdfs.shortcircuit.TestShortCircuitCache#testDataXceiverHandlesRequestShortCircuitShmFailure
…
No final desse procedimento, o pacote do Hadoop estará gerado em:
/hadoop/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1.tar.gz
Para copiar do container para a máquina host:
(3cc2bc5e593b
é o identificador do container no Docker)
# shell na máquina
sudo docker cp 3cc2bc5e593b:/hadoop/hadoop-2.7.1-src/hadoop-dist/target/hadoop-2.7.1.tar.gz .
Conclusão
Esse procedimento mostra como o Hadoop pode ser customizado para necessidades específicas e que não requer um esforço muito grande.
Contudo, ter uma “versão” própria do Hadoop é uma decisão que deve ser tomada com cautela.
No momento, a gente considera que essa seja a melhor escolha para o nosso trabalho na Globo.com e estamos querendo formar um time para evoluir e dar suporte a essa plataforma. O maior benefício é a liberdade de escolher como configurar e melhorar nossa infraestrutura. O custo é não ter uma empresa especializada “cuidando” dessa responsabilidade.
No futuro, pode ser que mudemos esse modo de operação e busquemos uma distribuição “profissional” como Cloudera, Hortonworks ou outra.
Particularmente, eu prefiro manter uma plataforma própria.
comments powered by Disqus