Hadoop is a distributed computing platform.
Hadoop primarily consists of a distributed filesystem (DFS, in org.apache.hadoop.dfs)
and an implementation of a MapReduce distributed data processor (in org.apache.hadoop.mapred
).
Requirements
- Java 1.5.x, preferably from Sun Set
JAVA_HOME to the root of your Java installation.
- ssh must be installed and sshd must be running to use Hadoop's
scripts to manage remote Hadoop daemons. On Ubuntu, this may done
with
sudo apt-get install ssh
- rsync must be installed to use Hadoop's scripts to manage remote
Hadoop installations. On Ubuntu, this may done with
sudo
apt-get install rsync.
- On Win32, cygwin, for shell
support. To use Subversion on Win32, select the subversion package
when you install, in the "Devel" category. Distributed operation has
not been well tested on Win32, so this should primarily be considered
a development platform at this point, not a production platform.
Getting Started
First, you need to get a copy of the Hadoop code.
You can download a nightly build from http://cvs.apache.org/dist/lucene/hadoop/nightly/.
Unpack the release and connect to its top-level directory.
Or, check out the code from subversion
and build it with Ant.
Edit the file conf/hadoop-env.sh to define at least
JAVA_HOME.
Try the following command:
bin/hadoop
This will display the documentation for the Hadoop command script.
Standalone operation
By default, Hadoop is configured to run things in a non-distributed
mode, as a single Java process. This is useful for debugging, and can
be demonstrated as follows:
mkdir input
cp conf/*.xml input
bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'
cat output/*
This will display counts for each match of the
regular expression.
Note that input is specified as a directory containing input
files and that output is also specified as a directory where parts are
written.
Distributed operation
To configure Hadoop for distributed operation you must specify the
following:
- The {@link org.apache.hadoop.dfs.NameNode} (Distributed Filesystem
master) host and port. This is specified with the configuration
property fs.default.name.
- The {@link org.apache.hadoop.mapred.JobTracker} (MapReduce master)
host and port. This is specified with the configuration property
mapred.job.tracker.
- A slaves file that lists the names of all the hosts in
the cluster. The default slaves file is conf/slaves.
Pseudo-distributed configuration
You can in fact run everything on a single host. To run things this
way, put the following in conf/hadoop-site.xml:
fs.default.name
localhost:9000
mapred.job.tracker
localhost:9001
dfs.replication
1
(We also set the DFS replication level to 1 in order to
reduce warnings when running on a single node.)
Now check that the command
ssh localhost
does not
require a password. If it does, execute the following commands:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Bootstrapping
A new distributed filesystem must be formatted with the following
command, run on the master node:
bin/hadoop namenode -format
The Hadoop daemons are started with the following command:
bin/start-all.sh
Daemon log output is written to the logs/ directory.
Input files are copied into the distributed filesystem as follows:
bin/hadoop dfs -put input input
Distributed execution
Things are run as before, but output must be copied locally to
examine it:
bin/hadoop org.apache.hadoop.mapred.demo.Grep input output 'dfs[a-z.]+'
bin/hadoop dfs -get output output
cat output/*
When you're done, stop the daemons with:
bin/stop-all.sh
Fully-distributed operation
Distributed operation is just like the pseudo-distributed operation
described above, except:
- Specify hostname or IP address of the master server in the values
for fs.default.name
and mapred.job.tracker
in conf/hadoop-site.xml. These are specified as
host:port pairs.
- Specify directories for dfs.name.dir and
dfs.data.dir in
conf/hadoop-site.xml. These are used to hold distributed
filesystem data on the master node and slave nodes respectively. Note
that dfs.data.dir may contain a space- or comma-separated
list of directory names, so that data may be stored on multiple
devices.
- Specify mapred.local.dir
in conf/hadoop-site.xml. This determines where temporary
MapReduce data is written. It also may be a list of directories.
- Specify mapred.map.tasks
and mapred.reduce.tasks
in conf/mapred-default.xml. As a rule of thumb, use 10x the
number of slave processors for mapred.map.tasks, and 2x the
number of slave processors for mapred.reduce.tasks.
- List all slave hostnames or IP addresses in your
conf/slaves file, one per line.