Sonntag, 17. November 2013

Hadoop Version 1.2.1 im Clusterbetrieb

Voraussetzungen

Hadoop im Clusterbetrieb setzt mehrere Hadoopsysteme voraus, welche als Single-Installation eingerichtet sind. Ich lasse Hadoop und Ubuntu Virtual laufen und nutze VirtualBox als Software dazu. Zu diesem Zweck habe ich einfach meine fertige Single-Installation genommen und mehrfach durch Virtualbox geklont. Damit stehen mir in der Summe vier Hadoopsystem zur Verfügung. 
Ich werde ein System zum Master deklarieren und die anderen drei zu Slave-Systeme. Alle vier Systeme benenne ich mit dem Befehl, unter dem root-Nutzer des Systems:
sudo vi /etc/hosts 

Sollte ein DNS Dienst im Netzwerk vorhanden sein, so sollte das unnötig sein. Ich benutze bei mir lokal einen Cluster aus Virtual Machine und daher mache ich allen vier Systemen die unten stehende Liste bekannt.
Ich möchte hier eine Beispielkonfiguration aufzeigen, die IP-Adressen sind an ein frei erfundenes Netzwerk angelehnt. (Eine Ähnlichkeit mit anderen Netzen ist reiner Zufall.)
192.168.1.20     master
192.168.1.21     slave1
192.168.1.22     slave2
192.168.1.23     slave3
Nun wird auf dem Mastersystem in der Datei masters unter $hadoop_home/conf der Name oder die IP-Adresse des Masters eingetragen. Ich empfehle diesen Namen, da so die Möglichkeit besteht auf ein DNS-Dienst umzustellen, sollte man diese Systeme doch in einem Netzwerk mit DNS-Dienst einrichten. Die Slavesysteme werden in der Datei slaves eingetragen.

Jetzt beginnt die eigentliche Konfiguration des Hadoop-Clusters


Nach der Konfiguration der Master und Slaves Hosts müssen die drei Konfigurationsdateien (core-site.xml, hdfs-core.xml und mapred-site.xml) des Hadoop Frameworks angepasst werden. Ich werde alle Unterschiede zur Single-Installation fett hervorheben. Beginnen wir mit der core-site.xml
  • core-site.xml  (/usr/local/hadoop/conf)
Ich habe im Vergleich zu der Single-Konfiguration den Unterschied hervorgehoben. Es muss nur der Master-Host für das Property fs.default.name angegeben werden.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/usr/local/hdfs/hadoop-${user.name}</value>
  <description>Temporaeres Verzeichnis fuer das Hadoop FS</description>
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://master:54310</value>
  <description>URI hadoop Dateisystem (NameNode)</description>
</property>
</configuration>
  • hdfs-site.xml (/usr/local/hadoop/conf)
Die Konfiguration der Datenverteilung im Dateisystem stelle ich auf alle "3" ein, so dass auf alle Slave-Knoten verteilt wird.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
     <name>dfs.replication</name>
     <value>3</value>
     <description>Anzahl der Replikationen</description>
  </property>
</configuration>
  • mapred-site.xml (/usr/local/hadoop/conf)
Die Konfiguration des Jobtrackers erfolgt im Property mapred.job.tracker. Hier wird der Hosts und der Port des Jobtrackers aufgeführt. Ich lasse den Jobtracker auf dem "Master" laufen. Eine Variante das vom Master auf eine extra System auszulagern ist mir nicht bekannt (Vielleicht teste ich das mal und schreib dann etwas im Blog dazu).
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>master:54311</value>
    <description>Hostname oder IP-Adresse des Jobtrackers</description>
  </property>
</configuration>
Jetzt haben wir die gesamte Konfiguration nur auf dem Master-Knoten bereitgestellt. In einem Cluster möchte man die natürlich nicht auf jedem einzelnen Slave-Knoten wiederholen. Ich verteile die Einstellungen mit folgender Befehlskette mit dem SSH-Kopierbefehl scp:

