Provavelmente não é segredo que o ano passado foi um ano de grandes mudanças para o Apache Hadoop. No ano passado, a Cloudera e a Hortonworks fundiram-se (essencialmente, a aquisição desta última), e a Mapr, devido a graves problemas financeiros, foi vendida à Hewlett Packard. E se alguns anos antes, no caso de instalações on-premises, muitas vezes a escolha tinha que ser feita entre Cloudera e Hortonworks, hoje, infelizmente, não temos essa escolha. Outra surpresa foi o fato de a Cloudera ter anunciado em fevereiro deste ano que deixaria de liberar assemblies binários de sua distribuição no repositório público, e agora eles estão disponíveis apenas por meio de assinatura paga. Claro, ainda é possível baixar as versões mais recentes do CDH e HDP lançadas antes do final de 2019, e o suporte para elas é esperado por um a dois anos. Mas o que fazer a seguir? Para quem já pagou por assinatura, nada mudou. E para quem não deseja mudar para a versão paga da distribuição, mas ao mesmo tempo deseja receber as versões mais recentes dos componentes do cluster, além de patches e outras atualizações, preparamos este artigo. Nele consideraremos possíveis opções para sair desta situação.
O artigo é mais uma revisão. Não conterá uma comparação de distribuições e uma análise detalhada delas, e não haverá receitas para instalá-las e configurá-las. O que vai acontecer? Falaremos brevemente sobre uma distribuição como o Arenadata Hadoop, que merece nossa atenção por sua disponibilidade, hoje muito rara. E depois falaremos sobre o Vanilla Hadoop, principalmente sobre como ele pode ser “cozido” usando o Apache Bigtop. Preparar? Então seja bem-vindo ao gato.
Arenadata Hadoop
Este é um kit de distribuição de desenvolvimento doméstico completamente novo e ainda pouco conhecido. Infelizmente, neste momento em Habré só existe
Mais informações podem ser encontradas no site oficial
Informações sobre o roteiro podem ser encontradas
Interface do Gerenciador de Cluster Arenadata
O principal produto da Arenadata é
Para implantação e gerenciamento do Hadoop 3, uma versão comunitária do pacote é oferecida em conjunto com o ADCM, mas para o Hadoop 2 há apenas
Se falarmos sobre as desvantagens, elas serão as mesmas de todas as outras distribuições do Hadoop. Nomeadamente:
- O chamado “aprisionamento do fornecedor”. Usando os exemplos da Cloudera e da Hortonworks, já percebemos que sempre existe o risco de mudar a política da empresa.
- Atraso significativo em relação ao upstream do Apache.
Hadoop baunilha
Como você sabe, o Hadoop não é um produto monolítico, mas, na verdade, toda uma galáxia de serviços em torno de seu sistema de arquivos distribuído HDFS. Poucas pessoas terão o suficiente de um cluster de arquivos. Alguns precisam do Hive, outros do Presto, e depois há o HBase e o Phoenix; o Spark é cada vez mais usado. Para orquestração e carregamento de dados, às vezes são encontrados Oozie, Sqoop e Flume. E se surgir a questão da segurança, então o Kerberos em conjunto com o Ranger vem imediatamente à mente.
Versões binárias dos componentes do Hadoop estão disponíveis no site de cada um dos projetos do ecossistema na forma de tarballs. Você pode baixá-los e iniciar a instalação, mas com uma condição: além de montar pacotes de forma independente a partir de binários “brutos”, o que você provavelmente deseja fazer, você não terá nenhuma confiança na compatibilidade das versões baixadas dos componentes com cada outro. A opção preferida é construir usando Apache Bigtop. Bigtop permitirá que você construa a partir de repositórios Apache Maven, execute testes e construa pacotes. Mas, o que é muito importante para nós, a Bigtop montará aquelas versões de componentes que serão compatíveis entre si. Falaremos sobre isso com mais detalhes a seguir.
Apache Grande Topo
Apache Bigtop é uma ferramenta para construir, empacotar e testar uma série de
projetos de código aberto, como Hadoop e Greenplum. Bigtop tem muito
lançamentos. No momento em que este artigo foi escrito, a versão estável mais recente era a versão 1.4,
e no master havia 1.5. Diferentes versões de lançamentos usam versões diferentes
componentes. Por exemplo, para 1.4 os componentes principais do Hadoop têm a versão 2.8.5 e no master
2.10.0. A composição dos componentes suportados também está mudando. Algo desatualizado e
o não renovável desaparece e em seu lugar surge algo novo, mais procurado e
não é necessariamente algo da própria família Apache.
Além disso, Bigtop tem muitos
Quando começamos a conhecer o Bigtop, ficamos surpresos em primeiro lugar com sua modesta prevalência e popularidade em comparação com outros projetos Apache, bem como com uma comunidade muito pequena. Conclui-se que há informações mínimas sobre o produto, e a busca por soluções para problemas que surgiram em fóruns e listas de discussão pode não render nada. A princípio foi uma tarefa difícil concluir a montagem completa da distribuição devido às características da própria ferramenta, mas falaremos sobre isso um pouco mais tarde.
A título de teaser, quem já se interessou por projetos do universo Linux como Gentoo e LFS pode achar nostalgicamente agradável trabalhar com isso e relembrar aqueles momentos “épicos” em que nós mesmos procurávamos (ou mesmo escrevíamos) ebuilds e reconstrui regularmente o Mozilla com novos patches.
A grande vantagem do Bigtop é a abertura e versatilidade das ferramentas nas quais se baseia. É baseado em Gradle e Apache Maven. Gradle é bastante conhecido como a ferramenta que o Google usa para construir o Android. É flexível e, como dizem, “testado em batalha”. Maven é uma ferramenta padrão para construção de projetos no próprio Apache e, como a maioria de seus produtos são lançados por meio do Maven, também não poderia ser feito sem ele aqui. Vale a pena prestar atenção ao POM (modelo de objeto de projeto) - o arquivo xml “fundamental” que descreve tudo o que é necessário para o Maven trabalhar com seu projeto, em torno do qual todo o trabalho é construído. Exatamente em
partes do Maven e existem alguns obstáculos que os usuários iniciantes do Bigtop geralmente encontram.
Prática
Então, por onde você deve começar? Vá para a página de download e baixe a versão estável mais recente como um arquivo. Lá você também pode encontrar artefatos binários coletados pelo Bigtop. A propósito, entre os gerenciadores de pacotes comuns, YUM e APT são suportados.
Alternativamente, você pode baixar a versão estável mais recente diretamente de
GitHub:
$ git clone --branch branch-1.4 https://github.com/apache/bigtop.git
Clonagem em “bigtop”…
remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 40217 (delta 14), reused 10 (delta 1), pack-reused 40171
Получение объектов: 100% (40217/40217), 43.54 MiB | 1.05 MiB/s, готово.
Определение изменений: 100% (20503/20503), готово.
Updating files: 100% (1998/1998), готово.
O diretório ./bigtop resultante se parece com isto:
./bigtop-bigpetstore
— aplicações de demonstração, exemplos sintéticos
./bigtop-ci
- Ferramentas de CI, Jenkins
./bigtop-data-generators
— geração de dados, sintéticos, para testes de fumaça, etc.
./bigtop-deploy
- ferramentas de implantação
./bigtop-packages
— configurações, scripts, patches para montagem, a parte principal da ferramenta
./bigtop-test-framework
- estrutura de teste
./bigtop-tests
— os próprios testes, carga e fumaça
./bigtop_toolchain
— ambiente para montagem, preparando o ambiente para a ferramenta funcionar
./build
- construir diretório de trabalho
./dl
— diretório para fontes baixadas
./docker
- construção de imagens docker, testes
./gradle
- configuração gradle
./output
– o diretório para onde vão os artefatos de construção
./provisioner
- provisionamento
O mais interessante para nós nesta fase é a configuração principal ./bigtop/bigtop.bom
, no qual vemos todos os componentes suportados com versões. É aqui que podemos especificar uma versão diferente do produto (se de repente quisermos tentar construí-lo) ou uma versão de construção (se, por exemplo, adicionamos um patch significativo).
O subdiretório também é de grande interesse ./bigtop/bigtop-packages
, que está diretamente relacionado ao processo de montagem de componentes e embalagens com eles.
Então, baixamos o arquivo, descompactamos ou fizemos um clone do github, podemos começar a construir?
Não, vamos preparar o ambiente primeiro.
Preparando o Ambiente
E aqui precisamos de um pequeno retiro. Para construir quase qualquer produto mais ou menos complexo, você precisa de um determinado ambiente - no nosso caso, é o JDK, as mesmas bibliotecas compartilhadas, arquivos de cabeçalho, etc., ferramentas, por exemplo, ant, ivy2 e muito mais. Uma das opções para obter o ambiente necessário para o Bigtop é instalar os componentes necessários no host de construção. Posso estar errado na cronologia, mas parece que com a versão 1.0 também houve a opção de construir imagens Docker pré-configuradas e acessíveis, que podem ser encontradas aqui.
Quanto à preparação do ambiente, existe um auxiliar para isso - o Puppet.
Você pode usar os seguintes comandos, executados no diretório raiz
instrumento, ./bigtop:
./gradlew toolchain
./gradlew toolchain-devtools
./gradlew toolchain-puppetmodules
Ou diretamente via fantoche:
puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::installer"
puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::deployment-tools"
puppet apply --modulepath=<path_to_bigtop> -e "include bigtop_toolchain::development-tools"
Infelizmente, podem surgir dificuldades já nesta fase. O conselho geral aqui é usar uma distribuição suportada, atualizada no host de compilação, ou tentar a rota docker.
montagem
O que podemos tentar coletar? A resposta a esta pergunta será dada pela saída do comando
./gradlew tasks
Na seção Tarefas do pacote há vários produtos que são artefatos finais do Bigtop.
Eles podem ser identificados pelo sufixo -rpm ou -pkg-ind (no caso de construção
na janela de encaixe). No nosso caso, o mais interessante é o Hadoop.
Vamos tentar construir no ambiente do nosso servidor de construção:
./gradlew hadoop-rpm
O próprio Bigtop baixará as fontes necessárias para um componente específico e iniciará a montagem. Assim, o funcionamento da ferramenta depende de repositórios Maven e outras fontes, ou seja, necessita de acesso à Internet.
Durante a operação, a saída padrão é gerada. Às vezes, isso e mensagens de erro podem ajudá-lo a entender o que deu errado. E às vezes você precisa obter informações adicionais. Neste caso vale a pena adicionar argumentos --info
ou --debug
, e também pode ser útil –stacktrace
. Existe uma maneira conveniente de gerar um conjunto de dados para acesso posterior às listas de discussão, a chave --scan
.
Com a ajuda dele, o bigtop irá coletar todas as informações e colocá-las no gradle, após o que fornecerá um link,
seguindo isso, uma pessoa competente será capaz de entender por que a montagem falhou.
Esteja ciente de que esta opção pode expor informações que você não deseja, como nomes de usuário, nós, variáveis de ambiente, etc., portanto, tome cuidado.
Freqüentemente, os erros são consequência da incapacidade de obter quaisquer componentes necessários para a montagem. Normalmente, você pode corrigir o problema criando um patch para corrigir algo nas fontes, por exemplo, endereços em pom.xml no diretório raiz das fontes. Isso é feito criando-o e colocando-o no diretório apropriado ./bigtop/bigtop-packages/src/common/oozie/
patch, por exemplo, no formato patch2-fix.diff.
--- a/pom.xml
+++ b/pom.xml
@@ -136,7 +136,7 @@
<repositories>
<repository>
<id>central</id>
- <url>http://repo1.maven.org/maven2</url>
+ <url>https://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
Provavelmente, no momento da leitura deste artigo, você não precisará fazer a correção acima sozinho.
Ao introduzir quaisquer patches e alterações no mecanismo de montagem, pode ser necessário “redefinir” a montagem usando o comando cleanup:
./gradlew hadoop-clean
> Task :hadoop_vardefines
> Task :hadoop-clean
BUILD SUCCESSFUL in 5s
2 actionable tasks: 2 executed
Esta operação reverterá todas as alterações na montagem deste componente, após o que a montagem será realizada novamente. Desta vez tentaremos construir o projeto em uma imagem docker:
./gradlew -POS=centos-7 -Pprefix=1.2.1 hadoop-pkg-ind
> Task :hadoop-pkg-ind
Building 1.2.1 hadoop-pkg on centos-7 in Docker...
+++ dirname ./bigtop-ci/build.sh
++ cd ./bigtop-ci/..
++ pwd
+ BIGTOP_HOME=/tmp/bigtop
+ '[' 6 -eq 0 ']'
+ [[ 6 -gt 0 ]]
+ key=--prefix
+ case $key in
+ PREFIX=1.2.1
+ shift
+ shift
+ [[ 4 -gt 0 ]]
+ key=--os
+ case $key in
+ OS=centos-7
+ shift
+ shift
+ [[ 2 -gt 0 ]]
+ key=--target
+ case $key in
+ TARGET=hadoop-pkg
+ shift
+ shift
+ [[ 0 -gt 0 ]]
+ '[' -z x ']'
+ '[' -z x ']'
+ '[' '' == true ']'
+ IMAGE_NAME=bigtop/slaves:1.2.1-centos-7
++ uname -m
+ ARCH=x86_64
+ '[' x86_64 '!=' x86_64 ']'
++ docker run -d bigtop/slaves:1.2.1-centos-7 /sbin/init
+
CONTAINER_ID=0ce5ac5ca955b822a3e6c5eb3f477f0a152cd27d5487680f77e33fbe66b5bed8
+ trap 'docker rm -f
0ce5ac5ca955b822a3e6c5eb3f477f0a152cd27d5487680f77e33fbe66b5bed8' EXIT
....
много вывода
....
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-mapreduce-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-namenode-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-secondarynamenode-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-zkfc-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-journalnode-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-datanode-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-httpfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-resourcemanager-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-nodemanager-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-proxyserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-yarn-timelineserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-mapreduce-historyserver-2.8.5-
1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-client-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-conf-pseudo-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-doc-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-libhdfs-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-libhdfs-devel-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-hdfs-fuse-2.8.5-1.el7.x86_64.rpm
Wrote: /bigtop/build/hadoop/rpm/RPMS/x86_64/hadoop-debuginfo-2.8.5-1.el7.x86_64.rpm
+ umask 022
+ cd /bigtop/build/hadoop/rpm//BUILD
+ cd hadoop-2.8.5-src
+ /usr/bin/rm -rf /bigtop/build/hadoop/rpm/BUILDROOT/hadoop-2.8.5-1.el7.x86_64
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uQ2FCn
+ exit 0
+ umask 022
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.CwDb22
+ cd /bigtop/build/hadoop/rpm//BUILD
+ rm -rf hadoop-2.8.5-src
+ exit 0
[ant:touch] Creating /bigtop/build/hadoop/.rpm
:hadoop-rpm (Thread[Task worker for ':',5,main]) completed. Took 38 mins 1.151 secs.
:hadoop-pkg (Thread[Task worker for ':',5,main]) started.
> Task :hadoop-pkg
Task ':hadoop-pkg' is not up-to-date because:
Task has not declared any outputs despite executing actions.
:hadoop-pkg (Thread[Task worker for ':',5,main]) completed. Took 0.0 secs.
BUILD SUCCESSFUL in 40m 37s
6 actionable tasks: 6 executed
+ RESULT=0
+ mkdir -p output
+ docker cp
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb:/bigtop/build .
+ docker cp
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb:/bigtop/output .
+ docker rm -f ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
+ '[' 0 -ne 0 ']'
+ docker rm -f ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
Error: No such container:
ac46014fd9501bdc86b6c67d08789fbdc6ee46a2645550ff6b6712f7d02ffebb
BUILD SUCCESSFUL in 41m 24s
1 actionable task: 1 executed
A compilação foi realizada no CentOS, mas também pode ser feita no Ubuntu:
./gradlew -POS=ubuntu-16.04 -Pprefix=1.2.1 hadoop-pkg-ind
Além de construir pacotes para diversas distribuições Linux, a ferramenta pode criar um repositório com pacotes compilados, por exemplo:
./gradlew yum
Você também pode se lembrar dos testes de fumaça e da implantação no Docker.
Crie um cluster de três nós:
./gradlew -Pnum_instances=3 docker-provisioner
Execute testes de fumaça em um cluster de três nós:
./gradlew -Pnum_instances=3 -Prun_smoke_tests docker-provisioner
Exclua um cluster:
./gradlew docker-provisioner-destroy
Obtenha comandos para conectar-se dentro de contêineres docker:
./gradlew docker-provisioner-ssh
Mostrar status:
./gradlew docker-provisioner-status
Você pode ler mais sobre tarefas de implantação na documentação.
Se falamos de testes, há um grande número deles, principalmente fumaça e integração. Sua análise foge ao escopo deste artigo. Deixe-me apenas dizer que montar um kit de distribuição não é uma tarefa tão difícil quanto pode parecer à primeira vista. Conseguimos montar e passar nos testes todos os componentes que utilizamos em nossa produção, e também não tivemos problemas para implantá-los e realizar operações básicas no ambiente de testes.
Além dos componentes existentes no Bigtop, é possível adicionar qualquer outra coisa, até mesmo o desenvolvimento de seu próprio software. Tudo isso é perfeitamente automatizado e se enquadra no conceito CI/CD.
Conclusão
Obviamente, a distribuição assim compilada não deve ser enviada imediatamente para produção. Você precisa entender que se há uma necessidade real de construir e apoiar sua distribuição, então você precisa investir tempo e dinheiro nisso.
No entanto, em combinação com a abordagem certa e uma equipa profissional, é perfeitamente possível prescindir de soluções comerciais.
É importante notar que o próprio projecto Bigtop necessita de desenvolvimento e não parece estar actualmente a ser desenvolvido activamente. A perspectiva de o Hadoop 3 aparecer nele também não é clara. A propósito, se você realmente precisa construir o Hadoop 3, você pode dar uma olhada
Existem vários componentes adicionais (Ranger, Knox, NiFi).
Quanto à Rostelecom, para nós o Bigtop é uma das opções que estão sendo consideradas hoje. Quer escolhamos ou não, o tempo dirá.
Apêndice
Para incluir um novo componente na montagem, você precisa adicionar sua descrição em bigtop.bom e ./bigtop-packages. Você pode tentar fazer isso por analogia com os componentes existentes. Tente descobrir. Não é tão difícil quanto parece à primeira vista.
O que você acha? Teremos o maior prazer em ver sua opinião nos comentários e obrigado pela atenção!
O artigo foi elaborado pela equipe de gerenciamento de dados da Rostelecom
Fonte: habr.com