Building Hadoop and HBase for HBase Maven application development

1 Introduction

HBase 0.90.3 needs Hadoop common 0.20-append branch in order to not lose data. More information about this can be found "Getting Started" section of HBase guide. However, there is no official release of Hadoop common 0.20-append binary. In order to have consistent and right bits on your cluster and your development platform, you need to compile your own binary version of Hadoop common from the 0.20-append branch source and your own version of HBase 0.90.3 using that Hadoop common binary.

This article provides an overview of building Hadoop and HBase for developing HBase applications that are managed using Maven.

2 Interpreting Maven terminology

A brief description about a few ambiguous terms is provided in this section to avoid potential confusion.

2.1 Maven repository vs repository manager

Maven repository refers to ~/.m2/repository, whereas Maven repository manager refers to an artifact repository manager like Apache Archiva or Artifactory.

2.2 Installing vs deploying artifacts

Installing an artifact is installing it in the Maven repository, whereas deploying an artifact means publishing the artifact in a Maven repository manager. For more information, please refer to Maven reference.

2.3 Installing artifacts vs binaries

Installing artifacts refers to installing them in Maven repository, whereas installing binaries refers to installing the entire binary distribution on the cluster.

3 Prerequisites

You need the following components for this process.

If you are using a Maven repository manager, then make sure that you configure the authentication settings for the repository manager in ~/.m2/settings file.

<settings>
  ...
  <servers>
    <server>
      <id>yourrepo.internal</id>
      <username>USER</username>
      <password>PASSWORD</password>
    </server>
  </servers>
  ...
</settings>

yourrepo.internal is the ID that you will be referring to later from Ant and Maven build configurations.

USER and PASSWORD are the username and password of an account with deployment role in your Maven repository manager.

4 Building Hadoop common

4.1 Checkout Hadoop common

Checkout Hadoop common from 0.20-append branch.

$ svn co http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-append/ hadoop-common-0.20-append

4.2 Create build.properties

Hadoop uses Apache Ant as a build tool. In order to build hadoop-common, you need to create a hadoop-common-0.20-append/build.properties file that looks something like this.

resolvers=internal
version=0.20-append-r1057313-yourversion
project.version=${version}
hadoop.version=${version}
hadoop-core.version=${version}
hadoop-hdfs.version=${version}
hadoop-mapred.version=${version}

Note that at the time of creation of this article, the latest revision that was available in 0.20-append branch was r1057313.

Also, try to assign a meaningful suffix in place of yourversion so that you can distinguish between the official artifacts and the artifacts that are deployed by you.

4.3 OPTIONAL: Configure your repository manager

Please follow this step only if you are running a Maven repository manager for team collaboration and you want to deploy the Hadoop common artifacts to that repository manager.

Edit hadoop-common-0.20.append/build.xml and add two new targets.

<target name="mvn-deploy-internal" depends="mvn-taskdef, bin-package, set-version, simpledeploy-internal"
   description="To deploy hadoop core and test jar's to apache maven repository"/>

<target name="simpledeploy-internal" unless="staging">
   <artifact:pom file="${hadoop-core.pom}" id="hadoop.core"/>
   <artifact:pom file="${hadoop-test.pom}" id="hadoop.test"/>
   <artifact:pom file="${hadoop-examples.pom}" id="hadoop.examples"/>
   <artifact:pom file="${hadoop-tools.pom}" id="hadoop.tools"/>
   <artifact:pom file="${hadoop-streaming.pom}" id="hadoop.streaming"/>

   <artifact:install-provider artifactId="wagon-http" version="${wagon-http.version}"/>
   <artifact:deploy file="${hadoop-core.jar}">
       <remoteRepository id="yourrepo.internal" url="http://yourreposerver.com:port/path"/>
       <pom refid="hadoop.core"/>
   </artifact:deploy>
   <artifact:deploy file="${hadoop-test.jar}">
       <remoteRepository id="yourrepo.internal" url="http://yourreposerver.com:port/path"/>
       <pom refid="hadoop.test"/>
   </artifact:deploy> 
   <artifact:deploy file="${hadoop-examples.jar}">
       <remoteRepository id="yourrepo.internal" url="http://yourreposerver.com:port/path"/>
       <pom refid="hadoop.examples"/>
   </artifact:deploy>
   <artifact:deploy file="${hadoop-tools.jar}">
       <remoteRepository id="yourrepo.internal" url="http://yourreposerver.com:port/path"/>
       <pom refid="hadoop.tools"/>
   </artifact:deploy>
   <artifact:deploy file="${hadoop-streaming.jar}">
       <remoteRepository id="yourrepo.internal" url="http://yourreposerver.com:port/path"/>
       <pom refid="hadoop.streaming"/>
   </artifact:deploy>
