Pular para o conteúdo principal

Hadoop standalone no Ubuntu 16

Este exemplo mostra como rodar o Hadoop 2.7.6 no Ubuntu 16.04 LTS.
Eu considero que você acabou de instalar o Ubuntu Server com a instalação mínima e SSH server instalado. O SSH server só precisa ser instalado para você fazer o acesso remoto na máquina, caso você não precise disto, nem mesmo o SSH server precisa ser instalado.

Os passos mostrados abaixo consideram que você está utilizando um usuário que faz parte do sudoers, isto é, aquele que é criado durante a instalação. No meu caso este usuário se chama hadoopuser.

Os comandos estão mostrados em azul e as saídas das telas em vermelho.

O primeiro passo é atualizar o sistema.

$ sudo apt-get -y update
$ sudo apt-get -y upgrade

Instalação

Depois precisamos instalar o java JDK. Neste post vamos usar o openjdk mesmo, mas você pode utilizar o JDK da Oracle. Eu faço isto em outro post sobre o Hadoop. Se você estiver curioso, veja o link.
O primeiro comando faz a instalação e o segundo mostra a versão depois de instalado.

$ sudo apt-get install -y default-jdk
$ java -version

No meu caso a saída mostrada é do java versão 1.8.0 build 171.

hadoopuser@hadoop1:~$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

Em seguida temos que baixar o hadoop da internet.
Vou usar o comando wget para baixar. Na data desta postagem a última versão disponível na data é 3.1.0, contudo vou utilizar a versão 2.7.6, que tem mais ou menos ~207MB, para manter a compatibilidade com o outro post.


$ wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz

$ wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz.mds

$ shasum -a 256 hadoop-2.7.6.tar.gz

$ cat hadoop-2.7.6.tar.gz.mds

Os dois primeiros programas baixam respectivamente o hadoop compactado e o checksum do arquivo do compactado. Em seguinda shasum é usado para gerar o checksum do arquivo que foi baixado e cat é usado para ver o conteúdo do arquivo de checksum. A linha fornecida por shasum deve igual à linha indicada como SHA256 fornecida por cat.
Veja na minha saída que elas são iguais (em rosa).

hadoopuser@hadoop1:~$ shasum -a 256 hadoop-2.7.6.tar.gz
f2327ea93f4bc5a5d7150dee8e0ede196d3a77ff8526a7dd05a48a09aae25669  hadoop-2.7.6.tar.gz
hadoopuser@hadoop1:~$ cat hadoop-2.7.6.tar.gz.mds
hadoop-2.7.6.tar.gz:    MD5 = 6B DF 41 74 20 2C 82 77  4F 31 47 2E 04 3D 61 07
hadoop-2.7.6.tar.gz:   SHA1 = E6BF 4C57 14D4 27F4 776F  B14A 3383 ED00 5F7D 6CA7
hadoop-2.7.6.tar.gz: RMD160 = 669B F782 7DB3 1527 708D  BDDF BDA4 923F 6F1D AC73
hadoop-2.7.6.tar.gz: SHA224 = 8873B3B2 1DF3C8E3 11311872 FD0E098C 7307DDB7
                              D7E333E0 048470F1
hadoop-2.7.6.tar.gz: SHA256 = F2327EA9 3F4BC5A5 D7150DEE 8E0EDE19 6D3A77FF
                              8526A7DD 05A48A09 AAE25669
hadoop-2.7.6.tar.gz: SHA384 = E2A4472F 97A91D91 EE3407FC ACA02B89 225670CF
                              BCBAACDE 520D1640 9A912127 FDE4F029 130E95CC
                              87EEABC8 B6CC9B98
hadoop-2.7.6.tar.gz: SHA512 = 725A86B5 1674573A 2BA69528 6CE40CB6 EA631BFF
                              E6445E01 0A11EECB B93B6647 CB424CFE 95CEA99C
                              2CD52FCA EF438E26 45DA3855 D808D113 59E0E349
                              4E90B331

