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
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
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::")
$ /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.
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
Postar um comentário