You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ni...@apache.org on 2009/07/09 21:04:43 UTC

svn commit: r792636 - in /hadoop/hbase/trunk: ./ bin/ conf/ src/java/org/apache/hadoop/hbase/zookeeper/ src/test/org/apache/hadoop/hbase/zookeeper/

Author: nitay
Date: Thu Jul  9 19:04:43 2009
New Revision: 792636

URL: http://svn.apache.org/viewvc?rev=792636&view=rev
Log:
HBASE-1551 HBase should manage multiple node ZooKeeper quorum

Added:
    hadoop/hbase/trunk/bin/zookeepers.sh
      - copied, changed from r792619, hadoop/hbase/trunk/bin/zookeeper.sh
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZKServerTool.java
Removed:
    hadoop/hbase/trunk/bin/hbase-zookeeper.sh
    hadoop/hbase/trunk/bin/zookeeper.sh
Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/bin/hbase-daemons.sh
    hadoop/hbase/trunk/bin/start-hbase.sh
    hadoop/hbase/trunk/bin/stop-hbase.sh
    hadoop/hbase/trunk/conf/hbase-default.xml
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java
    hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/zookeeper/HQuorumPeerTest.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Thu Jul  9 19:04:43 2009
@@ -452,6 +452,7 @@
    HBASE-1624  Don't sort Puts if only one in list in HCM#processBatchOfRows
    HBASE-1626  Allow emitting Deletes out of new TableReducer
                (Lars George via Stack)
+   HBASE-1551  HBase should manage multiple node ZooKeeper quorum
 
   OPTIMIZATIONS
    HBASE-1412  Change values for delete column and column family in KeyValue

Modified: hadoop/hbase/trunk/bin/hbase-daemons.sh
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/bin/hbase-daemons.sh?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/bin/hbase-daemons.sh (original)
+++ hadoop/hbase/trunk/bin/hbase-daemons.sh Thu Jul  9 19:04:43 2009
@@ -37,6 +37,20 @@
 
 . $bin/hbase-config.sh
 
-exec "$bin/regionservers.sh" --config "${HBASE_CONF_DIR}" \
- cd "${HBASE_HOME}" \; \
- "$bin/hbase-daemon.sh" --config "${HBASE_CONF_DIR}" "$@"
+remote_cmd="cd ${HBASE_HOME}; $bin/hbase-daemon.sh --config ${HBASE_CONF_DIR} $@"
+args="--config ${HBASE_CONF_DIR} $remote_cmd"
+
+command=$2
+case $command in
+  (regionserver)
+    exec "$bin/regionservers.sh" $args
+    ;;
+  (zookeeper)
+    exec "$bin/zookeepers.sh" $args
+    ;;
+  (*)
+    echo $usage
+    exit 1
+    ;;
+esac
+

Modified: hadoop/hbase/trunk/bin/start-hbase.sh
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/bin/start-hbase.sh?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/bin/start-hbase.sh (original)
+++ hadoop/hbase/trunk/bin/start-hbase.sh Thu Jul  9 19:04:43 2009
@@ -38,8 +38,8 @@
 then
   exit $errCode
 fi
-"$bin"/hbase-zookeeper.sh --config "${HBASE_CONF_DIR}" \
-  start zookeeper
+
+"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" start zookeeper
 "$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" start master 
 "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \
   --hosts "${HBASE_REGIONSERVERS}" start regionserver

Modified: hadoop/hbase/trunk/bin/stop-hbase.sh
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/bin/stop-hbase.sh?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/bin/stop-hbase.sh (original)
+++ hadoop/hbase/trunk/bin/stop-hbase.sh Thu Jul  9 19:04:43 2009
@@ -30,5 +30,4 @@
 . "$bin"/hbase-config.sh
 
 "$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" stop master
-"$bin"/hbase-zookeeper.sh --config "${HBASE_CONF_DIR}" \
-  stop zookeeper
+"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" stop zookeeper

Copied: hadoop/hbase/trunk/bin/zookeepers.sh (from r792619, hadoop/hbase/trunk/bin/zookeeper.sh)
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/bin/zookeepers.sh?p2=hadoop/hbase/trunk/bin/zookeepers.sh&p1=hadoop/hbase/trunk/bin/zookeeper.sh&r1=792619&r2=792636&rev=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/bin/zookeeper.sh (original)
+++ hadoop/hbase/trunk/bin/zookeepers.sh Thu Jul  9 19:04:43 2009
@@ -20,18 +20,17 @@
 # * limitations under the License.
 # */
 # 
-# Run a shell command on all regionserver hosts.
+# Run a shell command on all zookeeper hosts.
 #
 # Environment Variables
 #