Ok, como sabemos que o arquivo não foi alterado, podemos descompactá-lo com tar.
E vamos mové-lo para o diretório de programas.
Para isto damos os dois comandos a seguir:

$ tar -xzvf hadoop-2.7.6.tar.gz
$ sudo mv hadoop-2.7.6 /usr/local/hadoop

Configurar o ambiente

Agora precisamos configurar o ambiente do hadoop, o que é relativamente fácil no modo standalone.
Vamos para isto usar o comando a seguir para configurar a variável de ambiente JAVA_HOME.

$ readlink -f /usr/bin/java | sed "s:bin/java::"


A saída deste comando no meu computador é
hadoopuser@hadoop1:~$ readlink -f /usr/bin/java | sed "s:bin/java::"
/usr/lib/jvm/java-8-openjdk-amd64/jre/

Precisamos então configurar o arquivo de configuração de ambiente  do hadoop.
Vou utilizar o vi para isto, mas você pode utilizar seu editor preferido.
Lembre que tem que ser sudo.

$ sudo vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

Ache a linha onde tem JAVA_HOME. Eu comentei a linha original e criei uma nova da seguinte maneira:

#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")


Rodar um exemplo

Agora podemos utilizar o Hadoop. Vamos rodá-lo com o comando:
$ /usr/local/hadoop/bin/hadoop

No meu computador a saída deste comando é
hadoopuser@hadoop1:~$ /usr/local/hadoop/bin/hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
  CLASSNAME            run the class named CLASSNAME
 or
  where COMMAND is one of:
  fs                   run a generic filesystem user client
  version              print the version
  jar <jar>            run a jar file
                       note: please use "yarn jar" to launch
                             YARN applications, not this command.
  checknative [-a|-h]  check native hadoop and compression libraries availability
  distcp <srcurl> <desturl> copy file or directories recursively
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
  credential           interact with credential providers
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
  trace                view and modify Hadoop tracing settings

Se você não quiser ficar digitando o caminho sempre, você pode alterar o PATH do linux.
Você vai precisar editar o arquivo .bashrc.

$ vi ~/.bashrc

Para acrescentar a linha abaixo no final do arquivo:
export PATH=$PATH:/usr/local/hadoop/bin

Você precisará fazer logoff e em seguida logon novamente para carregar a alteração no seu usuário.

Vamos rodar um teste com o hadoop.
Para isto vamos criar um diretório de entrada para conter os arquivo .xml de configuração do exemplos que já vem no programa. Vamos utilizar hadoop-mapreduce-examples para rodar um map-reduce.

$ mkdir ~/input
$ cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar grep ~/input ~/output 'principal[.]*'

Este exemplo irá rodar, procurando a palavra principal.
Se tudo correr corretamente, uma saída parecida com a mostrada abaixo vai aparecer na sua tela.

18/07/04 18:11:50 INFO mapreduce.Job: Counters: 30
    File System Counters
        FILE: Number of bytes read=1248344
        FILE: Number of bytes written=2398340
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
    Map-Reduce Framework
        Map input records=2
        Map output records=2
        Map output bytes=37
        Map output materialized bytes=47
        Input split bytes=120
        Combine input records=0
        Combine output records=0
        Reduce input groups=2
        Reduce shuffle bytes=47
        Reduce input records=2
        Reduce output records=2
        Spilled Records=4
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=48
        Total committed heap usage (bytes)=274874368
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters 
        Bytes Read=151
    File Output Format Counters 
        Bytes Written=37

Note que se você tentar rodar novamente no mesmo diretório de saída (~/output no exemplo acima) vai dar erro de execução, similar ao mostrado abaixo:

18/07/04 18:13:50 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/home/hadoopuser/output already exists
    at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
    at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:266)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1758)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
    at org.apache.hadoop.examples.Grep.run(Grep.java:94)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.examples.Grep.main(Grep.java:103)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
    at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
    at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)


