blob: 39ef45a1fa836e27f2e5be01b6217272d65e4e99 [file] [log] [blame]
Title: Apache Accumulo
Notice: Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
.
http://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
******************************************************************************
0. Introduction
Apache Accumulo is a sorted, distributed key/value store based on Google's
BigTable design. It is built on top of Apache Hadoop, Zookeeper, and Thrift. It
features a few novel improvements on the BigTable design in the form of
cell-level access labels and a server-side programming mechanism that can modify
key/value pairs at various points in the data management process.
******************************************************************************
1. Building
In the normal tarball release of accumulo, everything is built and
ready to go on x86 GNU/Linux: there is no build step.
However, if you only have source code, or you wish to make changes, you need to
have maven configured to get Accumulo prerequisites from repositories. See
the pom.xml file for the necessary components.
You can build an Accumulo binary distribution, which is created in the
assemble/target directory, using the following command. Note that maven 3
is required starting with Accumulo v1.5.0. By default, Accumulo compiles
against Hadoop 2.2.0, but these artifacts should be compatible with Apache
Hadoop 1.2.x or Apache Hadoop 2.2.x releases.
mvn package -P assemble
By default, Accumulo compiles against Apache Hadoop 2.2.0. To compile against
a different Hadoop 2-compatible version, specify the profile and version,
e.g. "-Dhadoop.version=0.23.5".
To compile against Apache Hadoop 1.2.1, or a different version that is compatible
with Hadoop 1, specify hadoop.profile and hadoop.version on the command line,
e.g. "-Dhadoop.profile=1 -Dhadoop.version=0.20.205.0" or
"-Dhadoop.profile=1 -Dhadoop.version=1.1.0".
If you are running on another Unix-like operating system (OSX, etc) then
you may wish to build the native libraries. They are not strictly necessary
but having them available suppresses a runtime warning and enables Accumulo
to run faster. You can execute the following script to automatically unpack
and install the native library. Be sure to have a JDK and a C++ compiler
installed with the JAVA_HOME environment variable set.
$ ./bin/build_native_library.sh
If your system's default compiler options are insufficient, you can add
additional compiler options to the command line, such as options for the
architecture. These will be passed to the Makefile in the environment variable
USERFLAGS:
$ ./bin/build_native_library.sh -m32
Alternatively, you can manually unpack the accumulo-native tarball in the
$ACCUMULO_HOME/lib directory. Change to the accumulo-native directory in
the current directory and issue `make`. Then, copy the resulting 'libaccumulo'
library into the $ACCUMULO_HOME/lib/native/map.
$ mkdir -p $ACCUMULO_HOME/lib/native/map
$ cp libaccumulo.* $ACCUMULO_HOME/lib/native/map
Building Documentation
Use the following command to build the User Manual (docs/target/accumulo_user_manual.pdf)
and the configuration HTML page (docs/target/config.html)
mvn package -P docs -DskipTests
******************************************************************************
2. Deployment
Copy the accumulo tar file produced by mvn package from the assemble/target/
directory to the desired destination, then untar it (e.g.
tar xzf accumulo-1.6.0-bin.tar.gz).
Another option is to package Accumulo directly to a working directory. For example,
mvn package -DskipTests -DDEV_ACCUMULO_HOME=/var/tmp
The above command would create a directory with a name similar to
/var/tmp/accumulo-1.6.0-dev/accumulo-1.6.0/, containing all the contents
that are normally contained in accumulo-1.6.0-bin.tar.gz, but already unpacked.
If the DEV_ACCUMULO_HOME parameter is not specified, this directory would
normally be created in assemble/target, but that is subject to deletion by
the 'mvn clean' command. Specifying an external directory would not be subject
to 'mvn clean'. When executed more than once, newer files overwrite older files,
and files a user adds (such as configuration files in conf/) will be left alone.
If HDFS and Zookeeper are running, you can run Accumulo directly from this
working directory. See the 'Running Apache Accumulo' section later in this document.
You can avoid specifying the working directory each time you compile by adding
a profile to maven's settings.xml file. Below is an example of $HOME/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>inject-accumulo-home</id>
<properties>
<DEV_ACCUMULO_HOME>/var/tmp</DEV_ACCUMULO_HOME>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>inject-accumulo-home</activeProfile>
</activeProfiles>
</settings>
******************************************************************************
3. Upgrading
3.1. From 1.5 to 1.6
This happens automatically the first time Accumulo 1.6 is started.
If your instance previously upgraded from 1.4 to 1.5, you must verify that your
1.5 instance has no outstanding local write ahead logs. You can do this by ensuring
either:
- All of your tables are online and the Monitor shows all tablets hosted
- The directory for write ahead logs (logger.dir.walog) from 1.4 has no files remaining
on any tablet server / logger hosts
To upgrade from 1.5 to 1.6 you must:
* Verify that there are no outstanding FATE operations
- Under 1.5 you can list what's in FATE by running
$ACCUMULO_HOME/bin/accumulo org.apache.accumulo.server.fate.Admin print
- Note that operations in any state will prevent an upgrade. It is safe
to delete operations with status SUCCESSFUL. For others, you should restart
your 1.5 cluster and allow them to finish.
* Stop the 1.5 instance.
* Configure 1.6 to use the hdfs directory and zookeepers that 1.5 was using.
* Copy other 1.5 configuration options as needed.
* Start Accumulo 1.6.
The upgrade process must make changes to Accumulo's internal state in both ZooKeeper and
the table metadata. This process may take some time if Tablet Servers have to go through
recovery. During this time, the Monitor will claim that the Master is down and some
services may send the Monitor log messages about failure to communicate with each other.
These messages are safe to ignore. If you need detail on the upgrade's progress you should
view the local logs on the Tablet Servers and active Master.
3.2. From 1.4 to 1.6
To upgrade from 1.4 to 1.6 you must perform a manual initial step.
Prior to upgrading you must:
* Verify that there are no outstanding FATE operations
- Under 1.4 you can list what's in FATE by running
$ACCUMULO_HOME/bin/accumulo org.apache.accumulo.server.fate.Admin print
- Note that operations in any state will prevent an upgrade. It is safe
to delete operations with status SUCCESSFUL. For others, you should restart
your 1.4 cluster and allow them to finish.
* Stop the 1.4 instance.
* Configure 1.6 to use the hdfs directory, walog directories, and zookeepers
that 1.4 was using.
* Copy other 1.4 configuration options as needed.
Prior to starting the 1.6 instance you will need to run the LocalWALRecovery tool
on each node that previously ran an instance of the Logger role.
$ACCUMULO_HOME/bin/accumulo org.apache.accumulo.tserver.log.LocalWALRecovery
The recovery tool will rewrite the 1.4 write ahead logs into a format that 1.6 can read.
After this step has completed on all nodes, start the 1.6 cluster to continue the upgrade.
The upgrade process must make changes to Accumulo's internal state in both ZooKeeper and
the table metadata. This process may take some time if Tablet Servers have to go through
recovery. During this time, the Monitor will claim that the Master is down and some
services may send the Monitor log messages about failure to communicate with each other.
While the upgrade is in progress, the Garbage Collector may complain about invalid paths.
The Master may also complain about failure to create the trace table because it already
exists. These messages are safe to ignore. If other error messages occur, you should seek
out support before continuing to use Accumulo. If you need detail on the upgrade's progress
you should view the local logs on the Tablet Servers and active Master.
Note that the LocalWALRecovery tool does not delete the local files. Once you confirm that
1.6 is successfully running, you should delete these files on the local filesystem.
******************************************************************************
4. Configuring
Apache Accumulo has two prerequisites, hadoop and zookeeper. Zookeeper must be
at least version 3.3.0. Both of these must be installed and configured. Some
versions of Zookeeper may only allow 10 connections from one computer by default.
On a single-host install, this number is a little too low. Add the following to
the $ZOOKEEPER_HOME/conf/zoo.cfg file:
maxClientCnxns=100
Ensure you (or the some special hadoop user account) have accounts on all of
the machines in the cluster and that hadoop and accumulo install files can be
found in the same location on every machine in the cluster. You will need to
have password-less ssh set up as described in the hadoop documentation.
You will need to have hadoop installed and configured on your system. Accumulo
1.6.0 has been tested with hadoop version 1.0.4. To avoid data loss,
you must enable HDFS durable sync. How you enable this depends on your version
of Hadoop. Please consult the table below for information regarding your version.
If you need to set the coniguration, please be sure to restart HDFS. See
ACCUMULO-623 and ACCUMULO-1637 for more information.
The following releases of Apache Hadoop require special configuration to ensure
that data is not inadvertently lost; however, in all releases of Apache Hadoop,
`dfs.durable.sync` and `dfs.support.append` should *not* be configured as `false`.
VERSION NAME=VALUE
0.20.205.0 - dfs.support.append=true
1.0.x - dfs.support.append=true
Additionally, it is strongly recommended that you enable 'dfs.datanode.synconclose'
(only available in Apache Hadoop >=1.1.1 or >=0.23) in your hdfs-site.xml configuration
file to ensure that, in the face of unexpected power loss to a datanode, files are
wholly synced to disk.
Accumulo's own configuration files can be bootstrapped with the
$ACCUMULO_HOME/bin/bootstrap_config.sh script. This script will allow you to
select options which correspond closely to your particular environment. The
configuration files produced by this script are examples. You should always
inspect any configuration files you use to ensure they are appropriate for your
environment, and to tailor them to your needs, as they are not guaranteed to be
suitable for all users and all environments.
Some example accumulo configuration files are placed in directories based on the
memory footprint for the accumulo processes. These are pre-generated from
particular selections from the bootstrap_config.sh script for your convenience.
If you are using native libraries for you tablet server in-memory map, then you
can use the files in "native-standalone". If you get warnings about not being
able to load the native libraries, you can use the configuration files in
"standalone".
For testing on a single computer, use a fairly small configuration:
$ cp conf/examples/512MB/native-standalone/* conf
Please note that the footprints are for only the Accumulo system processes, so
ample space should be left for other processes like hadoop, zookeeper, and the
accumulo client code. These directories must be at the same location on every
node in the cluster.
If you are configuring a larger cluster you will need to create the configuration
files yourself and propogate the changes to the $ACCUMULO_CONF_DIR directories:
Create a "slaves" file in $ACCUMULO_CONF_DIR/. This is a list of machines
where tablet servers and loggers will run.
Create a "masters" file in $ACCUMULO_CONF_DIR/. This is a list of
machines where the master server will run.
Create conf/accumulo-env.sh following the template of
example/3GB/native-standalone/accumulo-env.sh.
However you create your configuration files, you will need to set
JAVA_HOME, HADOOP_HOME, and ZOOKEEPER_HOME in conf/accumulo-env.sh
Note that zookeeper client jar files must be installed on every machine, but
the server should not be run on every machine.
Create the $ACCUMULO_LOG_DIR on every machine in the slaves file.
* Note that you will be specifying the Java heap space in accumulo-env.sh.
You should make sure that the total heap space used for the accumulo tserver,
logger and the hadoop datanode and tasktracker is less than the available
memory on each slave node in the cluster. On large clusters, it is recommended
that the accumulo master, hadoop namenode, secondary namenode, and hadoop
jobtracker all be run on separate machines to allow them to use more heap
space. If you are running these on the same machine on a small cluster, make
sure their heap space settings fit within the available memory. The zookeeper
instances are also time sensitive and should be on machines that will not be
heavily loaded, or over-subscribed for memory.
Edit conf/accumulo-site.xml. You must set the zookeeper servers in this
file (instance.zookeeper.host). Look at the "Configuration Management" section
of the user manual to see what additional variables you can modify and what
the defaults are.
It is advisable to change the instance secret (instance.secret) to some new
value. Also ensure that the accumulo-site.xml file is not readable by other
users on the machine.
Synchronize your accumulo conf directory across the cluster. As a precaution
against mis-configured systems, servers using different configuration files
will not communicate with the rest of the cluster.
Accumulo requires the hadoop "commons-io" java package. This is normally
distributed with hadoop. However, it was not distributed with hadoop-0.20.
If your hadoop distribution does not provide this package, you will need
to obtain it and put the commons-io jar file in $ACCUMULO_HOME/lib. See the
pom.xml file for version information.
******************************************************************************
5. Running Apache Accumulo
Make sure hadoop is configured on all of the machines in the cluster, including
access to a shared hdfs instance. Make sure hdfs is running.
Make sure zookeeper is configured and running on at least one machine in the
cluster.
Run "bin/accumulo init" to create the hdfs directory structure
(hdfs:///accumulo/*) and initial zookeeper settings. This will also allow you
to also configure the initial root password. Only do this once.
Start accumulo using the bin/start-all.sh script.
Use the "bin/accumulo shell -u <username>" command to run an accumulo shell
interpreter. Within this interpreter, run "createtable <tablename>" to create
a table, and run "table <tablename>" followed by "scan" to scan a table.
In the example below a table is created, data is inserted, and the table is
scanned.
$ ./bin/accumulo shell -u root
Enter current password for 'root'@'accumulo': ******
Shell - Apache Accumulo Interactive Shell
-
- version: 1.5.0
- instance name: accumulo
- instance id: f5947fe6-081e-41a8-9877-43730c4dfc6f
-
- type 'help' for a list of available commands
-
root@ac> createtable foo
root@ac foo> insert row1 colf1 colq1 val1
root@ac foo> insert row1 colf1 colq2 val2
root@ac foo> scan
row1 colf1:colq1 [] val1
row1 colf1:colq2 [] val2
The example below start the shell, switches to table foo, and scans for a
certain column.
$ ./bin/accumulo shell -u root
Enter current password for 'root'@'accumulo': ******
Shell - Apache Accumulo Interactive Shell
-
- version: 1.5.0
- instance name: accumulo
- instance id: f5947fe6-081e-41a8-9877-43730c4dfc6f
-
- type 'help' for a list of available commands
-
root@ac> table foo
root@ac foo> scan -c colf1:colq2
row1 colf1:colq2 [] val2
If you are running on top of hdfs with kerberos enabled, then you need to do
some extra work. First, create an Accumulo principal
kadmin.local -q "addprinc -randkey accumulo/<host.domain.name>"
where <host.domain.name> is replaced by a fully qualified domain name. Export
the principals to a keytab file. It is safer to create a unique keytab file for each
server, but you can also glob them if you wish.
kadmin.local -q "xst -k accumulo.keytab -glob accumulo*"
Place this file in $ACCUMULO_CONF_DIR for every host. It should be owned by
the accumulo user and chmodded to 400. Add the following to the accumulo-env.sh
kinit -kt $ACCUMULO_HOME/conf/accumulo.keytab accumulo/`hostname -f`
In the accumulo-site.xml file on each node, add settings for general.kerberos.keytab
and general.kerberos.principal, where the keytab setting is the absolute path
to the keytab file ($ACCUMULO_HOME is valid to use) and principal is set to
accumulo/_HOST@<REALM>, where REALM is set to your kerberos realm. You may use
_HOST in lieu of your individual host names.
<property>
<name>general.kerberos.keytab</name>
<value>$ACCUMULO_CONF_DIR/accumulo.keytab</value>
</property>
<property>
<name>general.kerberos.principal</name>
<value>accumulo/_HOST@MYREALM</value>
</property>
You can then start up Accumulo as you would with the accumulo user, and it will
automatically handle the kerberos keys needed to access hdfs.
Please Note: You may have issues initializing Accumulo while running kerberos HDFS.
You can resolve this by temporarily granting the accumulo user write access to the
hdfs root directory, running init, and then revoking write permission in the root
directory (be sure to maintain access to the /accumulo directory).
******************************************************************************
6. Monitoring Apache Accumulo
You can point your browser to the master host, on port 50095 to see the status
of accumulo across the cluster. You can even do this with the text-based
browser "links":
$ links http://localhost:50095
From this GUI, you can ensure that tablets are assigned, tables are online,
tablet servers are up. You can monitor query and ingest rates across the
cluster.
******************************************************************************
7. Stopping Apache Accumulo
Do not kill the tabletservers or run bin/tdown.sh unless absolutely necessary.
Recovery from a catastrophic loss of servers can take a long time. To shutdown
cleanly, run "bin/stop-all.sh" and the master will orchestrate the shutdown of
all the tablet servers. Shutdown waits for all writes to finish, so it may
take some time for particular configurations.
******************************************************************************
8. Logging
DEBUG and above are logged to the logs/ dir. To modify this behavior change
the scripts in conf/. To change the logging dir, set ACCUMULO_LOG_DIR in
conf/accumulo-env.sh. Stdout and stderr of each accumulo process is
redirected to the log dir.
******************************************************************************
9. API
The public Accumulo API is composed of :
* All public classes and interfaces in the org.apache.accumulo.core.client
package, as as well as all of its subpackages excluding those named "impl".
* Key, Mutation, Value, Range, Condition, and ConditionalMutation in
org.apache.accumulo.core.data.
* All public classes and interfaces in the org.apache.accumulo.minicluster
package, as well as all of its subpackages excluding those named "impl".
* Anything with public or protected acccess within any Class or Interface that
is in the public API. This includes, but is not limited to: methods, members
classes, interfaces, and enums.
The Accumulo project maintains binary compatibility across this API within a major
release, as defined in the Java Language Specification 3rd ed. API changes should
only be made on major releases, with continued support of deprecated API elements
for at least one major revision.
To get started using accumulo review the example and the javadoc for the
packages and classes mentioned above.
******************************************************************************
10. Performance Tuning
Apache Accumulo has exposed several configuration properties that can be
changed. These properties and configuration management are described in detail
in the user manual. While the default value is usually optimal, there are
cases where a change can increase query and ingest performance.
Before changing a property from its default in a production system, you should
develop a good understanding of the property and consider creating a test to
prove the increased performance.
******************************************************************************
11. Export Control
This distribution includes cryptographic software. The country in which you
currently reside may have restrictions on the import, possession, use, and/or
re-export to another country, of encryption software. BEFORE using any
encryption software, please check your country's laws, regulations and
policies concerning the import, possession, or use, and re-export of encryption
software, to see if this is permitted. See <http://www.wassenaar.org/> for more
information.
The U.S. Government Department of Commerce, Bureau of Industry and Security
(BIS), has classified this software as Export Commodity Control Number (ECCN)
5D002.C.1, which includes information security software using or performing
cryptographic functions with asymmetric algorithms. The form and manner of this
Apache Software Foundation distribution makes it eligible for export under the
License Exception ENC Technology Software Unrestricted (TSU) exception (see the
BIS Export Administration Regulations, Section 740.13) for both object code and
source code.
The following provides more details on the included cryptographic software: ...
Apache Accumulo uses the built-in java cryptography libraries in it's RFile
encryption implementation. See
http://www.oracle.com/us/products/export/export-regulations-345813.html
for more details for on Java's cryptography features. Apache Accumulo also uses
the bouncycastle library for some crypographic technology as well. See
http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions for
more details on bouncycastle's cryptography features.
******************************************************************************