</target>

Note that yourrepo.internal is the same ID that you have configured authentication for in the ~m2/settings.xml file earlier.

4.4 Build and install/deploy Hadoop common artifacts

Now, build and install/deploy Hadoop common artifacts using the Maven ant tasks.

4.4.1 Install artifacts

If you do not have a repository manager, and skipped the previous step, then use the mvn-install target and skip the "Deploy artifacts" section. Otherwise, jump directly to "Deploy artifacts" section.

$ ant mvn-install

This target will generate Hadoop common artifacts and Maven POM files, and install them in your local Maven repository (~/.m2/repository).

4.4.2 Deploy artifacts

If you have an internal repository manager, you should deploy the artifacts on it that you have specified in build.xml of the previous step. To achieve this, run mvn-deploy-internal task.

$ ant mvn-deploy-internal

This target will generate the artifacts and Maven POM files, and publish them to your repository manager that you have specified in build.xml.

4.5 Generate the binary tarball to install on the cluster

You need to generate a binary tarball to install on the cluster. This is achieved by running tar target.

$ ant tar -Djava5.home=<Java 5 SE Home> -Dforrest.home=<Forrest 0.8 Home>

Please note that you need Java SE/EE 5 and Apache Forrest 0.8 for this step. Substituting Java SE/EE 5 or Apache Forrest 0.9 will result in a build failure.

This will generate the hadoop-common-0.20-append/build/hadoop-common-0.20-append-r1057313-yourversion.tar.gz tarball.

4.6 Install Hadoop binaries on the cluster

Copy the tarball that was generated in the previous step to your cluster, and unpack them in desired location.

This ensures that you have a consistent Hadoop installation because you are not mixing and matching artifacts from a Hadoop common official release and artifacts that you built.

5 Building HBase

5.1 Checkout HBase

Checkout HBase from 0.90.3 tag.

$ svn co http://svn.apache.org/repos/asf/hbase/tags/0.90.3 hbase-0.90.3

5.2 Modify HBase and Hadoop versions

Now, edit hbase-0.90.3/pom.xml and modify HBase and Hadoop versions.

...
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<packaging>jar</packaging>
<version>0.90.3-yourversion</version>
...
 <hadoop.version>0.20-append-r1057313-yourversion</hadoop.version>
...

Note that you should be using the same revision number for Hadoop that you have assigned while building Hadoop.

Also, try to assign a meaningful suffix in place of yourversion so that you can distinguish between the official artifacts and the artifacts that are deployed by you.

5.3 OPTIONAL: Specify the URL of your repository manager

If you are running an internal repository manager for team collaboration, it is the time to specify in the hbase-0.90.3/pom.xml. Add the following section to it.

<project>
  ...
  <distributionManagement>
    <repository>
      <id>yourrepo.internal</id>
      <name>Your internal repository</name>
      <url>http://yourreposerver.com:port/path</url>
    </repository>
  </distributionManagement>
  ...
</project>

Note that yourrepo.internal is the same ID that you have configured authentication for in the ~m2/settings.xml file earlier.

5.4 Build and install/deploy HBase artifacts

Now, build and install/deploy HBase artifacts using the Maven goals.

5.4.1 Install artifacts

If you do not have a repository manager, and skipped the previous step, then use the install goal and skip the "Deploy artifacts" section. Otherwise, jump directly to "Deploy artifacts" section.

$ mvn install

This goal will generate HBase artifacts and Maven POM files, and install them in your local Maven repository (~/.m2/repository). Ignore the rest of this section.