O resultado está no diretório de saída

hadoopuser@hadoop1:~$ ls output/
part-r-00000  _SUCCESS

Veja que gerou um arquivo _SUCESS para indicar que tudo deu certo. No arquivo part-r-0000 está o resultado. É um arquivo texto simples, que pode ser visualizado com cat.

hadoopuser@hadoop1:~$ cat part-r-00000 
6   principal
1   principal.

As duas linhas listadas indicam que o map-reduce achou 6x a palavra principal e 1x a palavra seguida de um ponto.

Comentários

Postagens mais visitadas deste blog

Como colocar o PyCharm no launcher do Ubuntu

Atualizei recentemente meu pycharm para a versão 2018.1. A atualização basicamente consiste em baixar do site da Jetbrains  dedicado ao PyCharm, e depois do download basta descompactar e mover o diretório criado para você você achar mais adequado. No meu caso está em ~/bin/pycharm. Para rodar o pycharm é só executar o script pycharm.sh que está no diretório bin dentro do diretório do pycharm, isto é, no meu caso ~/bin/pycharm/bin/pycharm.sh. Eu queria ter o ícone do pycharm no launcher (aquela barra lateral do Ubuntu) para ficar mais fácil chamá-lo. O PyCharm pode criar seu próprio ícone de lançador, contudo ele não é cria por padrão. A gente tem que executar alguns comandos: 1) Comece chamando o PyCharm em um terminal. 2) No menu Ferramentas, selecione "Criar entrada da área de trabalho ..." 3) Se você já tem o PyCharm, ele irá perguntar se você quer reaproveitar as configurações da versão anterior: 4) Marque a caixa correspondente, se você quiser o lanç

Resetando a senha do administrador local no Windows Server 2012

Existem diversas formas de redefinir a senha em seu servidor Windows 2012 quando você esqueceu ela. Neste post mostraremos como alterar a senha do usuário administrador, quando você tem acesso físico à ele. Você precisará do DVD de instalação do Windows para fazer isto. São os seguintes passos: 1-) Reinicie o seu computador dando boot pelo DVD do Microsoft Windows Server 2012 (pode ser outra versão) 2-) No menu Instalação do Windows (mostrado abaixo), clique em "Avançar". 3-) Selecione "Reparar seu computador" Como estamos utilizando o DVD do Windows 2008 para reparar um Windows 2012, o seguinte aviso é mostrado. Concorde clicando em Next. 4-) Clique em "Aviso de comando" para abrir uma janela de comandos. 5-) No prompt de comando, execute os seguintes comandos: d: cd windows\system32 ren Utilman.exe Utilman.exe.old copy cmd.exe Utilman.exe 5-) Feche o prompt de comando e clique em "Reiniciar". 6-) O serv

Configurar a ação do Ubuntu 20 ao fechar a tela do notebook

Este post mostra como alterar a ação quando a tampa do laptop é fechada no Ubuntu 20.04 - por exemplo, desligar, hibernar, não fazer nada ou travar a tela. A ação padrão do Ubuntu é suspender a atividade do notebook. Até onde eu sei, até o momento deste post não existe uma opção gráfica para fazer esta configuração, portanto você precisa editar o arquivo logind.conf para alterar a ação. Esta configuração deve funcionar em instalações tipo desktop ou servidor do Ubuntu. Você precisa abrir o terminal (normalmente isto pode ser feito pressionando simultaneamente Ctrl + Alt + T). Com o terminal aberto você pode utilizar um editor para alterar as linhas que controlam a ação. Por exemplo, digite na linha de comando: sudo vi /etc/systemd/logind.conf No arquivo procure a linha (note the # indica que a linha está comentada) # HandleLidSwitch = suspend e altere-a para uma das seguintes opções (note que agora a linha não começa mais com #) - trava o desktop quando a tampa está fechada: HandleLidS