for i in 1 2 3 ; do scp /usr/local/hadoop/conf/* slave$i:/usr/local/hadoop/conf; done


Nach der Verteilung der Konfiguration muss das HDFS noch auf dem Master-Knoten angelegt werden. Auf allen Slave-Knoten sollte kein HDFS angelegt sein. Das Anlegen des HDFS erfolgt auf dem Master unter dem Nutzer hadoop mit dem Befehl bin/hadoop namenode -format unter dem Verzeichnis /usr/local/hadoop/. Sind keine Auffälligkeiten in den Log-Dateien zu finden, kann das Hadoopcluster gestartet werden: 

/usr/local/hadoop/ bin/start-all.sh

Wie auch schon bei der Single-Installation starten jetzt die Dienste  NameNodeJobTracker und TaskTracker.

Freitag, 4. Oktober 2013

Setup Apache Hadoop auf ubuntu 12.04 LTS

Heute möchte ich euch zeigen, wie ein Apache Hadoop System auf einem ubuntu 12.04.LTS installiert wird. Die vorgestellte Installation ist die Weise, wie ich es mache, es gibt mit Sicherheit auch noch andere Varianten der Installation.

Voraussetzung:

Installation:

1. Installation von Java, darauf möchte ich nicht weiter eingehen. Bitte einfach im Internet suchen, wie es auf eurem Betriebssystem gemacht wird.

2. Einrichtung einer Gruppe hadoop und eines Nutzers hadoop:
    sudo addgroup hadoop
    sudo adduser --ingroup hadoop hadoop 
    3. Einrichtung eines SSH-Zugangs für den Nutzer hadoop:
    sudo apt-get install ssh 
    Erstellen eines passwortlosen SSH-Schlüssels
    su hadoop
    ssh-keygen -t rsa -P ""
    cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
    Test der Secure Shell (SSH) mit folgenden Befehl:
    ssh localhost 
    4. Hadoop entpacken und an einem geeignetem Ort Installieren
    In das Verzeichnis der geladenen Archivdatei von Hadoop wechseln und das Archive entpacken:
    tar xvzf hadoop-1.2.1.tar.gz
    Anschließend das Verzeichnis hadoop-1.2.1 an einen sinnvollen Ort verschieben:
    Ich habe dazu das Verzeichnis hadoop unter /usr/local/ (sudo mkdir hadoop) angelegt
    sudo mv hadoop-1.2.1/ /usr/local/hadoop/
    Jetzt die Rechte/Eigentümer ändern sonst geht nix.
    sudo chown - R hadoop:hadoop /usr/local/hadoop/
    Jetzt wird das Verzeichnis für das HDFS (Hadoop Distributed File System) angelegt. (Speicherort des Verzeichnis genau überlegen)
    sudo mkdir hdfs
    Damit der Nutzer hadoop das Verzeichnis voll nutzen kann, setze ich den Nutzer als Besitzer des Verzeichnisses ein.
    sudo chown hadoop:hadoop /usr/local/hdfs
    5. Hadoop Konfiguration
    • hadoop-env.sh (/usr/local/hadoop/conf)
    Hadoop ist ein in Java geschriebenes Framework. Daher benötigt es noch die Information wo liegt die JVM. Daher in der oben benannten Datei die Zeile
      export JAVA_HOME=/usr/lib/j2sdk1.5-sun
    an die Lokalen Gegebenheiten anpassen.  Wenn es Probleme gibt kann es an den Rechten des Nutzers hängen.
    In dieser Datei könnt ihr weitere Parameter für den Betrieb des Hadoop - Systems anpassen.
    • core-site.xml  (/usr/local/hadoop/conf)
    Anlegen des Temporären Verzeichnisses für Hadoop und eindeutige URI für das Dateisystem anlegen. Dies ist nur eine Auswahl an Properties, weiter sind auf der offizielen Hadoop Seite nachzulesen.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
      <name>hadoop.tmp.dir</name>
      <value>/usr/local/hdfs/hadoop-${user.name}</value>
      <description>Temporaeres Verzeichnis fuer das Hadoop FS</description>
    </property>
    <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:54310</value>
      <description>URI hadoop Dateisystem (NameNode)</description>
    </property>
    </configuration>
    • hdfs-site.xml (/usr/local/hadoop/hadoop-1.2.1/conf)
    Konfiguration der Verteilung im Dateisystem, hier ist die Verteilung auf 1 gesetzt. liegt, daran das ich hier ein Sinlge-Node Installation mache. Bei einer Cluster-Installation sollte der Wert höher sein. Ich denke da an mindestens 3.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
      <property>
         <name>dfs.replication</name>
         <value>1</value>
         <description>Anzahl der Replikationen</description>
      </property>
    </configuration>
    • mapred-site.xml (/usr/local/hadoop/conf)
    Die letzte Mini - Konfiguration ist des Hosts und der Portnummern gemacht.
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
      <property>
        <name>mapred.job.tracker</name>
        <value>localhost:54311</value>
        <description>Hostname oder IP-Adresse des Jobtrackers</description>
       </property>
    </configuration>
    6. Dateisystem anlegen
    Sind jetzt alle Konfigurationen abgeschlossen, könnt Ihr das HDFS formatieren. Dazu den folgenden Befehl ausführen:
    bin/hadoop namenode -format
    Ohne Probleme steht in der Konsole folgende Meldung:
    13/10/04 14:41:36 INFO namenode.NameNode: STARTUP_MSG:
    /************************************************************
    STARTUP_MSG: Starting NameNode
    STARTUP_MSG:   host = andreas-VirtualBox1/127.0.1.1
    STARTUP_MSG:   args = [-format]
    STARTUP_MSG:   version = 1.2.1
    STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
    STARTUP_MSG:   java = 1.6.0_43
    ************************************************************/
    13/10/04 14:41:36 INFO util.GSet: Computing capacity for map BlocksMap
    13/10/04 14:41:36 INFO util.GSet: VM type       = 64-bit
    13/10/04 14:41:36 INFO util.GSet: 2.0% max memory = 932118528
    13/10/04 14:41:36 INFO util.GSet: capacity      = 2^21 = 2097152 entries
    13/10/04 14:41:36 INFO util.GSet: recommended=2097152, actual=2097152
    13/10/04 14:41:37 INFO namenode.FSNamesystem: fsOwner=hadoop
    13/10/04 14:41:37 INFO namenode.FSNamesystem: supergroup=supergroup
    13/10/04 14:41:37 INFO namenode.FSNamesystem: isPermissionEnabled=true
    13/10/04 14:41:37 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
    13/10/04 14:41:37 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
    13/10/04 14:41:37 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
    13/10/04 14:41:37 INFO namenode.NameNode: Caching file names occuring more than 10 times
    13/10/04 14:41:37 INFO common.Storage: Image file /usr/local/hdfs/hadoop-hadoop/dfs/name/current/fsimage of size 112 bytes saved in 0 seconds.
    13/10/04 14:41:37 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/usr/local/hdfs/hadoop-hadoop/dfs/name/current/edits
    13/10/04 14:41:37 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/usr/local/hdfs/hadoop-hadoop/dfs/name/current/edits
    13/10/04 14:41:38 INFO common.Storage: Storage directory /usr/local/hdfs/hadoop-hadoop/dfs/name has been successfully formatted.
    13/10/04 14:41:38 INFO namenode.NameNode: SHUTDOWN_MSG:
    /************************************************************
    SHUTDOWN_MSG: Shutting down NameNode at andreas-VirtualBox1/127.0.1.1
    ************************************************************/
    7. Start des Hadoop System
    Ich befinde mich immer noch unter dem Nutzer hadoop!
    Um das System zu starten gibt es verschiedene Wege. Alles mit einmal ist unter /usr/local/hadoop/ bin/start-all.sh
     Damit sollten NameNode, JobTracker und TaskTracker gestartet sein.

    PS: Wenn euch der Post gefällt zeigt es mir durch eure Klicks.

    Freitag, 10. Juni 2011

    JBoss 5.1 den Port von 8080 auf 9090 ändern

    Unter ..\server\default\deploy\jbossweb.sar befindet sich die Datei server.xml in der ist der Connector für den Port zu finden:

    connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443"


    Hier kann der Port jetzt geändert werden.

    Montag, 6. Juni 2011

    Datum auf der Oracle DB abfragen

    Ist auf einer Oracle 11g mit einem Datum zu arbeiten, hat der SQL-Befehl folgende Teile zu enthalten

    ... to_date('value','dd.mm.yyyy hh24:mi:ss')...

    dem to_date('Wert','dd.mm.yyyy hh24:mi:ss') wird eine Zeichenkette Wert übergeben, für welche die Festlegung gilt 'dd.mm.yyyy hh24:mi:ss', d.h. Tag(dd).Monat(mm).Jahr(yyyy) mit der Uhrzeit(hh24):Minute(mi) und den Sekunden(ss).

    Wichtig ist, dass bei dieser Konfiguration 24h pro Tag angenommen werden. Wird nur hh angegeben sind alle Werte größer 12 unzulässig. Weiterhin sind die Minuten mit mi angegeben.
    Eine Fehlerquelle ist, wenn man analog dem Monat mm angibt.

    Weitere Infomrationen oder Varianten von to_date können im Internet in der Dokumentation gefunden werden.

    Donnerstag, 24. März 2011

    Referenzen einer Methode im Eclipse anzeigen

    Mit dem Cursor auf die zu untersuchende Methode gehen und das Kontextmenü aufrufen. Dort References aufrufen und dann nach Wahl über das Projekt oder den Workspace suchen.
    Einfach aber wird immer wieder vergessen (von mir).

    Mittwoch, 9. März 2011

    Select im Select mit Hibernate Criteria

    Um mit einer Criteria Abfrage in Hibernate ein SELECT in einem SELECT verwenden zu können, wird vom criteria-Objekt eine weiteres criteria-Objekt erzeugt.

    Criteria criteria = getSession().createCriteria(XY.class);

    criteria.add(Restrictions.like("attr1", '12'));
    criteria.add(Restrictions.eq("attr2", true));
    criteria.add(Restrictions.eq("attr3", false));

    Criteria childCriteria = criteria.createCriteria("xyz");
    childCriteria.add(Restrictions.between("date", von, bis));

    //Sortierung der Liste nach attr1 aufsteigend
    criteria.addOrder(Order.asc("attr1"));

    List result = criteria.list();

    Die Klassen bzw. Tabellen zu der Abfrage sehen wir folgt aus:

    @Entity
    @javax.persistence.Table(name = "XY")
    @Table(appliesTo = "XY")
    public class XY implements Serializable {

    private static final long serialVersionUID = -9L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long attr1;
    private boolean attr2;
    private boolean attr3;

    @OneToMany(targetEntity = XYZ.class, cascade = CascadeType.ALL)
    @JoinTable(name = "XY_XYZ")
    private List xyz;
    }

    @Entity
    @javax.persistence.Table(name = "XYZ")
    @Table(appliesTo = "XYZ")
    public class XYZ implements Serializable {

    private static final long serialVersionUID = 29L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private Date date;
    }

    Mittwoch, 19. Januar 2011

    Tomcat Server mit SecurityManager starten

    Soll ein Tomcat unter Windows mit der Option -Security gestartet werden soll, kann man den Tomcat wie folgt konfigurieren:
    tomcat6w.exe //MS //ApacheTomcat
    aufrufen
    unter dem Punkt Java folgendes hinzufügen
    -Djava.security.manager
    -Djava.security.policy=C:\Programme\apache-tomcat-6.0.29_x64\conf\catalina.policy
    Bei dem Policy Verzeichnis handelt es sich in Regelfall um das conf-Verzeichnis der Tomcatinstallation und dort um die Datei catalina.policy.