5.4.2 Deploy artifacts

If you have a repository manager, you should deploy the artifacts on your internal server that you have specified in pom.xml of the previous step. To achieve this, invoke deploy goal.

$ mvn deploy

This goal will generate the artifacts and Maven POM files, and publish them to your internal repository manager that you have specified in pom.xml.

5.5 Generate the binary tarball to install on the cluster

You need to generate a binary tarball to install on the cluster. This is achieved by invoking assembly:single goal.

$ mvn assembly:single

This will generate the hbase-0.90.3/target/hbase-0.90.3-yourversion.tar.gz tarball.

5.6 Install HBase binaries on the cluster

Copy the tarball that was generated in the last step to your cluster and unpack them in the desired location.

This ensures that you have a consistent HBase installation with the right version of Hadoop artifacts that you have built. There is no need of replacing any artifact by hand because, Maven automatically pulled the right version of the artifact that you have built.

6 OPTIONAL: Using the HBase artifact in your HBase application

Now you can edit the pom.xml of your HBase application to use the version of HBase that you have built (0.90.3-yourversion)

7 Feedback

I tried to provide only as much information in the article as possible without overloading the scope of it. I have also taken basic care to ensure that the above mentioned commands are accurate. However, there might be some typos or copy paste errors. If you find something that doesn't work for you please let me know and I'll fix them.

8 Credits

9 Disclaimer

This article is provided for informational purpose only and I will not be liable for any errors, omissions, or delays in this information or any losses, injuries, or damages arising from its use.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Making Mac applications to make use of memories larger than 4 GB

Today, I upgraded the memory on my Macbook Pro (2010) from 4 GB to 8 GB. One of the main reasons for the memory upgrade was to be able to run Mircosoft Windows 7 virtual machine using Oracle VirtualBox. However, I noticed that VirtualBox was not able to see more than 4 GB of memory even after the upgrade while the system reported that there was 8 GB of installed memory.

A quick research showed that Mac OS X 10.6 (Snow Leopard) uses 32-bit kernel by default. This limits the applications to use only 4 GB of memory. In order for the applications to use larger memories, one need to use the 64-bit kernel (provided that you are on a 64-bit platform). There is an Apple support page that describes how to select the desired kernel.

I changed the defaults to use 64-bit kernel.

$ sudo systemsetup -setkernelbootarchitecture x86_64

This configuration is stored in the file /Library/Preferences/SystemConfiguration/com.apple.Boot.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Kernel Architecture</key>
        <string>x86_64</string>
        <key>Kernel Flags</key>
        <string></string>
</dict>
</plist>

After making this change and rebooting, VirtualBox was able to see the whole memory.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Plotting a weight chart using Emacs Org-Mode and Gnuplot

I discovered about Org-Mode a couple of years ago. Since then, I have started using it for various tasks. One of the recent usage is to track my daily weight. This article describes how to use Org-Mode and Gnuplot to plot your weight measurements.

Here is the list of software that I use in my setup.

For the purpose of this article, it is assumed that you have a similar setup that works for you.

As part of my daily measurement, I track three measurements namely, weight, body fat percentage and body water percentage. This data can be represented in an Org table that has four columns as follows. Please note that the data provided below is hypothetical.

