Author: asavu
Date: Tue Oct 11 10:36:36 2011
New Revision: 1181696

URL: http://svn.apache.org/viewvc?rev=1181696&view=rev
Log:
WHIRR-368. Add the ability to adjust contents of hadoop-env.sh from a cluster 
properties file. Contributed by Karel Vervaeke

Modified:
    whirr/trunk/CHANGES.txt
    whirr/trunk/recipes/hbase-ec2-0.90.properties
    whirr/trunk/recipes/hbase-ec2-cdh.properties
    whirr/trunk/recipes/hbase-ec2.properties
    
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hadoop.sh
    whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hbase.sh
    
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationBuilder.java
    
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverter.java
    
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopDataNodeClusterActionHandler.java
    
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopNameNodeClusterActionHandler.java
    whirr/trunk/services/hadoop/src/main/resources/functions/configure_hadoop.sh
    
whirr/trunk/services/hadoop/src/main/resources/whirr-hadoop-default.properties
    
whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverterTest.java
    
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseConfigurationBuilder.java
    
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseMasterClusterActionHandler.java
    
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseRegionServerClusterActionHandler.java
    whirr/trunk/services/hbase/src/main/resources/functions/configure_hbase.sh
    whirr/trunk/services/hbase/src/main/resources/whirr-hbase-default.properties

Modified: whirr/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/whirr/trunk/CHANGES.txt?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- whirr/trunk/CHANGES.txt (original)
+++ whirr/trunk/CHANGES.txt Tue Oct 11 10:36:36 2011
@@ -29,6 +29,9 @@ Trunk (unreleased changes)
     WHIRR-395. Less verbose logging when setting firewall rules.
     (asavu via tomwhite)
 
+    WHIRR-368. Add the ability to adjust contents of hadoop-env.sh from 
+    a cluster properties file (Karel Vervaeke via asavu)
+
   BUG FIXES
 
     WHIRR-377. Fix broken CLI logging config. (asavu via tomwhite)

Modified: whirr/trunk/recipes/hbase-ec2-0.90.properties
URL: 
http://svn.apache.org/viewvc/whirr/trunk/recipes/hbase-ec2-0.90.properties?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- whirr/trunk/recipes/hbase-ec2-0.90.properties (original)
+++ whirr/trunk/recipes/hbase-ec2-0.90.properties Tue Oct 11 10:36:36 2011
@@ -56,3 +56,7 @@ whirr.hbase.tarball.url=http://apache.cu
 # This example uses Cloudera's CDH3.
 
whirr.hadoop.tarball.url=http://archive.cloudera.com/cdh/3/hadoop-0.20.2-cdh3u1.tar.gz
 
+# Options for the hbase master & regionserver processes
+#hbase-env.HBASE_MASTER_OPTS=-Xms1000m -Xmx1000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps -Xloggc:/data/hbase/logs/hbase-master-gc.log
+#hbase-env.HBASE_MASTER_OPTS=-Xms2000m -Xmx2000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=88 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-regionserver-gc.log
+

Modified: whirr/trunk/recipes/hbase-ec2-cdh.properties
URL: 
http://svn.apache.org/viewvc/whirr/trunk/recipes/hbase-ec2-cdh.properties?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- whirr/trunk/recipes/hbase-ec2-cdh.properties (original)
+++ whirr/trunk/recipes/hbase-ec2-cdh.properties Tue Oct 11 10:36:36 2011
@@ -55,3 +55,7 @@ whirr.location-id=us-east-1
 # By default use the user system SSH keys. Override them here.
 # whirr.private-key-file=${sys:user.home}/.ssh/id_rsa
 # whirr.public-key-file=${whirr.private-key-file}.pub
+
+# Options for the hbase master & regionserver processes
+#hbase-env.HBASE_MASTER_OPTS=-Xms1000m -Xmx1000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps -Xloggc:/data/hbase/logs/hbase-master-gc.log
+#hbase-env.HBASE_REGIONSERVER_OPTS=-Xms2000m -Xmx2000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=88 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-regionserver-gc.log

Modified: whirr/trunk/recipes/hbase-ec2.properties
URL: 
http://svn.apache.org/viewvc/whirr/trunk/recipes/hbase-ec2.properties?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- whirr/trunk/recipes/hbase-ec2.properties (original)
+++ whirr/trunk/recipes/hbase-ec2.properties Tue Oct 11 10:36:36 2011
@@ -46,3 +46,8 @@ whirr.location-id=us-east-1
 
 # Expert: specify the version of HBase to install.
 
#whirr.hbase.tarball.url=http://archive.apache.org/dist/hbase/hbase-0.89.20100924/hbase-0.89.20100924-bin.tar.gz
+
+# Options for the hbase master & regionserver processes
+#hbase-env.HBASE_MASTER_OPTS=-Xms1000m -Xmx1000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps -Xloggc:/data/hbase/logs/hbase-master-gc.log
+#hbase-env.HBASE_REGIONSERVER_OPTS=-Xms2000m -Xmx2000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=88 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-regionserver-gc.log
+

