Configuración inicial
Crear el usuario cluster en todos los nodos, y con directorio home /home/cluster/
.
Crearemos un nodo master00 que contendrá el ResourceMangager, NameNode y JobHistory Server (podrían estar los tres en nodos diferentes). En un nodo a parte podríamos poner el SecondaryNameNode.
Crearemos nodos esclavos slave01, slave02, slave03,… cada uno con un NodeManager y un DataNode.
Crear el script ~/set_paths
para configurar todas las variables de entorno necesarias con el contenido:
export HADOOP_PREFIX=/home/cluster/hadoop
export YARN_HOME=/home/cluster/hadoop
export PATH=/home/cluster/hbase/bin:$PATH
export JAVA_HOME=<code>update-java-alternatives -l | grep 1.6 | tail -1 | cut -f3 -d' '</code>
Hadoop
La arquitectura de Hadoop 2.0.1 se compone de: un ResourceManager, un NameNode, un MapReduce JobHistory Server, un SecondaryNameNode (no usaré), varios NodeManagers, varios DataNodes, varios WebAppProxy (no usaré).
Descargar la versión Hadoop 2.0.1-alpha y descomprimirla en ~/hadoop
.
Configurar ~/hadoop/etc/hadoop/core-site.xml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<property> <name>fs.defaultFS</name> <value>hdfs://master00:8020/</value> <description>Ruta al NameNode.</description> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> <description>Tamaño de buffer para ficheros. Por defecto 4096, lo ponemos a 128KB.</description> </property> <property> <name>hadoop.tmp.dir</name> <value>${user.home}/tmp</value> <description>Ruta base para otros directorios temporales. por defecto es /tmp/hadoop-${user.name}.</description> </property> |
Configurar ~/hadoop/etc/hadoop/hdfs-site.xml
para NameNode y los DataNodes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<property> <name>dfs.blocksize</name> <value>8m</value> <description>Por defecto son 64MB, pero pongo 8MB</description> </property> <property> <name>dfs.namenode.http-address</name> <value>master00:50070</value> <description> The address and the base port where the dfs namenode web ui will listen on. If the port is 0 then the server will start on a free port. </description> </property> <!-- Si utilizásemos un Namenode Backup, sería necesario esto --> <property> <name>dfs.namenode.backup.address</name> <value>master00backup:50100</value> <description>El nodo con el backup del namenode</description> </property> <property> <name>dfs.namenode.backup.http-address</name> <value>master00:50105</value> <description> The backup node http server address and port. If the port is 0 then the server will start on a free port. </description> </property> |
Configurar ~/hadoop/etc/hadoop/yarn-site.xml
para ResourceManager y los NodeManagers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
<property> <name>yarn.resourcemanager.address</name> <value>master00:8032</value> <description>Dirección a la que los clientes envían los Jobs (ResourceManager).</description> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master00:8030</value> <description>Dirección de la interfaz del Scheduler para obtener recursos.</description> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master00:8031</value> <description>Host:puerto de los NodeManagers. (por defecto)</descripcion> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master00:8033</value> <description>Dirección de la Intefaz de Administración de ResourceManager.</description> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> <description>Clase a utilizar como Scheduler de recursos en caso de no desear el que viene por defecto.</description> </property> |
Copiar ~/hadoop/share/hadoop/common/templates/conf/mapred-site.xml
a ~/hadoop/etc/hadoop
y configurar ~/hadoop/etc/hadoop/mapred-site.xml
para los trabajos (Jobs) MapReduce:
|
<property> <name>mapreduce.jobhistory.address</name> <value>master00:10020</value> <description>Host:port del servidor de Historial de Jobs de MapReduce. Lo ponemos en master00.</description> </property> |
Configurar ~/hadoop/etc/hadoop/httpfs-site.xml
:
|
<property> <name>httpfs.home</name> <value>${user.home}/tmp</value> </property> |
HBase
Para trabajar con HBase, ejecutaremos en el nodo master00 lo siguiente: HBase Master y ZooKeeper (único del quorum).
En cada nodo slave ejecutaremos una instancia RegionServer.
Exportar del repositorio la versión hbase-0.94.2-rc3 en /home/cluster/hbase-0.94.2-rc3
.
|
svn export http://svn.apache.org/repos/asf/hbase/tags/0.94.2RC3/ hbase-0.94.2-rc3 |
Modificamos las dependencias de maven para que compile para Hadoop 2.0.1 al especificar el perfil “2.0”. Para ello, editamos el fichero ~/hbase-0.94.2-rc3/pom.xml
, y cambiamos la línea que dice:
|
<hadoop.version>2.0.0-alpha</hadoop.version> |
por:
|
<hadoop.version>2.0.1-alpha</hadoop.version> |
Recompilar HBase para Hadoop 2.0:
|
mvn -Dhadoop.profile=2.0 -DskipTests=true package |
Descomprimir el paquete creado ~/hbase-0.94.2-rc3/target/hbase-0.94.2.tar.gz
en ~/hbase
:
|
tar xzf ~/hbase-0.94.2-rc3/target/hbase-0.94.2.tar.gz -C ~ mv ~/hbase-0.94.2 ~/hbase |
Modificamos el fichero ~/hbase/conf/regionservers
para que esté vacío:
|
echo '' > ~/hbase/conf/regionservers |
Modificar ~/hbase/conf/hbase-env.sh
y descomentar la línea que dice:
|
export HBASE_MANAGES_ZK=true |
Configurar ~/hbase/conf/hbase-site.xml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master00/hbase</value> <description>Lugar donde guardar los ficheros de HBase. Utiliza HDFS (de Hadoop) en su puerto por defecto.</description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description>Sin esto no hay cluster distribuido. Así de simple.</description> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master00</value> <description>Como el ZooKeeper lo lanza HBase, aquí ponemos el nombre del nodo master.</description> </property> <property> <name>dfs.support.append</name> <value>true</value> <description>Necesario para que funcione con Hadoop</description> </property> <property> <name>hbase.master.info.bindAddress</name> <value>master00</value> <description>La dirección del ZooKeeper</description> </property> </configuration> |
Scripts de start/stop del nodo master
Una vez configurado todo, creamos el script ~/start-master-all.sh
con el contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#!/bin/bash $HADOOP_PREFIX/bin/hdfs namenode -format $HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode sleep 1 $YARN_HOME/sbin/yarn-daemon.sh start resourcemanager sleep 1 $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver sleep 1 $HADOOP_PREFIX/sbin/hadoop-daemon.sh start datanode sleep 1 $YARN_HOME/sbin/yarn-daemon.sh start nodemanager sleep 1 hbase-daemon.sh start zookeeper sleep 1 hbase-daemon.sh start master sleep 1 hbase-daemon.sh start regionserver |
El script ~/stop-master-all.sh
con el contenido:
|
$HADOOP_PREFIX/sbin/hadoop-daemon.sh stop namenode $YARN_HOME/sbin/yarn-daemon.sh stop resourcemanager $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver hbase-daemon.sh stop regionserver hbase-daemon.sh stop zookeeper |
Scripts de start/stop de los nodos slaves
Creamos el script ~/start-slave-all.sh
con el contenido:
|
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start datanode $YARN_HOME/sbin/yarn-daemon.sh start nodemanager sleep 2 hbase-daemon.sh start regionserver |
El script ~/stop-slave-all.sh
con el contenido:
|
#!/bin/bash hbase-daemon.sh stop regionserver hbase-daemon.sh stop master $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop datanode $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop namenode $YARN_HOME/sbin/yarn-daemon.sh stop nodemanager $YARN_HOME/sbin/yarn-daemon.sh stop resourcemanager $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver hbase-daemon.sh stop zookeeper |
Interfaces de usuario
Después de configurar todo lo anterior y ejecutar el nodo master mediante:
|
. set_variables start-master-all.sh # Para parar el master: stop-master-all.sh |
y en el caso de desear esclavos, ejecutar (opcionalmente en el propio master) lo siguiente en cada esclavo:
|
. set_variables start-slave-all.sh # Para parar este slave stop-slave-all.sh |
Se dispondrán de interfaces de usuario web en las siguientes direcciones:
Links
Referencia de puertos por defecto para Cloudera.
Bugs
Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.; Host Details : local host is: “master00/192.168.0.6”; destination host is: “master00”:50070;
En a página http://master00:50070/dfsnodelist.jsp?whatNodes=LIVE hay enlaces a los Datanodes vivos. Al pinchar alguno de ellos se muestra el error anterior. Esto es debido a un bug en el que se indica erróneamente cuál es la dirección al IPC del Namenode: nnaddr=. Se puede navegar sustituyendo el puerto 50070
por el puerto IPC de Hadoop 8020
, de manera que la dirección:
http://master00:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=%2F&nnaddr=192.168.0.6:50070
se sustituye por:
http://master00:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=%2F&nnaddr=192.168.0.6:8020