#+PLOT: script:"Weight.plt"
| Date       | Weight |  BF% |  BW% |
|------------+--------+------+------|
| 05/01/2011 |  145.2 | 30.3 | 50.3 |
| 05/02/2011 |  145.1 | 29.4 | 50.7 |
| 05/03/2011 |  144.2 | 30.1 | 50.4 |
| 05/04/2011 |  144.0 | 29.0 | 50.8 |
| 05/05/2011 |  144.1 | 28.7 | 51.0 |
| 05/06/2011 |  144.2 | 29.2 | 50.7 |
| 05/07/2011 |  144.4 | 27.8 | 51.4 |
| 05/08/2011 |  143.7 | 27.6 | 51.5 |
| 05/09/2011 |  143.2 | 28.5 | 51.0 |
| 05/10/2011 |  142.8 | 30.1 | 50.4 |
| 05/11/2011 |  142.2 | 30.1 | 50.4 |
| 05/12/2011 |  142.4 | 29.8 | 50.5 |
| 05/13/2011 |  142.2 | 29.9 | 50.5 |
| 05/14/2011 |  141.2 | 27.4 | 51.6 |
| 05/15/2011 |  141.5 | 27.2 | 51.7 |
|------------+--------+------+------|
| 05/16/2011 |  141.2 | 28.8 | 51.0 |
| 05/17/2011 |  140.8 | 28.9 | 50.9 |
| 05/18/2011 |  140.2 | 29.5 | 50.7 |
| 05/19/2011 |  140.5 | 26.8 | 51.9 |
| 05/20/2011 |  140.4 | 28.1 | 51.3 |
| 05/21/2011 |  139.2 | 26.7 | 51.9 |
| 05/22/2011 |  137.1 | 27.0 | 51.7 |
| 05/23/2011 |  137.5 | 27.0 | 51.7 |
| 05/24/2011 |  137.4 | 28.5 | 51.1 |
| 05/25/2011 |  136.8 | 29.6 | 50.6 |
| 05/26/2011 |  136.3 | 28.8 | 51.0 |
| 05/27/2011 |  136.3 | 28.2 | 51.2 |
| 05/28/2011 |  136.3 | 28.9 | 50.9 |
| 05/29/2011 |  136.2 | 28.0 | 51.3 |
| 05/30/2011 |  135.9 | 28.8 | 50.9 |
| 05/31/2011 |  135.5 | 28.2 | 51.2 |
|------------+--------+------+------|
| 06/01/2011 |  135.1 | 28.2 | 51.2 |
| 06/02/2011 |  135.5 | 28.2 | 51.2 |
| 06/03/2011 |  134.8 | 28.9 | 50.9 |
| 06/04/2011 |  134.4 | 29.6 | 50.6 |
| 06/05/2011 |  134.2 | 27.9 | 51.3 |
| 06/06/2011 |  134.4 | 28.1 | 51.3 |
| 06/07/2011 |  133.2 | 29.2 | 50.8 |
| 06/08/2011 |  133.1 | 28.8 | 51.0 |
| 06/09/2011 |  133.0 | 28.6 | 51.0 |
| 06/10/2011 |  133.2 | 27.8 | 51.4 |
| 06/11/2011 |  132.2 | 27.9 | 51.4 |
| 06/12/2011 |  132.0 | 27.9 | 51.4 |
| 06/13/2011 |  132.1 | 28.9 | 51.0 |
| 06/14/2011 |  131.0 | 29.0 | 50.9 |
| 06/15/2011 |  130.2 | 27.6 | 51.5 |
|------------+--------+------+------|

I use the following Gnuplot script, Weight.plt that plots the weight, body fat percentage, absolute body fat, body water percentage and absolute body water.

# Weight plotter.

set terminal aqua title "Weight plot"
set xdata time
set timefmt '"%m/%d/%Y"'
set xlabel 'Date'

set multiplot

set size 1, 0.33

# Weight.
set origin 0, 0.66
set ylabel 'Weight in lb'
plot '$datafile' using 1:2 title 'Weight' with lines linecolor 2

set size 0.5, 0.33

# Body fat.
# Percentage.
set origin 0, 0.33
set ylabel 'Body fat %'
plot '$datafile' using 1:3 title 'Body fat %' with lines linecolor 1
# Absolute.
set origin 0.5, 0.33
set ylabel 'Body fat in lb'
plot '$datafile' using 1:($3 * $2 / 100) title 'Body fat' with lines linecolor 1

# Body water.
# Percentage.
set origin 0, 0
set ylabel 'Body water %'
plot '$datafile' using 1:4 title 'Body water %' with lines linecolor 3
# Absolute.
set origin 0.5, 0
set ylabel 'Body water in lb'
plot '$datafile' using 1:($4 * $2 / 100) title 'Body water' with lines linecolor 3

unset multiplot

Here is the screenshot of the generated plot. Click the thumbnail to get the actual size.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Permanence