-#   HADOOP_CONF_DIR  Alternate conf dir. Default is ${HADOOP_HOME}/conf.
 #   HBASE_CONF_DIR  Alternate hbase conf dir. Default is ${HBASE_HOME}/conf.
-#   HADOOP_SLAVE_SLEEP Seconds to sleep between spawning remote commands.
-#   HADOOP_SSH_OPTS Options passed to ssh when running remote commands.
+#   HBASE_SLAVE_SLEEP Seconds to sleep between spawning remote commands.
+#   HBASE_SSH_OPTS Options passed to ssh when running remote commands.
 #
 # Modelled after $HADOOP_HOME/bin/slaves.sh.
 
-usage="Usage: zookeeper [--config <hbase-confdir>] command..."
+usage="Usage: zookeepers [--config <hbase-confdir>] command..."
 
 # if no args specified, show usage
 if [ $# -le 0 ]; then
@@ -53,10 +52,14 @@
 fi
 
 if [ "$HBASE_MANAGES_ZK" = "true" ]; then
- ssh $HBASE_SSH_OPTS localhost $"${@// /\\ }" 2>&1 | sed "s/^/localhost: /" &
- if [ "$HBASE_SLAVE_SLEEP" != "" ]; then
-   sleep $HBASE_SLAVE_SLEEP
- fi
+  hosts=`"$bin"/hbase org.apache.hadoop.hbase.zookeeper.ZKServerTool`
+  cmd=$"${@// /\\ }"
+  for zookeeper in $hosts; do
+   ssh $HBASE_SSH_OPTS $zookeeper $cmd 2>&1 | sed "s/^/$zookeeper: /" &
+   if [ "$HBASE_SLAVE_SLEEP" != "" ]; then
+     sleep $HBASE_SLAVE_SLEEP
+   fi
+  done
 fi
 
 wait

Modified: hadoop/hbase/trunk/conf/hbase-default.xml
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/conf/hbase-default.xml?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/conf/hbase-default.xml (original)
+++ hadoop/hbase/trunk/conf/hbase-default.xml Thu Jul  9 19:04:43 2009
@@ -200,6 +200,21 @@
     </description>
   </property>
   <property>
+    <name>hbase.zookeeper.dns.interface</name>
+    <value>default</value>
+    <description>The name of the Network Interface from which a ZooKeeper server
+      should report its IP address.
+    </description>
+  </property>
+  <property>
+    <name>hbase.zookeeper.dns.nameserver</name>
+    <value>default</value>
+    <description>The host name or IP address of the name server (DNS)
+      which a ZooKeeper server should use to determine the host name used by the
+      master for communication and display purposes.
+    </description>
+  </property>
+  <property>
     <name>hbase.regionserver.dns.interface</name>
     <value>default</value>
     <description>The name of the Network Interface from which a region server 

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java Thu Jul  9 19:04:43 2009
@@ -19,8 +19,11 @@
  */
 package org.apache.hadoop.hbase.zookeeper;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.UnknownHostException;
 import java.util.Properties;
 import java.util.Map.Entry;
 
@@ -28,11 +31,11 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.net.DNS;
 import org.apache.zookeeper.server.ServerConfig;
 import org.apache.zookeeper.server.ZooKeeperServerMain;
 import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 import org.apache.zookeeper.server.quorum.QuorumPeerMain;
-import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException;
 
 /**
  * HBase's version of ZooKeeper's QuorumPeer. When HBase is set to manage
@@ -53,28 +56,24 @@
   private static final int ZK_CFG_PROPERTY_SIZE = ZK_CFG_PROPERTY.length();
 
   /**
-   * Parse ZooKeeper configuration and run a QuorumPeer.
-   * While parsing the zoo.cfg, we substitute variables with values from
-   * hbase-site.xml.
+   * Parse ZooKeeper configuration from HBase XML config and run a QuorumPeer.
    * @param args String[] of command line arguments. Not used.
-   * @throws IOException
    */
-  public static void main(String[] args) throws IOException {
+  public static void main(String[] args) {
     HBaseConfiguration conf = new HBaseConfiguration();
-    Properties zkProperties = makeZKProps(conf);
-
-    QuorumPeerConfig zkConfig = new QuorumPeerConfig();
     try {
+      Properties zkProperties = makeZKProps(conf);
+      writeMyID(zkProperties);
+      QuorumPeerConfig zkConfig = new QuorumPeerConfig();
       zkConfig.parseProperties(zkProperties);
-    } catch (ConfigException e) {
+      runZKServer(zkConfig);
+    } catch (Exception e) {
       e.printStackTrace();
       System.exit(-1);
     }
-
-    startZKServer(zkConfig);
   }
 
-  private static void startZKServer(QuorumPeerConfig zkConfig) throws IOException {
+  private static void runZKServer(QuorumPeerConfig zkConfig) throws UnknownHostException, IOException {
     if (zkConfig.isDistributed()) {
       QuorumPeerMain qp = new QuorumPeerMain();
       qp.runFromConfig(zkConfig);
@@ -86,6 +85,48 @@
     }
   }
 
+  private static void writeMyID(Properties properties) throws UnknownHostException, IOException {
+    HBaseConfiguration conf = new HBaseConfiguration();
+    String myAddress = DNS.getDefaultHost(
+        conf.get("hbase.zookeeper.dns.interface","default"),
+        conf.get("hbase.zookeeper.dns.nameserver","default"));
+
+    long myId = -1;
+
+    for (Entry<Object, Object> entry : properties.entrySet()) {
+      String key = entry.getKey().toString().trim();
+      String value = entry.getValue().toString().trim();
+      if (key.startsWith("server.")) {
+        int dot = key.indexOf('.');
+        long id = Long.parseLong(key.substring(dot + 1));
+        String[] parts = value.split(":");
+        String address = parts[0];
+        if (myAddress.equals(address)) {
+          myId = id;
+          break;
+        }
+      }
+    }
+
+    if (myId == -1) {
+      throw new IOException("Could not find my address: " + myAddress +
+                            " in list of ZooKeeper quorum servers");
+    }
+
+    String dataDirStr = properties.get("dataDir").toString().trim();
+    File dataDir = new File(dataDirStr);
+    if (!dataDir.isDirectory()) {
+      if (!dataDir.mkdirs()) {
+        throw new IOException("Unable to create data dir " + dataDir);
+      }
+    }
+
+    File myIdFile = new File(dataDir, "myid");
+    PrintWriter w = new PrintWriter(myIdFile);
+    w.println(myId);
+    w.close();
+  }
+
   /**
    * Make a Properties object holding ZooKeeper config equivalent to zoo.cfg.
    * If there is a zoo.cfg in the classpath, simply read it in. Otherwise parse
@@ -193,11 +234,11 @@
       if (key.startsWith("server.")) {
         if(conf.get(CLUSTER_DISTRIBUTED).equals(CLUSTER_IS_DISTRIBUTED) &&
             value.startsWith("localhost")) {
-           String msg = "The server in zoo.cfg cannot be set to localhost " +
+          String msg = "The server in zoo.cfg cannot be set to localhost " +
               "in a fully-distributed setup because it won't be reachable. " +
               "See \"Getting Started\" for more information.";
-           LOG.fatal(msg);
-           throw new IOException(msg);
+          LOG.fatal(msg);
+          throw new IOException(msg);
         }
       }
       newValue.append(value.substring(varEnd));

Added: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZKServerTool.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZKServerTool.java?rev=792636&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZKServerTool.java (added)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZKServerTool.java Thu Jul  9 19:04:43 2009
@@ -0,0 +1,33 @@
+package org.apache.hadoop.hbase.zookeeper;
+
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HConstants;
+
+/**
+ * Tool for reading ZooKeeper servers from HBase XML configuation and producing
+ * a line-by-line list for use by bash scripts.
+ */
+public class ZKServerTool implements HConstants {
+  /**
+   * Run the tool.
+   * @param args Command line arguments. First arg is path to zookeepers file.
+   */
+  public static void main(String args[]) {
+    HBaseConfiguration conf = new HBaseConfiguration();
+    // Note that we do not simply grab the property ZOOKEEPER_QUORUM from
+    // the HBaseConfiguration because the user may be using a zoo.cfg file.
+    Properties zkProps = HQuorumPeer.makeZKProps(conf);
+    for (Entry<Object, Object> entry : zkProps.entrySet()) {
+      String key = entry.getKey().toString().trim();
+      String value = entry.getValue().toString().trim();
+      if (key.startsWith("server.")) {
+        String[] parts = value.split(":");
+        String host = parts[0];
+        System.out.println(host);
+      }
+    }
+  }
+}

Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/zookeeper/HQuorumPeerTest.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/zookeeper/HQuorumPeerTest.java?rev=792636&r1=792635&r2=792636&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/zookeeper/HQuorumPeerTest.java (original)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/zookeeper/HQuorumPeerTest.java Thu Jul  9 19:04:43 2009
@@ -25,7 +25,6 @@
 import java.util.Properties;
 
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HBaseTestCase;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.zookeeper.server.quorum.QuorumPeerConfig;