Modified: 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hadoop.sh
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hadoop.sh?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hadoop.sh 
(original)
+++ 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hadoop.sh 
Tue Oct 11 10:36:36 2011
@@ -51,6 +51,7 @@ function configure_cdh_hadoop() {
 
   # Copy generated configuration files in place
   cp /tmp/{core,hdfs,mapred}-site.xml $HADOOP_CONF_DIR
+  cp /tmp/hadoop-env.sh $HADOOP_CONF_DIR
 
   # Expose /metrics URL endpoint
   cat > $HADOOP_CONF_DIR/hadoop-metrics.properties <<EOF
@@ -61,21 +62,26 @@ jvm.class=org.apache.hadoop.metrics.spi.
 rpc.class=org.apache.hadoop.metrics.spi.NoEmitMetricsContext
 EOF
 
-  # Set SSH options within the cluster
-  sed -i -e 's|# export HADOOP_SSH_OPTS=.*|export HADOOP_SSH_OPTS="-o 
StrictHostKeyChecking=no"|' \
-    $HADOOP_CONF_DIR/hadoop-env.sh
-    
-  # Disable IPv6
-  sed -i -e 's|# Extra Java runtime options.  Empty by default.|# Extra Java 
runtime options.  Empty by default.\nexport HADOOP_OPTS="$HADOOP_OPTS 
-Djava.net.preferIPv4Stack=true"|' \
-    $HADOOP_CONF_DIR/hadoop-env.sh
+  # Keep PID files in a non-temporary directory
+  HADOOP_PID_DIR=$(. /tmp/hadoop-env.sh; echo $HADOOP_PID_DIR)
+  HADOOP_PID_DIR=${HADOOP_PID_DIR:-/var/run/hadoop}
+  mkdir -p $HADOOP_PID_DIR
+  chgrp -R hadoop $HADOOP_PID_DIR
+  chmod -R g+w $HADOOP_PID_DIR
 
-  # Hadoop logs should be on the /data partition
-  rm -rf /var/log/hadoop-0.20
+  # Create the actual log dir
   mkdir -p /data/hadoop/logs
-  chmod g+w /data/hadoop/logs
   chgrp -R hadoop /data/hadoop/logs
-  ln -s /data/hadoop/logs /var/log/hadoop-0.20
-  chgrp -R hadoop /var/log/hadoop /var/log/hadoop-0.20
+  chmod -R g+w /data/hadoop/logs
+
+  # Create a symlink at $HADOOP_LOG_DIR
+  HADOOP_LOG_DIR=$(. /tmp/hadoop-env.sh; echo $HADOOP_LOG_DIR)
+  HADOOP_LOG_DIR=${HADOOP_LOG_DIR:-/var/log/hadoop/logs}
+  rm -rf $HADOOP_LOG_DIR
+  mkdir -p $(dirname $HADOOP_LOG_DIR)
+  ln -s /data/hadoop/logs $HADOOP_LOG_DIR
+  chgrp -R hadoop $HADOOP_LOG_DIR
+  chmod -R $HADOOP_LOG_DIR
 
   for role in $(echo "$ROLES" | tr "," "\n"); do
     case $role in

Modified: 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hbase.sh
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hbase.sh?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hbase.sh 
(original)
+++ 
whirr/trunk/services/cdh/src/main/resources/functions/configure_cdh_hbase.sh 
Tue Oct 11 10:36:36 2011
@@ -77,14 +77,27 @@ function configure_cdh_hbase() {
     chmod a+rwxt /data/tmp
   fi
 
-  # Copy generated configuration file in place
+  # Copy generated configuration files in place
   cp /tmp/hbase-site.xml $HBASE_CONF_DIR
+  cp /tmp/hbase-env.sh $HBASE_CONF_DIR
 
-  # override JVM options
-  cat >> $HBASE_CONF_DIR/hbase-env.sh <<EOF
-export HBASE_MASTER_OPTS="-Xms1000m -Xmx1000m -Xmn256m -XX:+UseConcMarkSweepGC 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-master-gc.log"
-export HBASE_REGIONSERVER_OPTS="-Xms2000m -Xmx2000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=88 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-regionserver-gc.log"
-EOF
+  # HBASE_PID_DIR should exist and be owned by hadoop:hadoop
+  HBASE_PID_DIR=$(. $HBASE_CONF_DIR/hbase-env.sh; echo $HBASE_PID_DIR)
+  HBASE_PID_DIR=${HBASE_PID_DIR:-/var/run/hbase}
+  mkdir -p $HBASE_PID_DIR
+  chown -R hadoop:hadoop $HBASE_PID_DIR
+
+  # Create the actual log dir
+  mkdir -p /data/hbase/logs
+  chown -R hbase:hbase /data/hbase/logs
+
+  # Create a symlink at $HBASE_LOG_DIR
+  HBASE_LOG_DIR=$(. $HBASE_CONF_DIR/hbase-env.sh; echo $HBASE_LOG_DIR)
+  HBASE_LOG_DIR=${HBASE_LOG_DIR:-/var/log/hbase}
+  rm -rf $HBASE_LOG_DIR
+  mkdir -p $(dirname $HBASE_LOG_DIR)
+  ln -s /data/hbase/logs $HBASE_LOG_DIR
+  chown -R hbase:hbase $HBASE_LOG_DIR
 
   # configure hbase for ganglia
   cat > $HBASE_CONF_DIR/hadoop-metrics.properties <<EOF
@@ -99,27 +112,6 @@ jvm.period=10
 jvm.servers=$MASTER_HOST:8649
 EOF
 
-  # keep PID files in a non-temporary directory
-  sed -i -e "s|# export HBASE_PID_DIR=.*|export HBASE_PID_DIR=/var/run/hbase|" 
\
-    $HBASE_CONF_DIR/hbase-env.sh
-
-  # set SSH options within the cluster
-  sed -i -e 's|# export HBASE_SSH_OPTS=.*|export HBASE_SSH_OPTS="-o 
StrictHostKeyChecking=no"|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-
-  # disable IPv6
-  sed -i -e 's|export HBASE_OPTS="$HBASE_OPTS -ea -XX:+UseConcMarkSweepGC 
-XX:+CMSIncrementalMode"|export HBASE_OPTS="$HBASE_OPTS -ea 
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode 
-Djava.net.preferIPv4Stack=true"|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-
-  # hbase logs should be on the /data partition
-  sed -i -e 's|# export HBASE_LOG_DIR=.*|export 
HBASE_LOG_DIR=/var/log/hbase/logs|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-  rm -rf /var/log/hbase
-  mkdir /data/hbase/logs
-  chown hbase:hbase /data/hbase/logs
-  ln -s /data/hbase/logs /var/log/hbase
-  chown -R hbase:hbase /var/log/hbase
-
   # Now that the configuration is done, install the daemon packages
   for role in $(echo "$ROLES" | tr "," "\n"); do
     case $role in

Modified: 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationBuilder.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationBuilder.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationBuilder.java
 (original)
+++ 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationBuilder.java
 Tue Oct 11 10:36:36 2011
@@ -56,21 +56,28 @@ public class HadoopConfigurationBuilder 
       Cluster cluster) throws ConfigurationException, IOException {
     Configuration config = buildCommonConfiguration(clusterSpec, cluster,
         new PropertiesConfiguration(WHIRR_HADOOP_DEFAULT_PROPERTIES));
-    return HadoopConfigurationConverter.asCreateFileStatement(path, config);
+    return 
HadoopConfigurationConverter.asCreateXmlConfigurationFileStatement(path, 
config);
   }
   
   public static Statement buildHdfs(String path, ClusterSpec clusterSpec,
       Cluster cluster) throws ConfigurationException, IOException {
     Configuration config = buildHdfsConfiguration(clusterSpec, cluster,
         new PropertiesConfiguration(WHIRR_HADOOP_DEFAULT_PROPERTIES));
-    return HadoopConfigurationConverter.asCreateFileStatement(path, config);
+    return 
HadoopConfigurationConverter.asCreateXmlConfigurationFileStatement(path, 
config);
   }
   
   public static Statement buildMapReduce(String path, ClusterSpec clusterSpec,
       Cluster cluster) throws ConfigurationException, IOException {
     Configuration config = buildMapReduceConfiguration(clusterSpec, cluster,
         new PropertiesConfiguration(WHIRR_HADOOP_DEFAULT_PROPERTIES));
-    return HadoopConfigurationConverter.asCreateFileStatement(path, config);
+    return 
HadoopConfigurationConverter.asCreateXmlConfigurationFileStatement(path, 
config);
+  }
+  
+  public static Statement buildHadoopEnv(String path, ClusterSpec clusterSpec,
+      Cluster cluster) throws ConfigurationException, IOException {
+    Configuration config = buildHadoopEnvConfiguration(clusterSpec, cluster,
+        new PropertiesConfiguration(WHIRR_HADOOP_DEFAULT_PROPERTIES));
+    return 
HadoopConfigurationConverter.asCreateEnvironmentVariablesFileStatement(path, 
config);
   }
   
   @VisibleForTesting
@@ -131,6 +138,12 @@ public class HadoopConfigurationBuilder 
         jobtracker.getPublicAddress().getHostName()));
     return config;
   }