I enjoy reading XKCD. One of the recent comic that I enjoyed the most was published last week, titled “Permanence“, that was about naming servers.

One of the reasons that I enjoyed this the most was due to the fact that I can totally correlate this comic to my behavior in naming things. I have an obsession of naming my laptops, servers, PCs, gadgets and more based on Greek mythological names. I am not sure how I developed this obsession. I think that it was mainly influenced by the games Zeus: Master of Olympus and Age of Mythology, the two games that I played a lot almost 8 years ago.

Here are some of the names of my stuff and the reason why I picked that name.

Item: Macbook Pro (Mac OS X)
Name: aphrodite – Aphrodite (Ἀφροδίτη (Áphroditē)) is the goddess of love and beauty.
Reason: This is my most favorite name. I use it for the personal machine that I spend time on.

Item: Primary development machine (Solaris 11)
Name: athena – Athena or Athene (Ἀθηνᾶ (Athēnâ)) is the goddess of wisdom, warfare, battle strategy, heroic endeavour, handicrafts and reason.
Reason: I use this name for my primary development machine at work and the primary trait that I care is wisdom.

Item: Messaging Server development server (Solaris 10)
Name: angelia – Angelia (Αγγελία) is the spirit of messages, tidings and proclamations.
Reason: It mainly deals with messages.

Item: Microsoft Windows VM
Name: erebos – Erebos (Ἔρεβος (Érebos)) is the god of darkness and shadow.
Reason: No comments.

Item: Apple iPhone
Name: Dionysus – Dionysus (Διόνυσος) is the god of wine, drunken orgies and wild vegetation.
Reason: It mainly represents the idea of socializing and parties.

Item: Apple iPad
Name: Ananke – Ananke (Ἀνάγκη (Anánkē)) is the goddess of inevitability, compulsion and necessity.
Reason: Well, iPad is a compulsion and necessity of the current generation, especially of magnified amplitude for people in the Valley.

Item: Buffalo wireless router
Name: aether – Aether (Αιθήρ) is the primeval god of the upper air.
Reason: For the power of sending/receiving tons of data over the air.

Item: Apple iPod Nano
Name: Terpsichore – Terpsichore (Τερψιχόρη) “delight of dancing” was one of the nine Muses, ruling over dance and the dramatic chorus.
Reason: Associated with fitness.

Item: Apple TV
Name: Hedone – Hedone (Ἡδονή), is the spirit of pleasure, enjoyment and delight.
Reason: Associated with entertainment/enjoyment.

Item: Canon EOS 50D camera
Name: Hyperion – Hyperion (Ὑπερίων (Hyperíōn)) is the titan of light. With Theia, he is the father of Helios (the sun), Selene (the moon) and Eos (the dawn).
Reason: What suits a camera better than the name of the titan of light!

Item: Honda Civic car
Name: Hermes – Hermes (Ἡρμῆς (Hērmē̂s)) is the god of travel, messengers, trade, thievery, cunning wiles, language, writing, diplomacy, athletics, and animal husbandry.
Reason: If the god of travel is with you, you are the master of roads.

Item: Citizen Skyhawk AT watch
Name: Chronos – Chronos (Χρόνος (Chrónos)) is the Keeper of Time. Not to be confused with the Titan Cronus, the father of Zeus.
Reason: What suits a clock that is so meticulous in keeping the accurate time using atomic time better than this name?

Item: Fuji CCR3 road bike
Name: Aura – Aura (Αὔρα (Aúra)) is the titan of the breeze and the fresh, cool air of early morning.
Reason: Mainly reflects the feeling that I get when I ride.

Item: Predator Sneaky Pete cue
Name: Oupis – Oupis (Ουπις), aiming aspect of archery.
Reason: That was the closest Greek mythological name that I was able to find related to pool.

Item: Atomic Smoke skis
Name: Chione – Chione (Χιόνη) is the goddess of snow and daughter of Boreas.
Reason: Isn’t that obvious?

You decide if I am crazy or not.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Making GNU Emacs detect custom error messages – A Maven Example

GNU Emacs‘s compilation mode is capable of detecting error messages from various standard compilers and build tools. However, it is fairy common for one to run into a format of error message that Emacs can’t handle by default.

