English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Costruire e部署Hadoop cluster distribuito utilizzando Docker
Ho cercato a lungo online senza trovare documenti su come costruire un cluster distribuito hadoop utilizzando docker, non c'è altro da fare che scriverne uno myself.
1: Preparazione dell'ambiente:
1: Prima di tutto, avere un sistema operativo CentOS7, che può essere installato in un virtual machine.
2: Installare docker in CentOS7, la versione di docker è 1.8.2
I passaggi di installazione sono i seguenti:
<1> Installare la versione specifica di docker
yum install -y docker-1.8.2-10.el7.centos
<2> Durante l'installazione potrebbero verificarsi degli errori, è necessario rimuovere questa dipendenza
rpm -e lvm2-7:2.02.105-14.el7.x86_64
Avvia docker
service docker start
Verifica del risultato dell'installazione:
<3> Dopo l'avvio, eseguire docker info mostrerà due righe di avviso come segue
È necessario disabilitare il firewall e riavviare il sistema
systemctl stop firewalld systemctl disable firewalld # Attenzione: dopo aver eseguito i comandi sopra elencati, è necessario riavviare il sistema reboot -h (riavvio del sistema)
<4> L'esecuzione del container potrebbe generare un errore
È necessario disabilitare selinux
Soluzione:
1: setenforce 0 (efficace immediatamente, senza bisogno di riavviare il sistema operativo)
2: modificare il file /etc/selinux/config e impostare SELINUX=disabled, quindi riavviare il sistema per farlo生效
Si consiglia di eseguire entrambi i passaggi, in modo da garantire che selinux sia spento anche dopo il riavvio del sistema
3: è necessario costruire un'immagine di base hadoop, utilizzando il file dockerfile per costruire.
Prima di tutto, costruire un'immagine con funzione ssh, che facilita l'uso futuro. (Ma questo può influenzare la sicurezza del container)
Attenzione: la password dell'utente root in questa immagine è root
Mkdir centos-ssh-root Cd centos-ssh-root Vi Dockerfile
# 选择一个已有的os镜像作为基础 FROM centos # Autore dell'immagine MAINTAINER crxy # Installa i pacchetti openssh-server e sudo e imposta il parametro UsePAM di sshd su no RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config # Installa openssh-clients RUN yum install -y openssh-clients # Aggiungi l'utente di test root con la password root e aggiungi questo utente a sudoers RUN echo "root:root" | chpasswd RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers # Queste due righe sono particolarmente speciali, devono essere presenti su CentOS 6, altrimenti il servizio sshd creato nel container non può accedere RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key # Avvia il servizio sshd e esponi la porta 22 RUN mkdir /var/run/sshd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
Comando di costruzione:
docker build -t="crxy/centos-ssh-root" .
Ricerca l'immagine appena costruita
4: Costruire un'immagine con JDK basata su questa immagine
Attenzione: JDK utilizza la versione 1.7
Mkdir centos-ssh-root-jdk Cd centos-ssh-root-jdk Cp ../jdk-7u75-Linux-x64.tar.gz . Vi Dockerfile
FROM crxy/centos-ssh-root ADD jdk-7u75-linux-x64.tar.gz /usr/local/ RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7 ENV JAVA_HOME /usr/local/jdk1.7 ENV PATH $JAVA_HOME/bin:$PATH
Comando di costruzione:
docker build -t="crxy/centos-ssh-root-jdk" .
Ricerca dell'immagine di costruzione di successo
5: Costruisci un'immagine con Hadoop basata su questo'immagine JDK
Attenzione: Hadoop utilizza la versione 2.4.1.
Mkdir centos-ssh-root-jdk-hadoop Cd centos-ssh-root-jdk-hadoop Cp ../hadoop-2.4.1.tar.gz . Vi Dockerfile
FROM crxy/centos-ssh-root-jdk ADD hadoop-2.4.1.tar.gz /usr/local RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop ENV HADOOP_HOME /usr/local/hadoop ENV PATH $HADOOP_HOME/bin:$PATH
Comando di costruzione:
docker build -t = "crxy/centos-ssh-root-jdk-hadoop" .
Ricerca dell'immagine di costruzione di successo
2: Costruzione di un cluster distribuito Hadoop
1: Pianificazione del cluster
Preparati a costruire un cluster con tre nodi, uno principale e due secondari
Node principale: hadoop0 ip: 192.168.2.10
Node secondario 1: hadoop1 ip: 192.168.2.11
Node secondario 2: hadoop2 ip: 192.168.2.12
Ma poiché l'IP cambia dopo il riavvio del container Docker, dobbiamo impostare un IP fisso per Docker. Utilizza pipework per impostare un IP fisso per il container Docker
2: Avvia tre container, rispettivamente come hadoop0, hadoop1, hadoop2
Esegui i seguenti comandi sul host host per impostare il nome dell'host e il nome del container del contenitore e aprire i porti 50070 e 8088 in hadoop0
docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop
使用docker ps查看刚才启动的三个容器
3:为这三台容器设置固定IP
1:下载pipework 下载地址:https://github.com/jpetazzo/pipework.git
2:将下载的zip包上传到宿主机服务器上,解压并重命名
unzip pipework-master.zip mv pipework-master pipework cp -rp pipework/pipework /usr/local/bin/
3:安装bridge-utils
yum -y install bridge-utils
4:创建网络
brctl addbr br0 ip link set dev br0 up ip addr add 192.168.2.1/24 dev br0
5:给容器设置固定IP
pipework br0 hadoop0 192.168.2.10/24 pipework br0 hadoop1 192.168.2.11/24 pipework br0 hadoop2 192.168.2.12/24
验证一下,分别ping三个IP,能ping通就说明没问题
4:配置hadoop集群
首先连接到hadoop0,使用命令
docker exec -it hadoop0 /bin/bash
以下步骤就是hadoop集群的配置过程
1:设置主机名与IP的映射,修改三台容器:vi /etc/hosts
添加以下配置
192.168.2.10 hadoop0 192.168.2.11 hadoop1 192.168.2.12 hadoop2
2:设置ssh免密码登录
在hadoop0上执行以下操作
cd ~ mkdir .ssh cd .ssh ssh-keygen -t rsa(按回车键继续) ssh-copy-id -i localhost ssh-copy-id -i hadoop0 ssh-copy-id -i hadoop1 ssh-copy-id -i hadoop2 在hadoop1上执行以下操作 cd ~ cd .ssh ssh-keygen -t rsa(按回车键继续) ssh-copy-id -i localhost ssh-copy-id -i hadoop1 在hadoop2上执行以下操作 cd ~ cd .ssh ssh-keygen -t rsa(按回车键继续) ssh-copy-id -i localhost ssh-copy-id -i hadoop2
3:在hadoop0上修改hadoop的配置文件
进入到/usr/local/hadoop/etc/hadoop目录
修改目录下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
(1) hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.7
(2)core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop0:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
(3)hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
(4)yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> </configuration>
(5) Modificare il nome del file: mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
(6) Formattazione
Entrare nella directory /usr/local/hadoop
1. Eseguire il comando di formattazione
bin/hdfs namenode -format
Attenzione: verrà visualizzato un errore durante l'esecuzione perché mancante il comando which, installarlo.
Eseguire il comando seguente per installare
yum install -y which
Vedere il comando seguente per indicare che la formattazione è stata eseguita con successo.
L'operazione di formattazione non può essere eseguita più volte. Se è necessario eseguire la formattazione più volte, utilizzare il parametro -force.
(7) Avviare il pseudo-distribuito hadoop
comando:
sbin/start-all.sh
Nel processo di avvio per la prima volta è necessario inserire yes per confermare.
Usare jps per verificare se il processo è stato avviato correttamente? È possibile vedere i seguenti processi che indicano che l'avvio pseudo-distribuito è stato eseguito con successo
[root@hadoop0 hadoop]# jps 3267 SecondaryNameNode 3003 NameNode 3664 Jps 3397 ResourceManager 3090 DataNode 3487 NodeManager
(8) ferma il hadoop pseudo-distribuito
comando:
sbin/stop-all.sh
(9) specifica l'indirizzo del nodemanager, modifica il file yarn-site.xml
<property> <description>Il nome dell'host dell'RM.</description> <name>yarn.resourcemanager.hostname</name> <value>hadoop0</value> </property>
(10) modifica un file di configurazione di hadoop in hadoop0, etc/hadoop/slaves
elimina tutto il contenuto originale e modifica come segue
hadoop1 hadoop2
(11) esegui il comando nel hadoop0
scp -rq /usr/local/hadoop hadoop1:/usr/local scp -rq /usr/local/hadoop hadoop2:/usr/local
(12) avvia il servizio di cluster distribuito hadoop
esegui sbin/start-all.sh
attenzione: si riceverà un errore durante l'esecuzione, poiché i due nodi secondari mancano del comando which, l'installazione è sufficiente
esegui i seguenti comandi sui due nodi secondari
yum install -y which
avvia il cluster (se il cluster è già in funzione, è necessario fermarlo prima)
sbin/start-all.sh
(13) verifica se il cluster è in funzione
prima di tutto, controlla i processi:
Hadoop0 deve avere questi processi
[root@hadoop0 hadoop]# jps 4643 Jps 4073 NameNode 4216 SecondaryNameNode 4381 ResourceManager
Hadoop1 deve avere questi processi
[root@hadoop1 hadoop]# jps 715 NodeManager 849 Jps 645 DataNode
Hadoop2 deve avere questi processi
[root@hadoop2 hadoop]# jps 456 NodeManager 589 Jps 388 DataNode
usa un programma per verificare i servizi del cluster
crea un file locale
vi a.txt ciao a te ciao a me
carica a.txt su hdfs
hdfs dfs -put a.txt /
Eseguire il programma wordcount
cd /usr/local/hadoop/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out
Visualizzare il risultato dell'esecuzione del programma
Questo significa che il cluster è funzionante.
Accedere ai servizi del cluster tramite il browser
Poiché durante l'avvio del container hadoop0, 50070 e 8088 sono stati mappati ai porti corrispondenti del host
adb9eba7142b crxy/centos-ssh-root-jdk-hadoop "/usr/sbin/sshd -D" Circa un'ora fa In esecuzione circa un'ora 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp hadoop0
Quindi è possibile accedere ai servizi del cluster nel container tramite il host
L'indirizzo IP del host è: 192.168.1.144
http://192.168.1.144:50070/
http://192.168.1.144:8088/
Terza: riavvio dei nodi del cluster
Fermare i tre container e eseguire i seguenti comandi sul host
docker stop hadoop0 docker stop hadoop1 docker stop hadoop2
Dopo aver fermato i container, l'indirizzo IP fisso precedentemente impostato verrà perso. Quando si utilizzano di nuovo questi container, è necessario impostare nuovamente l'indirizzo IP fisso
Prima di tutto, riavviare i tre container che erano stati fermati
docker start hadoop0 docker start hadoop1 docker start hadoop2
Eseguire i seguenti comandi sul host per assegnare un IP fisso al container
pipework br0 hadoop0 192.168.2.10/24 pipework br0 hadoop1 192.168.2.11/24 pipework br0 hadoop2 192.168.2.12/24
Deve essere configurata di nuovo la mappatura del nome host e dell'indirizzo IP nel container, è fastidioso scriverlo manualmente ogni volta
Scrivere uno script, runhosts.sh
#!/bin/bash echo 192.168.2.10 hadoop0 >> /etc/hosts echo 192.168.2.11 hadoop1 >> /etc/hosts echo 192.168.2.12 hadoop2 >> /etc/hosts
Add execution permission
chmod +x runhosts.sh
Copy this script to all nodes and execute this script separately
scp runhosts.sh hadoop1:~ scp runhosts.sh hadoop2:~
Command to execute the script
./runhosts.sh
Check if the /etc/hosts file has been added successfully
Note: Some docker versions will not automatically generate the following mappings in the hosts file, so we manually set a fixed ip for the container here, and set the mapping relationship between the hostname and ip.
172.17.0.25 hadoop0
172.17.0.25 hadoop0.bridge
172.17.0.26 hadoop1
172.17.0.26 hadoop1.bridge
172.17.0.27 hadoop2
172.17.0.27 hadoop2.bridge
Start the hadoop cluster
sbin/start-all.sh
That's all for this article, I hope it will be helpful to everyone's learning, and I also hope everyone will support and cheer for the tutorial.
Declaration: The content of this article is from the network, the copyright belongs to the original author, the content is contributed and uploaded by Internet users spontaneously, this website does not own the copyright, has not been manually edited, nor does it assume relevant legal liability. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (replace # with @ when sending an email) for reporting, and provide relevant evidence. Once confirmed, this site will immediately delete the content suspected of infringement.