+
+  @VisibleForTesting
+  static Configuration buildHadoopEnvConfiguration(ClusterSpec clusterSpec,
+      Cluster cluster, Configuration defaults) throws ConfigurationException {
+    return build(clusterSpec, cluster, defaults, "hadoop-env");
+  }
   
   private static void setIfAbsent(Configuration config, String property, 
String value) {
     if (!config.containsKey(property)) {

Modified: 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverter.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverter.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverter.java
 (original)
+++ 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverter.java
 Tue Oct 11 10:36:36 2011
@@ -38,7 +38,7 @@ public class HadoopConfigurationConverte
   private static final String FINAL_SUFFIX = ".final";
 
   @VisibleForTesting
-  static List<String> asLinesInFile(Configuration hadoopConfig) {
+  static List<String> asXmlConfigurationLines(Configuration hadoopConfig) {
     List<String> lines = Lists.newArrayList();
     lines.add("<configuration>");
     for (@SuppressWarnings("unchecked")
@@ -64,9 +64,36 @@ public class HadoopConfigurationConverte
     return lines;
   }
   
-  public static Statement asCreateFileStatement(String path, 
+  public static Statement asCreateXmlConfigurationFileStatement(String path, 
       Configuration hadoopConfig) {
-    return Statements.appendFile(path, asLinesInFile(hadoopConfig));
+    return Statements.appendFile(path, asXmlConfigurationLines(hadoopConfig));
   }
 
+  @VisibleForTesting
+  static List<String> asEnvironmentVariablesLines(Configuration hadoopConfig) {
+    List<String> lines = Lists.newArrayList();
+    
+    for (@SuppressWarnings("unchecked")
+        Iterator<String> it = hadoopConfig.getKeys(); it.hasNext(); ) {
+      String key = it.next();
+      if (key.endsWith(FINAL_SUFFIX)) {
+        continue;
+      }
+
+      // Write the export line. We only allow one value per key 
+      String value = hadoopConfig.getString(key);
+      lines.add(new StringBuilder("export ")
+            .append(key)
+            .append("=\"")
+            .append(value)
+            .append("\"").toString());
+    }
+    return lines;
+  }
+  
+  public static Statement asCreateEnvironmentVariablesFileStatement(String 
path, 
+      Configuration config) {
+    return Statements.appendFile(path, asEnvironmentVariablesLines(config));
+  }
+  
 }

Modified: 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopDataNodeClusterActionHandler.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopDataNodeClusterActionHandler.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopDataNodeClusterActionHandler.java
 (original)
+++ 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopDataNodeClusterActionHandler.java
 Tue Oct 11 10:36:36 2011
@@ -21,6 +21,7 @@ package org.apache.whirr.service.hadoop;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildCommon;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildHdfs;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildMapReduce;
+import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildHadoopEnv;
 import static org.jclouds.scriptbuilder.domain.Statements.call;
 
 import java.io.IOException;
@@ -49,7 +50,8 @@ public class HadoopDataNodeClusterAction
       event.getStatementBuilder().addStatements(
         buildCommon("/tmp/core-site.xml", clusterSpec, cluster),
         buildHdfs("/tmp/hdfs-site.xml", clusterSpec, cluster),
-        buildMapReduce("/tmp/mapred-site.xml", clusterSpec, cluster)
+        buildMapReduce("/tmp/mapred-site.xml", clusterSpec, cluster),
+        buildHadoopEnv("/tmp/hadoop-env.sh", clusterSpec, cluster)
       );
     } catch (ConfigurationException e) {
       throw new IOException(e);

Modified: 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopNameNodeClusterActionHandler.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopNameNodeClusterActionHandler.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopNameNodeClusterActionHandler.java
 (original)
+++ 
whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopNameNodeClusterActionHandler.java
 Tue Oct 11 10:36:36 2011
@@ -20,6 +20,7 @@ package org.apache.whirr.service.hadoop;
 
 import static org.apache.whirr.RolePredicates.role;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildCommon;
+import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildHadoopEnv;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildHdfs;
 import static 
org.apache.whirr.service.hadoop.HadoopConfigurationBuilder.buildMapReduce;
 import static org.jclouds.scriptbuilder.domain.Statements.call;
@@ -80,7 +81,8 @@ public class HadoopNameNodeClusterAction
       event.getStatementBuilder().addStatements(
         buildCommon("/tmp/core-site.xml", clusterSpec, cluster),
         buildHdfs("/tmp/hdfs-site.xml", clusterSpec, cluster),
-        buildMapReduce("/tmp/mapred-site.xml", clusterSpec, cluster)
+        buildMapReduce("/tmp/mapred-site.xml", clusterSpec, cluster),
+        buildHadoopEnv("/tmp/hadoop-env.sh", clusterSpec, cluster)
       );
     } catch (ConfigurationException e) {
       throw new IOException(e);

Modified: 
whirr/trunk/services/hadoop/src/main/resources/functions/configure_hadoop.sh
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/resources/functions/configure_hadoop.sh?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/resources/functions/configure_hadoop.sh 
(original)
+++ 
whirr/trunk/services/hadoop/src/main/resources/functions/configure_hadoop.sh 
Tue Oct 11 10:36:36 2011
@@ -53,30 +53,26 @@ function configure_hadoop() {
 
   # Copy generated configuration files in place
   cp /tmp/{core,hdfs,mapred}-site.xml $HADOOP_CONF_DIR
+  cp /tmp/hadoop-env.sh $HADOOP_CONF_DIR
 
   # Keep PID files in a non-temporary directory
-  sed -i -e "s|# export HADOOP_PID_DIR=.*|export 
HADOOP_PID_DIR=/var/run/hadoop|" \
-    $HADOOP_CONF_DIR/hadoop-env.sh
-  mkdir -p /var/run/hadoop
-  chown -R hadoop:hadoop /var/run/hadoop
-
-  # Set SSH options within the cluster
-  sed -i -e 's|# export HADOOP_SSH_OPTS=.*|export HADOOP_SSH_OPTS="-o 
StrictHostKeyChecking=no"|' \
-    $HADOOP_CONF_DIR/hadoop-env.sh
-    
-  # Disable IPv6
-  sed -i -e 's|# export HADOOP_OPTS=.*|export 
HADOOP_OPTS="-Djava.net.preferIPv4Stack=true"|' \
-    $HADOOP_CONF_DIR/hadoop-env.sh
-
-  # Hadoop logs should be on the /data partition
-  sed -i -e 's|# export HADOOP_LOG_DIR=.*|export 
HADOOP_LOG_DIR=/var/log/hadoop/logs|' \
-    $HADOOP_CONF_DIR/hadoop-env.sh
-  rm -rf /var/log/hadoop
-  mkdir /data/hadoop/logs
-  chown hadoop:hadoop /data/hadoop/logs
-  ln -s /data/hadoop/logs /var/log/hadoop
-  chown -R hadoop:hadoop /var/log/hadoop
-  
+  HADOOP_PID_DIR=$(. /tmp/hadoop-env.sh; echo $HADOOP_PID_DIR)
+  HADOOP_PID_DIR=${HADOOP_PID_DIR:-/var/run/hadoop}
+  mkdir -p $HADOOP_PID_DIR
+  chown -R hadoop:hadoop $HADOOP_PID_DIR
+
+  # Create the actual log dir
+  mkdir -p /data/hadoop/logs
+  chown -R hadoop:hadoop /data/hadoop/logs
+
+  # Create a symlink at $HADOOP_LOG_DIR
+  HADOOP_LOG_DIR=$(. /tmp/hadoop-env.sh; echo $HADOOP_LOG_DIR)
+  HADOOP_LOG_DIR=${HADOOP_LOG_DIR:-/var/log/hadoop/logs}
+  rm -rf $HADOOP_LOG_DIR
+  mkdir -p $(dirname $HADOOP_LOG_DIR)
+  ln -s /data/hadoop/logs $HADOOP_LOG_DIR
+  chown -R hadoop:hadoop $HADOOP_LOG_DIR
+
   for role in $(echo "$ROLES" | tr "," "\n"); do
     case $role in
     hadoop-namenode)

Modified: 
whirr/trunk/services/hadoop/src/main/resources/whirr-hadoop-default.properties
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/main/resources/whirr-hadoop-default.properties?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/main/resources/whirr-hadoop-default.properties 
(original)
+++ 
whirr/trunk/services/hadoop/src/main/resources/whirr-hadoop-default.properties 
Tue Oct 11 10:36:36 2011
@@ -47,3 +47,13 @@ hadoop-mapreduce.mapred.compress.map.out
 hadoop-mapreduce.mapred.output.compression.type=BLOCK
 hadoop-mapreduce.mapred.child.java.opts=-Xmx550m
 hadoop-mapreduce.mapred.child.ulimit=1126400
+
+# hadoop-env.sh
+# keep PID files in a non-temporary directory
+hadoop-env.HADOOP_PID_DIR=/var/run/hadoop
+# set SSH options within the cluster
+hadoop-env.HADOOP_SSH_OPTS=-o StrictHostKeyChecking=no
+# disable ipv6
+hadoop-env.HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
+# Log dir. Note: This will be a symlink. The actual location is determined in 
the install function.
+hadoop-env.HADOOP_LOG_DIR=/var/log/hadoop/logs

Modified: 
whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverterTest.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverterTest.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverterTest.java
 (original)
+++ 
whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/HadoopConfigurationConverterTest.java
 Tue Oct 11 10:36:36 2011
@@ -36,7 +36,7 @@ public class HadoopConfigurationConverte
     Configuration conf = new PropertiesConfiguration();
     conf.setProperty("p1", "v1,v2");
     conf.setProperty("p2", "v3");
-    List<String> lines = HadoopConfigurationConverter.asLinesInFile(conf);
+    List<String> lines = 
HadoopConfigurationConverter.asXmlConfigurationLines(conf);
     assertThat(lines, is((List<String>) Lists.newArrayList(
         "<configuration>",
         "  <property>",
@@ -57,7 +57,7 @@ public class HadoopConfigurationConverte
     conf.setProperty("p1", "v1");
     conf.setProperty("p2", "v2");
     conf.setProperty("p2.final", "true");
-    List<String> lines = HadoopConfigurationConverter.asLinesInFile(conf);
+    List<String> lines = 
HadoopConfigurationConverter.asXmlConfigurationLines(conf);
     assertThat(lines, is((List<String>) Lists.newArrayList(
         "<configuration>",
         "  <property>",

Modified: 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseConfigurationBuilder.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseConfigurationBuilder.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseConfigurationBuilder.java
 (original)
+++ 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseConfigurationBuilder.java
 Tue Oct 11 10:36:36 2011
@@ -37,7 +37,7 @@ public class HBaseConfigurationBuilder {
       throws ConfigurationException, IOException {
     Configuration config = buildHBaseSiteConfiguration(clusterSpec, cluster,
         new 
PropertiesConfiguration(HBaseConstants.FILE_HBASE_DEFAULT_PROPERTIES));
-    return HadoopConfigurationConverter.asCreateFileStatement(path, config);
+    return 
HadoopConfigurationConverter.asCreateXmlConfigurationFileStatement(path, 
config);
   }
 
   static Configuration buildHBaseSiteConfiguration(ClusterSpec clusterSpec, 
Cluster cluster, Configuration defaults)
@@ -54,6 +54,20 @@ public class HBaseConfigurationBuilder {
     return config;
   }
 
+  public static Statement buildHBaseEnv(String path, ClusterSpec clusterSpec, 
Cluster cluster)
+      throws ConfigurationException, IOException {
+    Configuration config = buildHBaseEnvConfiguration(clusterSpec, cluster,
+        new 
PropertiesConfiguration(HBaseConstants.FILE_HBASE_DEFAULT_PROPERTIES));
+    return 
HadoopConfigurationConverter.asCreateEnvironmentVariablesFileStatement(path, 
config);
+  }
+
+  static Configuration buildHBaseEnvConfiguration(ClusterSpec clusterSpec, 
Cluster cluster, Configuration defaults)
+      throws ConfigurationException, IOException {
+    Configuration config = build(clusterSpec, cluster, defaults, "hbase-env");
+
+    return config;
+  }
+
   private static Configuration build(ClusterSpec clusterSpec, Cluster cluster, 
Configuration defaults, String prefix)
       throws ConfigurationException {
     CompositeConfiguration config = new CompositeConfiguration();

Modified: 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseMasterClusterActionHandler.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseMasterClusterActionHandler.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseMasterClusterActionHandler.java
 (original)
+++ 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseMasterClusterActionHandler.java
 Tue Oct 11 10:36:36 2011
@@ -19,7 +19,7 @@
 package org.apache.whirr.service.hbase;
 
 import static org.apache.whirr.RolePredicates.role;
-import static org.apache.whirr.service.FirewallManager.Rule;
+import static 
org.apache.whirr.service.hbase.HBaseConfigurationBuilder.buildHBaseEnv;
 import static 
org.apache.whirr.service.hbase.HBaseConfigurationBuilder.buildHBaseSite;
 import static org.jclouds.scriptbuilder.domain.Statements.call;
 
@@ -33,11 +33,13 @@ import java.net.InetAddress;
 import java.util.Map.Entry;
 import java.util.Properties;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.whirr.Cluster;
 import org.apache.whirr.Cluster.Instance;
 import org.apache.whirr.ClusterSpec;
 import org.apache.whirr.service.ClusterActionEvent;
+import org.apache.whirr.service.FirewallManager.Rule;
 import org.apache.whirr.service.hadoop.HadoopProxy;
 import org.apache.whirr.service.zookeeper.ZooKeeperCluster;
 import org.slf4j.Logger;
@@ -82,6 +84,7 @@ public class HBaseMasterClusterActionHan
   protected void beforeConfigure(ClusterActionEvent event) throws IOException, 
InterruptedException {
     ClusterSpec clusterSpec = event.getClusterSpec();
     Cluster cluster = event.getCluster();
+    Configuration conf = getConfiguration(clusterSpec);
 
     LOG.info("Authorizing firewall");
     Instance instance = cluster.getInstanceMatching(role(ROLE));
@@ -94,8 +97,9 @@ public class HBaseMasterClusterActionHan
     );
 
     try {
-      event.getStatementBuilder().addStatement(
-        buildHBaseSite("/tmp/hbase-site.xml", clusterSpec, cluster)
+      event.getStatementBuilder().addStatements(
+          buildHBaseSite("/tmp/hbase-site.xml", clusterSpec, cluster),
+          buildHBaseEnv("/tmp/hbase-env.sh", clusterSpec, cluster)
       );
     } catch (ConfigurationException e) {
       throw new IOException(e);
@@ -105,16 +109,16 @@ public class HBaseMasterClusterActionHan
     String quorum = ZooKeeperCluster.getHosts(cluster);
 
     String tarurl = prepareRemoteFileUrl(event,
-      getConfiguration(clusterSpec).getString(HBaseConstants.KEY_TARBALL_URL));
+      conf.getString(HBaseConstants.KEY_TARBALL_URL));
 
     addStatement(event, call(
-      getConfigureFunction(getConfiguration(clusterSpec)),
+      getConfigureFunction(conf),
       ROLE,
       HBaseConstants.PARAM_MASTER, master,
       HBaseConstants.PARAM_QUORUM, quorum,
       HBaseConstants.PARAM_PROVIDER, clusterSpec.getProvider(),
-      HBaseConstants.PARAM_TARBALL_URL, tarurl)
-    );
+      HBaseConstants.PARAM_TARBALL_URL, tarurl
+    ));
   }
 
   @Override

Modified: 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseRegionServerClusterActionHandler.java
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseRegionServerClusterActionHandler.java?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseRegionServerClusterActionHandler.java
 (original)
+++ 
whirr/trunk/services/hbase/src/main/java/org/apache/whirr/service/hbase/HBaseRegionServerClusterActionHandler.java
 Tue Oct 11 10:36:36 2011
@@ -20,12 +20,14 @@ package org.apache.whirr.service.hbase;
 
 import static org.apache.whirr.RolePredicates.role;
 import static org.apache.whirr.service.FirewallManager.Rule;
+import static 
org.apache.whirr.service.hbase.HBaseConfigurationBuilder.buildHBaseEnv;
 import static 
org.apache.whirr.service.hbase.HBaseConfigurationBuilder.buildHBaseSite;
 import static org.jclouds.scriptbuilder.domain.Statements.call;
 
 import java.io.IOException;
 import java.net.InetAddress;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.whirr.Cluster;
 import org.apache.whirr.Cluster.Instance;
@@ -70,6 +72,7 @@ public class HBaseRegionServerClusterAct
       throws IOException, InterruptedException {
     ClusterSpec clusterSpec = event.getClusterSpec();
     Cluster cluster = event.getCluster();
+    Configuration conf = getConfiguration(clusterSpec);
 
     Instance instance = cluster.getInstanceMatching(
       role(HBaseMasterClusterActionHandler.ROLE));
@@ -82,8 +85,9 @@ public class HBaseRegionServerClusterAct
     );
 
     try {
-      event.getStatementBuilder().addStatement(
-        buildHBaseSite("/tmp/hbase-site.xml", clusterSpec, cluster)
+      event.getStatementBuilder().addStatements(
+          buildHBaseSite("/tmp/hbase-site.xml", clusterSpec, cluster),
+          buildHBaseEnv("/tmp/hbase-env.sh", clusterSpec, cluster)
       );
     } catch (ConfigurationException e) {
       throw new IOException(e);
@@ -93,10 +97,10 @@ public class HBaseRegionServerClusterAct
     String quorum = ZooKeeperCluster.getHosts(cluster);
 
     String tarurl = prepareRemoteFileUrl(event,
-      getConfiguration(clusterSpec).getString(HBaseConstants.KEY_TARBALL_URL));
+      conf.getString(HBaseConstants.KEY_TARBALL_URL));
 
     addStatement(event, call(
-      getConfigureFunction(getConfiguration(clusterSpec)),
+      getConfigureFunction(conf),
       ROLE,
       HBaseConstants.PARAM_MASTER, master,
       HBaseConstants.PARAM_QUORUM, quorum,

Modified: 
whirr/trunk/services/hbase/src/main/resources/functions/configure_hbase.sh
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hbase/src/main/resources/functions/configure_hbase.sh?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- whirr/trunk/services/hbase/src/main/resources/functions/configure_hbase.sh 
(original)
+++ whirr/trunk/services/hbase/src/main/resources/functions/configure_hbase.sh 
Tue Oct 11 10:36:36 2011
@@ -91,14 +91,25 @@ function configure_hbase() {
   mkdir /etc/hbase
   ln -s $HBASE_CONF_DIR /etc/hbase/conf
 
-  # Copy generated configuration file in place
+  # Copy generated configuration files in place
   cp /tmp/hbase-site.xml $HBASE_CONF_DIR
+  cp /tmp/hbase-env.sh $HBASE_CONF_DIR
 
-  # override JVM options
-  cat >> $HBASE_CONF_DIR/hbase-env.sh <<EOF
-export HBASE_MASTER_OPTS="-Xms1000m -Xmx1000m -Xmn256m -XX:+UseConcMarkSweepGC 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/mnt/hbase/logs/hbase-master-gc.log"
-export HBASE_REGIONSERVER_OPTS="-Xms2000m -Xmx2000m -Xmn256m 
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=88 
-XX:+AggressiveOpts -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/mnt/hbase/logs/hbase-regionserver-gc.log"
-EOF
+  # HBASE_PID_DIR should exist and be owned by hadoop:hadoop
+  mkdir -p /var/run/hbase
+  chown -R hadoop:hadoop /var/run/hbase
+  
+  # Create the actual log dir
+  mkdir -p $MOUNT/hbase/logs
+  chown -R hadoop:hadoop $MOUNT/hbase/logs
+
+  # Create a symlink at $HBASE_LOG_DIR
+  HBASE_LOG_DIR=$(. $HBASE_CONF_DIR/hbase-env.sh; echo $HBASE_LOG_DIR)
+  HBASE_LOG_DIR=${HBASE_LOG_DIR:-/var/log/hbase/logs}
+  rm -rf $HBASE_LOG_DIR
+  mkdir -p $(dirname $HBASE_LOG_DIR)
+  ln -s $MOUNT/hbase/logs $HBASE_LOG_DIR
+  chown -R hadoop:hadoop $HBASE_LOG_DIR
 
   # configure hbase for ganglia
   cat > $HBASE_CONF_DIR/hadoop-metrics.properties <<EOF
@@ -146,29 +157,6 @@ EOF
     echo Copy hadoop jar to HBase error: did not find your Hadoop installation
   fi
 
-  # keep PID files in a non-temporary directory
-  sed -i -e "s|# export HBASE_PID_DIR=.*|export HBASE_PID_DIR=/var/run/hbase|" 
\
-    $HBASE_CONF_DIR/hbase-env.sh
-  mkdir -p /var/run/hbase
-  chown -R hadoop:hadoop /var/run/hbase
-
-  # set SSH options within the cluster
-  sed -i -e 's|# export HBASE_SSH_OPTS=.*|export HBASE_SSH_OPTS="-o 
StrictHostKeyChecking=no"|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-
-  # disable IPv6
-  sed -i -e 's|# export HBASE_OPTS=.*|export 
HBASE_OPTS="-Djava.net.preferIPv4Stack=true"|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-
-  # hbase logs should be on the /mnt partition
-  sed -i -e 's|# export HBASE_LOG_DIR=.*|export 
HBASE_LOG_DIR=/var/log/hbase/logs|' \
-    $HBASE_CONF_DIR/hbase-env.sh
-  rm -rf /var/log/hbase
-  mkdir $MOUNT/hbase/logs
-  chown hadoop:hadoop $MOUNT/hbase/logs
-  ln -s $MOUNT/hbase/logs /var/log/hbase
-  chown -R hadoop:hadoop /var/log/hbase
-  
   for role in $(echo "$ROLES" | tr "," "\n"); do
     case $role in
     hbase-master)

Modified: 
whirr/trunk/services/hbase/src/main/resources/whirr-hbase-default.properties
URL: 
http://svn.apache.org/viewvc/whirr/trunk/services/hbase/src/main/resources/whirr-hbase-default.properties?rev=1181696&r1=1181695&r2=1181696&view=diff
==============================================================================
--- 
whirr/trunk/services/hbase/src/main/resources/whirr-hbase-default.properties 
(original)
+++ 
whirr/trunk/services/hbase/src/main/resources/whirr-hbase-default.properties 
Tue Oct 11 10:36:36 2011
@@ -32,3 +32,17 @@ hbase-site.hbase.client.retries.number=1
 # hbase.client.retries.number)
 hbase-site.hbase.zookeeper.recoverable.waittime=600000
 
+# hbase-env.sh (Values should not be quoted here, they will be quoted with 
double quotes in hbase-env.sh)
+# enable assertions, use CMS in incremental mode, disable ipv6
+hbase-env.HBASE_OPTS=-ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode 
-Djava.net.preferIPv4Stack=true
+# keep PID files in a non-temporary directory
+hbase-env.HBASE_PID_DIR=/var/run/hbase
+# set SSH options within the cluster
+hbase-env.HBASE_SSH_OPTS=-o StrictHostKeyChecking=no
+# Log dir. Note: This will be a symlink. The actual location is determined in 
the install function.
+hbase-env.HBASE_LOG_DIR=/var/log/hbase/logs
+# master options
+hbase-env.HBASE_MASTER_OPTS=-Xms1000m -Xmx1000m -Xmn256m -verbose:gc 
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-master-gc.log
+# regionserver options
+hbase-env.HBASE_REGIONSERVER_OPTS=-Xms2000m -Xmx2000m -Xmn256m 
-XX:CMSInitiatingOccupancyFraction=88 -XX:+AggressiveOpts -verbose:gc 
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
-Xloggc:/data/hbase/logs/hbase-regionserver-gc.log
+


Reply via email to