As you know, Emacs is highly extensible and it provides compilation-error-regexp-alist for accomplishing this. I have done this a couple of times earlier and I had to do it one more time lately for adding regular expression for Maven error messages. Construction of these regular expressions is not fun for everyone. However, regexp-builder makes it easier to construct the regular expression interactively.

Because the documentation around compilation-error-regexp-alist isn’t very intuitive for most, I have decided to make this screencast that describes how to approach this from scratch. Sorry about the typos! For best quality, watch it in HD.

Read more »

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

GNU Emacs and MIT Scheme on Mac OS X

Today, I planned to go back to the basics by taking 6.001 Structure and Interpretation of Computer Programs offered by MIT OpenCourseWare. I’ll save the reason behind it for another post.

For running the programs that are used in the class, I decided to use MIT/GNU Scheme. I am running GNU Emacs 23 on my Mac OS X. After some research, I figured out the best way of doing this is through xscheme.

First, download the MIT/GNU Scheme binary for Mac OS X and copy it to your Applications directory. Then configure Emacs to use the downloaded binary by adding the following lines to your .emacs.

(setq scheme-program-name
      "/Applications/mit-scheme.app/Contents/Resources/mit-scheme")
(require 'xscheme)

Now write your Scheme program.

; Compute the square root of a given number using successive
; approximation.
 
(define (sqrt value)
  (define (is-good-enough? guess value)
    (< (abs (- (* guess guess) value)) 0.0000001))
 
  (define (try guess value)
    (if (is-good-enough? guess value)
	guess
	(try (/ (+ guess (/ value guess)) 2) value)))
 
  (try 1 value))
 
(sqrt 4.0)

Invoke the Scheme process by 'M-x run-scheme'. Send the Scheme buffer to the Scheme process by 'M-o' and now you are able to run Scheme programs from Emacs.

Below is the screenshot of Scheme running under my Emacs session.

Emacs and Scheme

MIT Scheme running under GNU Emacs

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Apache Software Foundation

Recently, I started playing with a lot of Open Source products from Apache Software Foundation. It all started with Hadoop, HBase and Cassandra. Day after day, I am getting my hands dirty on more Apache Foundation’s products like Ant, Maven, Archiva and Thrift.

When trying to build HBase from source, I noticed that the project was using Subversion for version control. I found it quite odd to see a modern project like HBase not using a distributed version control tool like Mercurial or Git. Soon, I realized that all Apache projects’ source code were maintained in Subversion. Then, I made a comment to my co-worker that, “Maybe Apache Foundation took over Subversion too!”, soon to realize that it was true. We learned that Subversion became an Apache Incubator project in 2009 and became an Apache top-level project in 2010.

I am really amazed by the number of projects that are now part of the Apache Software Foundation. Go Apache!

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Halford – Foothill – Moody – Page Mill – Alpine 32 mile loop

I went on a solo bicycle ride this morning. I found everything except the climb on Moody that connects to Page Mill easy. I had to get down a couple of times during the final stretch of Moody climb. I think that I am doing something wrong. Need to work on my climbs.

Here is the map of the ride.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Halford – Sunnyvale Saratoga – Fruitvale 20 mile loop

Just finished solo ride of Halford Avenue – Sunnyvale Saratoga Road – Fruitvale Rd loop. It is a steady easy climb to 600 feet and back.

Here is the map.

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx

Halford/Foothill/Arastradero 30 mile loop

Today, I went for a longer bicycle ride with one of my friends from college, Ravi Shankar. I have picked the following loop based on Ed Rak’s advice. We took 2 hours and 15 minutes to do this one.

There were a lot of bicyclists on Foothill Expressway! Apart from some climbing at Arasterado, the ride was very smooth. Alpine is a downhill rideI really enjoyed this ride.

Last night, I created a rough map by hand. After returning from the ride, I spent some time on MapMyRide.com and created a detailed map for this loop.

Here is the map of the loop.

To look at the course fly-by video, continue reading the post.

Read more »

  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • Yahoo! Bookmarks
  • Posterous
  • Sphinn
  • Mixx