blob: 509b673fba80718dcb6d78ffa45213f8fee40c4c [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="Asciidoctor 0.1.4">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Apache Accumulo User Manual Version 1.6</title>
<style>
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
audio, canvas, video { display: inline-block; }
audio:not([controls]) { display: none; height: 0; }
[hidden] { display: none; }
html { background: #fff; color: #000; font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; }
body { margin: 0; }
a:focus { outline: thin dotted; }
a:active, a:hover { outline: 0; }
h1 { font-size: 2em; margin: 0.67em 0; }
abbr[title] { border-bottom: 1px dotted; }
b, strong { font-weight: bold; }
dfn { font-style: italic; }
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
mark { background: #ff0; color: #000; }
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
pre { white-space: pre-wrap; }
q { quotes: "\201C" "\201D" "\2018" "\2019"; }
small { font-size: 80%; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
img { border: 0; }
svg:not(:root) { overflow: hidden; }
figure { margin: 0; }
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
legend { border: 0; padding: 0; }
button, input, select, textarea { font-family: inherit; font-size: 100%; margin: 0; }
button, input { line-height: normal; }
button, select { text-transform: none; }
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; }
button[disabled], html input[disabled] { cursor: default; }
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; }
input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
textarea { overflow: auto; vertical-align: top; }
table { border-collapse: collapse; border-spacing: 0; }
*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
html, body { font-size: 100%; }
body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
a:hover { cursor: pointer; }
a:focus { outline: none; }
img, object, embed { max-width: 100%; height: auto; }
object, embed { height: 100%; }
img { -ms-interpolation-mode: bicubic; }
#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }
.left { float: left !important; }
.right { float: right !important; }
.text-left { text-align: left !important; }
.text-right { text-align: right !important; }
.text-center { text-align: center !important; }
.text-justify { text-align: justify !important; }
.hide { display: none; }
.antialiased, body { -webkit-font-smoothing: antialiased; }
img { display: inline-block; vertical-align: middle; }
textarea { height: auto; min-height: 50px; }
select { width: 100%; }
p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { line-height: 1.4; color: #7a2518; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }
a { color: #005498; text-decoration: underline; line-height: inherit; }
a:hover, a:focus { color: #00467f; }
a img { border: none; }
p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Georgia, "URW Bookman L", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; color: #ba3925; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.2125em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #e99b8f; line-height: 0; }
h1 { font-size: 2.125em; }
h2 { font-size: 1.6875em; }
h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
h4 { font-size: 1.125em; }
h5 { font-size: 1.125em; }
h6 { font-size: 1em; }
hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }
em, i { font-style: italic; line-height: inherit; }
strong, b { font-weight: bold; line-height: inherit; }
small { font-size: 60%; line-height: inherit; }
code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #6d180b; }
ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; }
ul, ol { margin-left: 1.5em; }
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
dl dt { margin-bottom: 0.3125em; font-weight: bold; }
dl dd { margin-bottom: 1.25em; }
abbr, acronym { text-transform: uppercase; font-size: 90%; color: #222222; border-bottom: 1px dotted #dddddd; cursor: help; }
abbr { text-transform: none; }
blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
blockquote cite { display: block; font-size: inherit; color: #555555; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #555555; }
blockquote, blockquote p { line-height: 1.6; color: #6f6f6f; }
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }
.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }
@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
h1 { font-size: 2.75em; }
h2 { font-size: 2.3125em; }
h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
h4 { font-size: 1.4375em; } }
.print-only { display: none !important; }
@media print { * { background: transparent !important; color: #000 !important; box-shadow: none !important; text-shadow: none !important; }
a, a:visited { text-decoration: underline; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
thead { display: table-header-group; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page { margin: 0.5cm; }
p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; widows: 3; }
h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; }
.hide-on-print { display: none !important; }
.print-only { display: block !important; }
.hide-for-print { display: none !important; }
.show-for-print { display: inherit !important; } }
table { background: white; margin-bottom: 1.25em; border: solid 1px #dddddd; }
table thead, table tfoot { background: whitesmoke; font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #222222; text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #222222; }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.6; }
.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }
*:not(pre) > code { font-size: 0.9375em; padding: 1px 3px 0; white-space: nowrap; background-color: #f2f2f2; border: 1px solid #cccccc; -webkit-border-radius: 4px; border-radius: 4px; text-shadow: none; }
pre, pre > code { line-height: 1.4; color: inherit; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; }
kbd.keyseq { color: #555555; }
kbd:not(.keyseq) { display: inline-block; color: #222222; font-size: 0.75em; line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }
kbd kbd:first-child { margin-left: 0; }
kbd kbd:last-child { margin-right: 0; }
.menuseq, .menu { color: #090909; }
p a > code:hover { color: #561309; }
#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
#header { margin-bottom: 2.5em; }
#header > h1 { color: black; font-weight: normal; border-bottom: 1px solid #dddddd; margin-bottom: -28px; padding-bottom: 32px; }
#header span { color: #6f6f6f; }
#header #revnumber { text-transform: capitalize; }
#header br { display: none; }
#header br + span { padding-left: 3px; }
#header br + span:before { content: "\2013 \0020"; }
#header br + span.author { padding-left: 0; }
#header br + span.author:before { content: ", "; }
#toc { border-bottom: 3px double #ebebeb; padding-bottom: 1.25em; }
#toc > ul { margin-left: 0.25em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
#toc ul { list-style-type: none; }
#toctitle { color: #7a2518; }
@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; }
#toc.toc2 { position: fixed; width: 20em; left: 0; top: 0; border-right: 1px solid #ebebeb; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; overflow: auto; }
#toc.toc2 #toctitle { margin-top: 0; }
#toc.toc2 > ul { font-size: .95em; }
#toc.toc2 ul ul { margin-left: 0; padding-left: 1.25em; }
#toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
body.toc2.toc-right { padding-left: 0; padding-right: 20em; }
body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid #ebebeb; left: auto; right: 0; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; -webkit-border-radius: 4px; border-radius: 4px; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }
#content #toc a { text-decoration: none; }
#content #toctitle { font-weight: bold; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 1em; padding-left: 0.125em; }
#footer { max-width: 100%; background-color: #222222; padding: 1.25em; }
#footer-text { color: #dddddd; line-height: 1.44; }
.sect1 { padding-bottom: 1.25em; }
.sect1 + .sect1 { border-top: 3px double #ebebeb; }
#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; text-decoration: none; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; display: block; margin-top: 0.05em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #ba3925; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #a53221; }
.imageblock, .literalblock, .listingblock, .verseblock, .videoblock { margin-bottom: 1.25em; }
.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-align: left; font-weight: bold; }
.tableblock > caption { text-align: left; font-weight: bold; white-space: nowrap; overflow: visible; max-width: 0; }
table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; }
.admonitionblock > table { border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: none; }
.admonitionblock > table td.icon .title { font-weight: bold; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #6f6f6f; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }
.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 4px; border-radius: 4px; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }
.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { color: #333333; }
.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; }
.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; box-shadow: 0 1px 8px #d9d9d9; }
.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; -webkit-border-radius: 4px; border-radius: 4px; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { color: #333333; }
.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; }
.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; }
.sidebarblock > .content > .title { color: #7a2518; margin-top: 0; line-height: 1.6; }
.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }
.literalblock > .content pre, .listingblock > .content pre { background: none; border-width: 1px 0; border-style: dotted; border-color: #bfbfbf; -webkit-border-radius: 4px; border-radius: 4px; padding: 0.75em 0.75em 0.5em 0.75em; word-wrap: break-word; }
.literalblock > .content pre.nowrap, .listingblock > .content pre.nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; }
.literalblock > .content pre > code, .listingblock > .content pre > code { display: block; }
@media only screen { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.8em; } }
@media only screen and (min-width: 768px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.9em; } }
@media only screen and (min-width: 1280px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 1em; } }
.listingblock > .content { position: relative; }
.listingblock:hover code[class*=" language-"]:before { text-transform: uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; right: 0.375em; }
.listingblock:hover code.asciidoc:before { content: "asciidoc"; }
.listingblock:hover code.clojure:before { content: "clojure"; }
.listingblock:hover code.css:before { content: "css"; }
.listingblock:hover code.groovy:before { content: "groovy"; }
.listingblock:hover code.html:before { content: "html"; }
.listingblock:hover code.java:before { content: "java"; }
.listingblock:hover code.javascript:before { content: "javascript"; }
.listingblock:hover code.python:before { content: "python"; }
.listingblock:hover code.ruby:before { content: "ruby"; }
.listingblock:hover code.scss:before { content: "scss"; }
.listingblock:hover code.xml:before { content: "xml"; }
.listingblock:hover code.yaml:before { content: "yaml"; }
.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; }
.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; }
table.pyhltable { border: 0; margin-bottom: 0; }
table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; }
table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }
.highlight.pygments .lineno { display: inline-block; margin-right: .25em; }
table.pyhltable .linenodiv { background-color: transparent !important; padding-right: 0 !important; }
.quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; border: 0; }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; font-size: inherit; color: #555555; }
.quoteblock .attribution br { display: none; }
.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }
table thead th, table tfoot th { font-weight: bold; }
table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; -webkit-border-radius: 4px; border-radius: 4px; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; }
table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; border-right: 0; }
table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; border-bottom: 0; }
table.tableblock td .paragraph:last-child p, table.tableblock td > p:last-child { margin-bottom: 0; }
th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; }
th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; }
th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; }
th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; }
th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: bottom; }
th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: middle; }
p.tableblock.header { color: #222222; font-weight: bold; }
td > div.verse { white-space: pre; }
ol { margin-left: 1.75em; }
ul li ol { margin-left: 1.5em; }
dl dd { margin-left: 1.125em; }
dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; }
ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; }
ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; }
ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }
ul.checklist li > p:first-child > input[type="checkbox"]:first-child { position: relative; top: 1px; }
ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; }
ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; }
ul.inline > li > * { display: block; }
.unstyled dl dt { font-weight: normal; font-style: normal; }
ol.arabic { list-style-type: decimal; }
ol.decimal { list-style-type: decimal-leading-zero; }
ol.loweralpha { list-style-type: lower-alpha; }
ol.upperalpha { list-style-type: upper-alpha; }
ol.lowerroman { list-style-type: lower-roman; }
ol.upperroman { list-style-type: upper-roman; }
ol.lowergreek { list-style-type: lower-greek; }
.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }
td.hdlist1 { padding-right: .8em; font-weight: bold; }
td.hdlist1, td.hdlist2 { vertical-align: top; }
.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
.colist > table tr > td:first-of-type { padding: 0 .8em; line-height: 1; }
.colist > table tr > td:last-of-type { padding: 0.25em 0; }
.qanda > ol > li > p > em:only-child { color: #00467f; }
.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }
.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }
a.image { text-decoration: none; }
span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
span.footnote a, span.footnoteref a { text-decoration: none; }
#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }
#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }
.gist .file-data > table { border: none; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }
div.unbreakable { page-break-inside: avoid; }
.big { font-size: larger; }
.small { font-size: smaller; }
.underline { text-decoration: underline; }
.overline { text-decoration: overline; }
.line-through { text-decoration: line-through; }
.aqua { color: #00bfbf; }
.aqua-background { background-color: #00fafa; }
.black { color: black; }
.black-background { background-color: black; }
.blue { color: #0000bf; }
.blue-background { background-color: #0000fa; }
.fuchsia { color: #bf00bf; }
.fuchsia-background { background-color: #fa00fa; }
.gray { color: #606060; }
.gray-background { background-color: #7d7d7d; }
.green { color: #006000; }
.green-background { background-color: #007d00; }
.lime { color: #00bf00; }
.lime-background { background-color: #00fa00; }
.maroon { color: #600000; }
.maroon-background { background-color: #7d0000; }
.navy { color: #000060; }
.navy-background { background-color: #00007d; }
.olive { color: #606000; }
.olive-background { background-color: #7d7d00; }
.purple { color: #600060; }
.purple-background { background-color: #7d007d; }
.red { color: #bf0000; }
.red-background { background-color: #fa0000; }
.silver { color: #909090; }
.silver-background { background-color: #bcbcbc; }
.teal { color: #006060; }
.teal-background { background-color: #007d7d; }
.white { color: #bfbfbf; }
.white-background { background-color: #fafafa; }
.yellow { color: #bfbf00; }
.yellow-background { background-color: #fafa00; }
span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
.admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #005498; color: #003f72; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }
.conum { display: inline-block; color: white !important; background-color: #222222; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 20px; font-family: Arial, sans-serif; font-style: normal; position: relative; top: -2px; letter-spacing: -1px; }
.conum * { color: white !important; }
.conum + b { display: none; }
.conum:after { content: attr(data-value); }
.conum:not([data-value]):empty { display: none; }
.literalblock > .content > pre, .listingblock > .content > pre { -webkit-border-radius: 0; border-radius: 0; }
</style>
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/default.min.css">
<script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>Apache Accumulo User Manual Version 1.6</h1>
<span id="author" class="author">Apache Accumulo Project</span><br>
<span id="email" class="email"><a href="mailto:dev@accumulo.apache.org">dev@accumulo.apache.org</a></span><br>
<div id="toc" class="toc2">
<div id="toctitle">Apache Accumulo 1.6</div>
<ul class="sectlevel1">
<li><a href="#_introduction">1. Introduction</a></li>
<li><a href="#_accumulo_design">2. Accumulo Design</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_data_model">2.1. Data Model</a></li>
<li><a href="#_architecture">2.2. Architecture</a></li>
<li><a href="#_components">2.3. Components</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_tablet_server">2.3.1. Tablet Server</a></li>
<li><a href="#_garbage_collector">2.3.2. Garbage Collector</a></li>
<li><a href="#_master">2.3.3. Master</a></li>
<li><a href="#_tracer">2.3.4. Tracer</a></li>
<li><a href="#_monitor">2.3.5. Monitor</a></li>
<li><a href="#_client">2.3.6. Client</a></li>
</ul>
</li>
<li><a href="#_data_management">2.4. Data Management</a></li>
<li><a href="#_tablet_service">2.5. Tablet Service</a></li>
<li><a href="#_compactions">2.6. Compactions</a></li>
<li><a href="#_splitting">2.7. Splitting</a></li>
<li><a href="#_fault_tolerance">2.8. Fault-Tolerance</a></li>
</ul>
</li>
<li><a href="#_accumulo_shell">3. Accumulo Shell</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_basic_administration">3.1. Basic Administration</a></li>
<li><a href="#_table_maintenance">3.2. Table Maintenance</a></li>
<li><a href="#_user_administration">3.3. User Administration</a></li>
</ul>
</li>
<li><a href="#_writing_accumulo_clients">4. Writing Accumulo Clients</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_running_client_code">4.1. Running Client Code</a></li>
<li><a href="#_connecting">4.2. Connecting</a></li>
<li><a href="#_writing_data">4.3. Writing Data</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_batchwriter">4.3.1. BatchWriter</a></li>
<li><a href="#_conditionalwriter">4.3.2. ConditionalWriter</a></li>
</ul>
</li>
<li><a href="#_reading_data">4.4. Reading Data</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_scanner">4.4.1. Scanner</a></li>
<li><a href="#_isolated_scanner">4.4.2. Isolated Scanner</a></li>
<li><a href="#_batchscanner">4.4.3. BatchScanner</a></li>
</ul>
</li>
<li><a href="#_proxy">4.5. Proxy</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_prequisites">4.5.1. Prequisites</a></li>
<li><a href="#_configuration">4.5.2. Configuration</a></li>
<li><a href="#_running_the_proxy_server">4.5.3. Running the Proxy Server</a></li>
<li><a href="#_creating_a_proxy_client">4.5.4. Creating a Proxy Client</a></li>
<li><a href="#_using_a_proxy_client">4.5.5. Using a Proxy Client</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_development_clients">5. Development Clients</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_mock_accumulo">5.1. Mock Accumulo</a></li>
<li><a href="#_mini_accumulo_cluster">5.2. Mini Accumulo Cluster</a></li>
</ul>
</li>
<li><a href="#_table_configuration">6. Table Configuration</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_locality_groups">6.1. Locality Groups</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_managing_locality_groups_via_the_shell">6.1.1. Managing Locality Groups via the Shell</a></li>
<li><a href="#_managing_locality_groups_via_the_client_api">6.1.2. Managing Locality Groups via the Client API</a></li>
</ul>
</li>
<li><a href="#_constraints">6.2. Constraints</a></li>
<li><a href="#_bloom_filters">6.3. Bloom Filters</a></li>
<li><a href="#_iterators">6.4. Iterators</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_setting_iterators_via_the_shell">6.4.1. Setting Iterators via the Shell</a></li>
<li><a href="#_setting_iterators_programmatically">6.4.2. Setting Iterators Programmatically</a></li>
<li><a href="#_versioning_iterators_and_timestamps">6.4.3. Versioning Iterators and Timestamps</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_logical_time">Logical Time</a></li>
<li><a href="#_deletes">Deletes</a></li>
</ul>
</li>
<li><a href="#_filters">6.4.4. Filters</a></li>
<li><a href="#_combiners">6.4.5. Combiners</a></li>
</ul>
</li>
<li><a href="#_block_cache">6.5. Block Cache</a></li>
<li><a href="#_compaction">6.6. Compaction</a></li>
<li><a href="#_pre_splitting_tables">6.7. Pre-splitting tables</a></li>
<li><a href="#_merging_tablets">6.8. Merging tablets</a></li>
<li><a href="#_delete_range">6.9. Delete Range</a></li>
<li><a href="#_cloning_tables">6.10. Cloning Tables</a></li>
<li><a href="#_exporting_tables">6.11. Exporting Tables</a></li>
</ul>
</li>
<li><a href="#_table_design">7. Table Design</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_basic_table">7.1. Basic Table</a></li>
<li><a href="#_rowid_design">7.2. RowID Design</a></li>
<li><a href="#_lexicoders">7.3. Lexicoders</a></li>
<li><a href="#_indexing">7.4. Indexing</a></li>
<li><a href="#_entity_attribute_and_graph_tables">7.5. Entity-Attribute and Graph Tables</a></li>
<li><a href="#_document_partitioned_indexing">7.6. Document-Partitioned Indexing</a></li>
</ul>
</li>
<li><a href="#_high_speed_ingest">8. High-Speed Ingest</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_pre_splitting_new_tables">8.1. Pre-Splitting New Tables</a></li>
<li><a href="#_multiple_ingester_clients">8.2. Multiple Ingester Clients</a></li>
<li><a href="#_bulk_ingest">8.3. Bulk Ingest</a></li>
<li><a href="#_logical_time_for_bulk_ingest">8.4. Logical Time for Bulk Ingest</a></li>
<li><a href="#_mapreduce_ingest">8.5. MapReduce Ingest</a></li>
</ul>
</li>
<li><a href="#_analytics">9. Analytics</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_mapreduce">9.1. MapReduce</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_mapper_and_reducer_classes">9.1.1. Mapper and Reducer classes</a></li>
<li><a href="#_accumuloinputformat_options">9.1.2. AccumuloInputFormat options</a></li>
<li><a href="#_accumulomultitableinputformat_options">9.1.3. AccumuloMultiTableInputFormat options</a></li>
<li><a href="#_accumulooutputformat_options">9.1.4. AccumuloOutputFormat options</a></li>
</ul>
</li>
<li><a href="#_combiners_2">9.2. Combiners</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_feature_vectors">9.2.1. Feature Vectors</a></li>
</ul>
</li>
<li><a href="#_statistical_modeling">9.3. Statistical Modeling</a></li>
</ul>
</li>
<li><a href="#_security">10. Security</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_security_label_expressions">10.1. Security Label Expressions</a></li>
<li><a href="#_security_label_expression_syntax">10.2. Security Label Expression Syntax</a></li>
<li><a href="#_authorization">10.3. Authorization</a></li>
<li><a href="#_user_authorizations">10.4. User Authorizations</a></li>
<li><a href="#_pluggable_security">10.5. Pluggable Security</a></li>
<li><a href="#_secure_authorizations_handling">10.6. Secure Authorizations Handling</a></li>
<li><a href="#_query_services_layer">10.7. Query Services Layer</a></li>
</ul>
</li>
<li><a href="#_ssl">11. SSL</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_ssl_server_configuration">11.1. Server Configuration</a></li>
<li><a href="#_ssl_client_configuration">11.2. Client Configuration</a></li>
<li><a href="#_ssl_generate_ssl_material_openssl">11.3. Generating SSL material using OpenSSL</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_ssl_generate_ca">11.3.1. Generate a certificate authority</a></li>
<li><a href="#_ssl_generate_certs">11.3.2. Generate a certificate/keystore per host</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_implementation_details">12. Implementation Details</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_implementation_fate">12.1. Fault-Tolerant Executor (FATE)</a></li>
<ul class="sectlevel3">
<li><a href="#_implementation_fate_overview">12.1.1. Overview</a></li>
<li><a href="#_implementation_fate_administration">12.1.2. Administration</a></li>
<li><a href="#_implementation_fate_list_print">12.1.3. List/Print</a></li>
<li><a href="#_implementation_fate_fail">12.1.3. Fail</a></li>
<li><a href="#_implementation_fate_delete">12.1.3. Delete</a></li>
</ul>
</ul>
</li>
<li><a href="#_administration">13. Administration</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_hardware">13.1. Hardware</a></li>
<li><a href="#_network">13.2. Network</a></li>
<li><a href="#_installation">13.3. Installation</a></li>
<li><a href="#_dependencies">13.4. Dependencies</a></li>
<li><a href="#_configuration_2">12.5. Configuration</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_edit_conf_accumulo_env_sh">13.5.1. Edit conf/accumulo-env.sh</a></li>
<li><a href="#_native_map">13.5.2. Native Map</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_native_map_building">13.5.2.1 Building</a></li>
</ul>
</li>
<li><a href="#_administration_configuration">13.5.3. Configuration</a></li>
<li><a href="#_cluster_specification">13.5.4. Cluster Specification</a></li>
<li><a href="#_accumulo_settings">13.5.5. Accumulo Settings</a></li>
<li><a href="#_deploy_configuration">13.5.6. Deploy Configuration</a></li>
<li><a href="#_sensitive_configuration_values">13.5.7 Sensitive Configuration Values</a></li>
<li><a href="#_using_a_javakeystorecredentialprovider_for_storage">13.5.8. Using a JavaKeyStoreCredentialProvider for storage</a></li>
</ul>
</li>
<li><a href="#_initialization">13.6. Initialization</a></li>
<li><a href="#_running">13.7. Running</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_starting_accumulo">13.7.1. Starting Accumulo</a></li>
<li><a href="#_stopping_accumulo">13.7.2. Stopping Accumulo</a></li>
<li><a href="#_adding_a_node">13.7.3. Adding a Node</a></li>
<li><a href="#_decomissioning_a_node">13.7.4. Decomissioning a Node</a></li>
<li><a href="#_restarting_process_on_a_node">13.7.5. Restarting process on a node</a></li>
<li><a href="#_running_multiple_tabletservers_on_a_single_node">13.7.6. Running multiple TabletServers on a single node</a></li>
</ul>
</li>
<li><a href="#_monitoring">13.8. Monitoring</a></li>
<li><a href="#_tracing">13.9. Tracing</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_tracers">13.9.1. Tracers</a></li>
<li><a href="#_instrumenting_a_client">13.9.2. Instrumenting a Client</a></li>
<li><a href="#_viewing_collected_traces">13.9.3. Viewing Collected Traces</a></li>
<li><a href="#_tracing_from_the_shell">13.9.4. Tracing from the Shell</a></li>
</ul>
</li>
<li><a href="#_logging">13.10. Logging</a></li>
<li><a href="#_recovery">13.11. Recovery</a></li>
<li><a href="#_migrating_from_non_ha_to_ha">13.12 Migrating Accumulo from non-HA Namenode to HA Namenode</a></li>
</ul>
</li>
<li><a href="#_multi_volume_installations">14. Multi-Volume Installations</a></li>
<li><a href="#_troubleshooting">15. Troubleshooting</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_logs">15.1. Logs</a></li>
<li><a href="#_monitor_2">15.2. Monitor</a></li>
<li><a href="#_hdfs">15.3. HDFS</a></li>
<li><a href="#_zookeeper">15.4. Zookeeper</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_keeping_the_tablet_server_lock">15.4.1. Keeping the tablet server lock</a></li>
</ul>
</li>
<li><a href="#_tools">15.5. Tools</a></li>
<li><a href="#metadata">15.6. System Metadata Tables</a></li>
<li><a href="#_simple_system_recovery">15.7. Simple System Recovery</a></li>
<li><a href="#_advanced_system_recovery">15.8. Advanced System Recovery</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_hdfs_failure">15.8.1. HDFS Failure</a></li>
<li><a href="#zookeeper_failure">15.8.2. ZooKeeper Failure</a></li>
</ul>
</li>
<li><a href="#_upgrade_issues">15.9. Upgrade Issues</a></li>
<li><a href="#_file_naming_conventions">15.10. File Naming Conventions</a></li>
</ul>
</li>
<li><a href="#configuration">16. Appendix A: Configuration Management</a></li>
<li>
<ul class="sectlevel2">
<li><a href="#_configuration_overview">16.1. Configuration Overview</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_zookeeper_table_properties">16.1.1. Zookeeper table properties</a></li>
<li><a href="#_zookeeper_system_properties">16.1.2. Zookeeper system properties</a></li>
<li><a href="#_accumulo_site_xml">16.1.3. accumulo-site.xml</a></li>
<li><a href="#_default_values">16.1.4. Default Values</a></li>
</ul>
</li>
<li><a href="#_configuration_in_the_shell">16.2. Configuration in the Shell</a></li>
<li><a href="#_available_properties">16.3. Available Properties</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#RPC_PREFIX">16.3.1. rpc.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_rpc_javax_net_ssl_keystore">rpc.javax.net.ssl.keyStore</a></li>
<li><a href="#_rpc_javax_net_ssl_keystorepassword">rpc.javax.net.ssl.keyStorePassword</a></li>
<li><a href="#_rpc_javax_net_ssl_keystoretype">rpc.javax.net.ssl.keyStoreType</a></li>
<li><a href="#_rpc_javax_net_ssl_truststore">rpc.javax.net.ssl.trustStore</a></li>
<li><a href="#_rpc_javax_net_ssl_truststorepassword">rpc.javax.net.ssl.trustStorePassword</a></li>
<li><a href="#_rpc_javax_net_ssl_truststoretype">rpc.javax.net.ssl.trustStoreType</a></li>
<li><a href="#_rpc_usejsse">rpc.useJsse</a></li>
</ul>
</li>
<li><a href="#INSTANCE_PREFIX">16.3.2. instance.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_instance_dfs_dir">instance.dfs.dir</a></li>
<li><a href="#_instance_dfs_uri">instance.dfs.uri</a></li>
<li><a href="#_instance_rpc_ssl_clientauth">instance.rpc.ssl.clientAuth</a></li>
<li><a href="#_instance_rpc_ssl_enabled">instance.rpc.ssl.enabled</a></li>
<li><a href="#_instance_secret">instance.secret</a></li>
<li><a href="#_instance_security_authenticator">instance.security.authenticator</a></li>
<li><a href="#_instance_security_authorizor">instance.security.authorizor</a></li>
<li><a href="#_instance_security_permissionhandler">instance.security.permissionHandler</a></li>
<li><a href="#_instance_volumes">instance.volumes</a></li>
<li><a href="#_instance_volumes_replacements">instance.volumes.replacements</a></li>
<li><a href="#_instance_zookeeper_host">instance.zookeeper.host</a></li>
<li><a href="#_instance_zookeeper_timeout">instance.zookeeper.timeout</a></li>
</ul>
</li>
<li><a href="#GENERAL_PREFIX">16.3.3. general.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_general_classpaths">general.classpaths</a></li>
<li><a href="#_general_dynamic_classpaths">general.dynamic.classpaths</a></li>
<li><a href="#_general_kerberos_keytab">general.kerberos.keytab</a></li>
<li><a href="#_general_kerberos_principal">general.kerberos.principal</a></li>
<li><a href="#_general_rpc_timeout">general.rpc.timeout</a></li>
<li><a href="#_general_server_message_size_max">general.server.message.size.max</a></li>
<li><a href="#_general_server_simpletimer_threadpool_size">general.server.simpletimer.threadpool.size</a></li>
<li><a href="#_general_vfs_cache_dir">general.vfs.cache.dir</a></li>
<li><a href="#_general_vfs_classpaths">general.vfs.classpaths</a></li>
</ul>
</li>
<li><a href="#MASTER_PREFIX">16.3.4. master.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_master_bulk_retries">master.bulk.retries</a></li>
<li><a href="#_master_bulk_threadpool_size">master.bulk.threadpool.size</a></li>
<li><a href="#_master_bulk_timeout">master.bulk.timeout</a></li>
<li><a href="#_master_fate_threadpool_size">master.fate.threadpool.size</a></li>
<li><a href="#_master_lease_recovery_interval">master.lease.recovery.interval</a></li>
<li><a href="#_master_port_client">master.port.client</a></li>
<li><a href="#_master_recovery_delay">master.recovery.delay</a></li>
<li><a href="#_master_recovery_max_age">master.recovery.max.age</a></li>
<li><a href="#_master_recovery_time_max">master.recovery.time.max</a></li>
<li><a href="#_master_server_threadcheck_time">master.server.threadcheck.time</a></li>
<li><a href="#_master_server_threads_minimum">master.server.threads.minimum</a></li>
<li><a href="#_master_tablet_balancer">master.tablet.balancer</a></li>
<li><a href="#_master_walog_closer_implementation">master.walog.closer.implementation</a></li>
</ul>
</li>
<li><a href="#TSERV_PREFIX">16.3.5. tserver.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_tserver_archive_walogs">tserver.archive.walogs</a></li>
<li><a href="#_tserver_bloom_load_concurrent_max">tserver.bloom.load.concurrent.max</a></li>
<li><a href="#_tserver_bulk_assign_threads">tserver.bulk.assign.threads</a></li>
<li><a href="#_tserver_bulk_process_threads">tserver.bulk.process.threads</a></li>
<li><a href="#_tserver_bulk_retry_max">tserver.bulk.retry.max</a></li>
<li><a href="#_tserver_bulk_timeout">tserver.bulk.timeout</a></li>
<li><a href="#_tserver_cache_data_size">tserver.cache.data.size</a></li>
<li><a href="#_tserver_cache_index_size">tserver.cache.index.size</a></li>
<li><a href="#_tserver_client_timeout">tserver.client.timeout</a></li>
<li><a href="#_tserver_compaction_major_concurrent_max">tserver.compaction.major.concurrent.max</a></li>
<li><a href="#_tserver_compaction_major_delay">tserver.compaction.major.delay</a></li>
<li><a href="#_tserver_compaction_major_thread_files_open_max">tserver.compaction.major.thread.files.open.max</a></li>
<li><a href="#_tserver_compaction_minor_concurrent_max">tserver.compaction.minor.concurrent.max</a></li>
<li><a href="#_tserver_compaction_warn_time">tserver.compaction.warn.time</a></li>
<li><a href="#_tserver_default_blocksize">tserver.default.blocksize</a></li>
<li><a href="#_tserver_dir_memdump">tserver.dir.memdump</a></li>
<li><a href="#_tserver_files_open_idle">tserver.files.open.idle</a></li>
<li><a href="#_tserver_hold_time_max">tserver.hold.time.max</a></li>
<li><a href="#_tserver_memory_manager">tserver.memory.manager</a></li>
<li><a href="#_tserver_memory_maps_max">tserver.memory.maps.max</a></li>
<li><a href="#_tserver_memory_maps_native_enabled">tserver.memory.maps.native.enabled</a></li>
<li><a href="#_tserver_metadata_readahead_concurrent_max">tserver.metadata.readahead.concurrent.max</a></li>
<li><a href="#_tserver_migrations_concurrent_max">tserver.migrations.concurrent.max</a></li>
<li><a href="#_tserver_monitor_fs">tserver.monitor.fs</a></li>
<li><a href="#_tserver_mutation_queue_max">tserver.mutation.queue.max</a></li>
<li><a href="#_tserver_port_client">tserver.port.client</a></li>
<li><a href="#_tserver_port_search">tserver.port.search</a></li>
<li><a href="#_tserver_readahead_concurrent_max">tserver.readahead.concurrent.max</a></li>
<li><a href="#_tserver_recovery_concurrent_max">tserver.recovery.concurrent.max</a></li>
<li><a href="#_tserver_scan_files_open_max">tserver.scan.files.open.max</a></li>
<li><a href="#_tserver_server_message_size_max">tserver.server.message.size.max</a></li>
<li><a href="#_tserver_server_threadcheck_time">tserver.server.threadcheck.time</a></li>
<li><a href="#_tserver_server_threads_minimum">tserver.server.threads.minimum</a></li>
<li><a href="#_tserver_session_idle_max">tserver.session.idle.max</a></li>
<li><a href="#_tserver_sort_buffer_size">tserver.sort.buffer.size</a></li>
<li><a href="#_tserver_tablet_split_midpoint_files_max">tserver.tablet.split.midpoint.files.max</a></li>
<li><a href="#_tserver_wal_blocksize">tserver.wal.blocksize</a></li>
<li><a href="#_tserver_wal_replication">tserver.wal.replication</a></li>
<li><a href="#_tserver_wal_sync">tserver.wal.sync</a></li>
<li><a href="#_tserver_wal_sync_method">tserver.wal.sync.method</a></li>
<li><a href="#_tserver_walog_max_size">tserver.walog.max.size</a></li>
<li><a href="#_tserver_walog_max_age">tserver.walog.max.age</a></li>
<li><a href="#_tserver_workq_threads">tserver.workq.threads</a></li>
</ul>
</li>
<li><a href="#LOGGER_PREFIX">16.3.6. logger.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_logger_dir_walog">logger.dir.walog</a></li>
</ul>
</li>
<li><a href="#GC_PREFIX">16.3.7. gc.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_gc_cycle_delay">gc.cycle.delay</a></li>
<li><a href="#_gc_cycle_start">gc.cycle.start</a></li>
<li><a href="#_gc_port_client">gc.port.client</a></li>
<li><a href="#_gc_threads_delete">gc.threads.delete</a></li>
<li><a href="#_gc_trash_ignore">gc.trash.ignore</a></li>
<li><a href="#_gc_file_archive">gc.file.archive</a></li>
<li><a href="#_gc_wal_dead_server_wait">gc.wal.dead.server.wait</a></li>
</ul>
</li>
<li><a href="#MONITOR_PREFIX">16.3.8. monitor.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_monitor_banner_background">monitor.banner.background</a></li>
<li><a href="#_monitor_banner_color">monitor.banner.color</a></li>
<li><a href="#_monitor_banner_text">monitor.banner.text</a></li>
<li><a href="#_monitor_lock_check_interval">monitor.lock.check.interval</a></li>
<li><a href="#_monitor_port_client">monitor.port.client</a></li>
<li><a href="#_monitor_port_log4j">monitor.port.log4j</a></li>
</ul>
</li>
<li><a href="#TRACE_PREFIX">16.3.9. trace.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_trace_password">trace.password</a></li>
<li><a href="#_trace_port_client">trace.port.client</a></li>
<li><a href="#_trace_table">trace.table</a></li>
<li><a href="#_trace_token_type">trace.token.type</a></li>
<li><a href="#_trace_user">trace.user</a></li>
</ul>
</li>
<li><a href="#TRACE_TOKEN_PROPERTY_PREFIX">16.3.10. trace.token.property.*</a></li>
<li><a href="#TABLE_PREFIX">16.3.11. table.*</a></li>
<li>
<ul class="sectlevel4">
<li><a href="#_table_balancer">table.balancer</a></li>
<li><a href="#_table_bloom_enabled">table.bloom.enabled</a></li>
<li><a href="#_table_bloom_error_rate">table.bloom.error.rate</a></li>
<li><a href="#_table_bloom_hash_type">table.bloom.hash.type</a></li>
<li><a href="#_table_bloom_key_functor">table.bloom.key.functor</a></li>
<li><a href="#_table_bloom_load_threshold">table.bloom.load.threshold</a></li>
<li><a href="#_table_bloom_size">table.bloom.size</a></li>
<li><a href="#_table_cache_block_enable">table.cache.block.enable</a></li>
<li><a href="#_table_cache_index_enable">table.cache.index.enable</a></li>
<li><a href="#_table_classpath_context">table.classpath.context</a></li>
<li><a href="#_table_compaction_major_everything_idle">table.compaction.major.everything.idle</a></li>
<li><a href="#_table_compaction_major_ratio">table.compaction.major.ratio</a></li>
<li><a href="#_table_compaction_minor_idle">table.compaction.minor.idle</a></li>
<li><a href="#_table_compaction_minor_logs_threshold">table.compaction.minor.logs.threshold</a></li>
<li><a href="#_table_failures_ignore">table.failures.ignore</a></li>
<li><a href="#_table_file_blocksize">table.file.blocksize</a></li>
<li><a href="#_table_file_compress_blocksize">table.file.compress.blocksize</a></li>
<li><a href="#_table_file_compress_blocksize_index">table.file.compress.blocksize.index</a></li>
<li><a href="#_table_file_compress_type">table.file.compress.type</a></li>
<li><a href="#_table_file_max">table.file.max</a></li>
<li><a href="#_table_file_replication">table.file.replication</a></li>
<li><a href="#_table_file_type">table.file.type</a></li>
<li><a href="#_table_formatter">table.formatter</a></li>
<li><a href="#_table_groups_enabled">table.groups.enabled</a></li>
<li><a href="#_table_interepreter">table.interepreter</a></li>
<li><a href="#_table_majc_compaction_strategy">table.majc.compaction.strategy</a></li>
<li><a href="#_table_scan_max_memory">table.scan.max.memory</a></li>
<li><a href="#_table_security_scan_visibility_default">table.security.scan.visibility.default</a></li>
<li><a href="#_table_split_threshold">table.split.threshold</a></li>
<li><a href="#_table_walog_enabled">table.walog.enabled</a></li>
</ul>
</li>
<li><a href="#TABLE_CONSTRAINT_PREFIX">16.3.12. table.constraint.*</a></li>
<li><a href="#TABLE_ITERATOR_PREFIX">16.3.13. table.iterator.*</a></li>
<li><a href="#TABLE_LOCALITY_GROUP_PREFIX">16.3.14. table.group.*</a></li>
<li><a href="#TABLE_COMPACTION_STRATEGY_PREFIX">16.3.15. table.majc.compaction.strategy.opts.*</a></li>
<li><a href="#VFS_CONTEXT_CLASSPATH_PROPERTY">16.3.16. general.vfs.context.classpath.*</a></li>
</ul>
</li>
<li><a href="#_property_types">16.4. Property Types</a></li>
<li>
<ul class="sectlevel3">
<li><a href="#_duration">16.4.1. duration</a></li>
<li><a href="#_date_time">16.4.2. date/time</a></li>
<li><a href="#_memory">16.4.3. memory</a></li>
<li><a href="#_host_list">16.4.4. host list</a></li>
<li><a href="#_port">16.4.5. port</a></li>
<li><a href="#_count">16.4.6. count</a></li>
<li><a href="#_fraction_percentage">16.4.7. fraction/percentage</a></li>
<li><a href="#_path">16.4.8. path</a></li>
<li><a href="#_absolute_path">16.4.9. absolute path</a></li>
<li><a href="#_java_class">16.4.10. java class</a></li>
<li><a href="#_string">16.4.11. string</a></li>
<li><a href="#_boolean">16.4.12. boolean</a></li>
<li><a href="#_uri">16.4.13. uri</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,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" alt="accumulo logo">
</div>
</div>
<div class="paragraph">
<p>Copyright © 2011-2016 The Apache Software Foundation, Licensed under the Apache
License, Version 2.0. Apache Accumulo, Accumulo, Apache, and the Apache
Accumulo project logo are trademarks of the Apache Software Foundation.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">1. Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Apache Accumulo is a highly scalable structured store based on Google&#8217;s BigTable.
Accumulo is written in Java and operates over the Hadoop Distributed File System
(HDFS), which is part of the popular Apache Hadoop project. Accumulo supports
efficient storage and retrieval of structured data, including queries for ranges, and
provides support for using Accumulo tables as input and output for MapReduce
jobs.</p>
</div>
<div class="paragraph">
<p>Accumulo features automatic load-balancing and partitioning, data compression
and fine-grained security labels.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_accumulo_design">2. Accumulo Design</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_data_model">2.1. Data Model</h3>
<div class="paragraph">
<p>Accumulo provides a richer data model than simple key-value stores, but is not a
fully relational database. Data is represented as key-value pairs, where the key and
value are comprised of the following elements:</p>
</div>
<table class="tableblock frame-all grid-all" style="width:75%; ">
<colgroup>
<col style="width:16%;">
<col style="width:16%;">
<col style="width:16%;">
<col style="width:16%;">
<col style="width:16%;">
<col style="width:16%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top" colspan="5"><p class="tableblock">Key</p></td>
<td class="tableblock halign-center valign-middle" rowspan="3"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-middle" rowspan="2"><p class="tableblock">Row ID</p></td>
<td class="tableblock halign-center valign-top" colspan="3"><p class="tableblock">Column</p></td>
<td class="tableblock halign-center valign-middle" rowspan="2"><p class="tableblock">Timestamp</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">Family</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Qualifier</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Visibility</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>All elements of the Key and the Value are represented as byte arrays except for
Timestamp, which is a Long. Accumulo sorts keys by element and lexicographically
in ascending order. Timestamps are sorted in descending order so that later
versions of the same Key appear first in a sequential scan. Tables consist of a set of
sorted key-value pairs.</p>
</div>
</div>
<div class="sect2">
<h3 id="_architecture">2.2. Architecture</h3>
<div class="paragraph">
<p>Accumulo is a distributed data storage and retrieval system and as such consists of
several architectural components, some of which run on many individual servers.
Much of the work Accumulo does involves maintaining certain properties of the
data, such as organization, availability, and integrity, across many commodity-class
machines.</p>
</div>
</div>
<div class="sect2">
<h3 id="_components">2.3. Components</h3>
<div class="paragraph">
<p>An instance of Accumulo includes many TabletServers, one Garbage Collector process,
one Master server and many Clients.</p>
</div>
<div class="sect3">
<h4 id="_tablet_server">2.3.1. Tablet Server</h4>
<div class="paragraph">
<p>The TabletServer manages some subset of all the tablets (partitions of tables). This includes receiving writes from clients, persisting writes to a
write-ahead log, sorting new key-value pairs in memory, periodically
flushing sorted key-value pairs to new files in HDFS, and responding
to reads from clients, forming a merge-sorted view of all keys and
values from all the files it has created and the sorted in-memory
store.</p>
</div>
<div class="paragraph">
<p>TabletServers also perform recovery of a tablet
that was previously on a server that failed, reapplying any writes
found in the write-ahead log to the tablet.</p>
</div>
</div>
<div class="sect3">
<h4 id="_garbage_collector">2.3.2. Garbage Collector</h4>
<div class="paragraph">
<p>Accumulo processes will share files stored in HDFS. Periodically, the Garbage
Collector will identify files that are no longer needed by any process, and
delete them. Multiple garbage collectors can be run to provide hot-standby support.
They will perform leader election among themselves to choose a single active instance.</p>
</div>
</div>
<div class="sect3">
<h4 id="_master">2.3.3. Master</h4>
<div class="paragraph">
<p>The Accumulo Master is responsible for detecting and responding to TabletServer
failure. It tries to balance the load across TabletServer by assigning tablets carefully
and instructing TabletServers to unload tablets when necessary. The Master ensures all
tablets are assigned to one TabletServer each, and handles table creation, alteration,
and deletion requests from clients. The Master also coordinates startup, graceful
shutdown and recovery of changes in write-ahead logs when Tablet servers fail.</p>
</div>
<div class="paragraph">
<p>Multiple masters may be run. The masters will choose among themselves a single master,
and the others will become backups if the master should fail.</p>
</div>
</div>
<div class="sect3">
<h4 id="_tracer">2.3.4. Tracer</h4>
<div class="paragraph">
<p>The Accumulo Tracer process supports the distributed timing API provided by Accumulo.
One to many of these processes can be run on a cluster which will write the timing
information to a given Accumulo table for future reference. Seeing the section on
Tracing for more information on this support.</p>
</div>
</div>
<div class="sect3">
<h4 id="_monitor">2.3.5. Monitor</h4>
<div class="paragraph">
<p>The Accumulo Monitor is a web application that provides a wealth of information about
the state of an instance. The Monitor shows graphs and tables which contain information
about read/write rates, cache hit/miss rates, and Accumulo table information such as scan
rate and active/queued compactions. Additionally, the Monitor should always be the first
point of entry when attempting to debug an Accumulo problem as it will show high-level problems
in addition to aggregated errors from all nodes in the cluster. See the section on Monitoring
for more information.</p>
</div>
<div class="paragraph">
<p>Multiple Monitors can be run to provide hot-standby support in the face of failure. Due to the
forwarding of logs from remote hosts to the Monitor, only one Monitor process should be active
at one time. Leader election will be performed internally to choose the active Monitor.</p>
</div>
</div>
<div class="sect3">
<h4 id="_client">2.3.6. Client</h4>
<div class="paragraph">
<p>Accumulo includes a client library that is linked to every application. The client
library contains logic for finding servers managing a particular tablet, and
communicating with TabletServers to write and retrieve key-value pairs.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_data_management">2.4. Data Management</h3>
<div class="paragraph">
<p>Accumulo stores data in tables, which are partitioned into tablets. Tablets are
partitioned on row boundaries so that all of the columns and values for a particular
row are found together within the same tablet. The Master assigns Tablets to one
TabletServer at a time. This enables row-level transactions to take place without
using distributed locking or some other complicated synchronization mechanism. As
clients insert and query data, and as machines are added and removed from the
cluster, the Master migrates tablets to ensure they remain available and that the
ingest and query load is balanced across the cluster.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,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" alt="data distribution" width="500">
</div>
</div>
</div>
<div class="sect2">
<h3 id="_tablet_service">2.5. Tablet Service</h3>
<div class="paragraph">
<p>When a write arrives at a TabletServer it is written to a Write-Ahead Log and
then inserted into a sorted data structure in memory called a MemTable. When the
MemTable reaches a certain size the TabletServer writes out the sorted key-value
pairs to a file in HDFS called Indexed Sequential Access Method (ISAM)
file. This process is called a minor compaction. A new MemTable is then created
and the fact of the compaction is recorded in the Write-Ahead Log.</p>
</div>
<div class="paragraph">
<p>When a request to read data arrives at a TabletServer, the TabletServer does a
binary search across the MemTable as well as the in-memory indexes associated
with each ISAM file to find the relevant values. If clients are performing a
scan, several key-value pairs are returned to the client in order from the
MemTable and the set of ISAM files by performing a merge-sort as they are read.</p>
</div>
</div>
<div class="sect2">
<h3 id="_compactions">2.6. Compactions</h3>
<div class="paragraph">
<p>In order to manage the number of files per tablet, periodically the TabletServer
performs Major Compactions of files within a tablet, in which some set of ISAM
files are combined into one file. The previous files will eventually be removed
by the Garbage Collector. This also provides an opportunity to permanently
remove deleted key-value pairs by omitting key-value pairs suppressed by a
delete entry when the new file is created.</p>
</div>
</div>
<div class="sect2">
<h3 id="_splitting">2.7. Splitting</h3>
<div class="paragraph">
<p>When a table is created it has one tablet. As the table grows its initial
tablet eventually splits into two tablets. Its likely that one of these
tablets will migrate to another tablet server. As the table continues to grow,
its tablets will continue to split and be migrated. The decision to
automatically split a tablet is based on the size of a tablets files. The
size threshold at which a tablet splits is configurable per table. In addition
to automatic splitting, a user can manually add split points to a table to
create new tablets. Manually splitting a new table can parallelize reads and
writes giving better initial performance without waiting for automatic
splitting.</p>
</div>
<div class="paragraph">
<p>As data is deleted from a table, tablets may shrink. Over time this can lead
to small or empty tablets. To deal with this, merging of tablets was
introduced in Accumulo 1.4. This is discussed in more detail later.</p>
</div>
</div>
<div class="sect2">
<h3 id="_fault_tolerance">2.8. Fault-Tolerance</h3>
<div class="paragraph">
<p>If a TabletServer fails, the Master detects it and automatically reassigns the tablets
assigned from the failed server to other servers. Any key-value pairs that were in
memory at the time the TabletServer fails are automatically reapplied from the Write-Ahead
Log(WAL) to prevent any loss of data.</p>
</div>
<div class="paragraph">
<p>Tablet servers write their WALs directly to HDFS so the logs are available to all tablet
servers for recovery. To make the recovery process efficient, the updates within a log are
grouped by tablet. TabletServers can quickly apply the mutations from the sorted logs
that are destined for the tablets they have now been assigned.</p>
</div>
<div class="paragraph">
<p>TabletServer failures are noted on the Master&#8217;s monitor page, accessible via
<code><a href="http://master-address:50095/monitor">http://master-address:50095/monitor</a></code>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,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" alt="failure handling" width="500">
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_accumulo_shell">3. Accumulo Shell</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Accumulo provides a simple shell that can be used to examine the contents and
configuration settings of tables, insert/update/delete values, and change
configuration settings.</p>
</div>
<div class="paragraph">
<p>The shell can be started by the following command:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo shell -u [username]</pre>
</div>
</div>
<div class="paragraph">
<p>The shell will prompt for the corresponding password to the username specified
and then display the following prompt:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>Shell - Apache Accumulo Interactive Shell
-
- version 1.6
- instance name: myinstance
- instance id: 00000000-0000-0000-0000-000000000000
-
- type 'help' for a list of available commands
-</pre>
</div>
</div>
<div class="sect2">
<h3 id="_basic_administration">3.1. Basic Administration</h3>
<div class="paragraph">
<p>The Accumulo shell can be used to create and delete tables, as well as to configure
table and instance specific options.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@myinstance&gt; tables
accumulo.metadata
accumulo.root
root@myinstance&gt; createtable mytable
root@myinstance mytable&gt;
root@myinstance mytable&gt; tables
accumulo.metadata
accumulo.root
mytable
root@myinstance mytable&gt; createtable testtable
root@myinstance testtable&gt;
root@myinstance testtable&gt; deletetable testtable
deletetable { testtable } (yes|no)? yes
Table: [testtable] has been deleted.
root@myinstance&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>The Shell can also be used to insert updates and scan tables. This is useful for
inspecting tables.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@myinstance mytable&gt; scan
root@myinstance mytable&gt; insert row1 colf colq value1
insert successful
root@myinstance mytable&gt; scan
row1 colf:colq [] value1</pre>
</div>
</div>
<div class="paragraph">
<p>The value in brackets &#8220;[]&#8221; would be the visibility labels. Since none were used, this is empty for this row.
You can use the <code>-st</code> option to scan to see the timestamp for the cell, too.</p>
</div>
</div>
<div class="sect2">
<h3 id="_table_maintenance">3.2. Table Maintenance</h3>
<div class="paragraph">
<p>The <strong>compact</strong> command instructs Accumulo to schedule a compaction of the table during which
files are consolidated and deleted entries are removed.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance mytable&gt; compact -t mytable
07 16:13:53,201 [shell.Shell] INFO : Compaction of table mytable started for given range</pre>
</div>
</div>
<div class="paragraph">
<p>The <strong>flush</strong> command instructs Accumulo to write all entries currently in memory for a given table
to disk.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance mytable&gt; flush -t mytable
07 16:14:19,351 [shell.Shell] INFO : Flush of table mytable
initiated...</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_user_administration">3.3. User Administration</h3>
<div class="paragraph">
<p>The Shell can be used to add, remove, and grant privileges to users.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@myinstance mytable&gt; createuser bob
Enter new password for 'bob': *********
Please confirm new password for 'bob': *********
root@myinstance mytable&gt; authenticate bob
Enter current password for 'bob': *********
Valid
root@myinstance mytable&gt; grant System.CREATE_TABLE -s -u bob
root@myinstance mytable&gt; user bob
Enter current password for 'bob': *********
bob@myinstance mytable&gt; userpermissions
System permissions: System.CREATE_TABLE
Table permissions (accumulo.metadata): Table.READ
Table permissions (mytable): NONE
bob@myinstance mytable&gt; createtable bobstable
bob@myinstance bobstable&gt;
bob@myinstance bobstable&gt; user root
Enter current password for 'root': *********
root@myinstance bobstable&gt; revoke System.CREATE_TABLE -s -u bob</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_writing_accumulo_clients">4. Writing Accumulo Clients</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_running_client_code">4.1. Running Client Code</h3>
<div class="paragraph">
<p>There are multiple ways to run Java code that uses Accumulo. Below is a list
of the different ways to execute client code.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>using java executable</p>
</li>
<li>
<p>using the accumulo script</p>
</li>
<li>
<p>using the tool script</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In order to run client code written to run against Accumulo, you will need to
include the jars that Accumulo depends on in your classpath. Accumulo client
code depends on Hadoop and Zookeeper. For Hadoop add the hadoop client jar, all
of the jars in the Hadoop lib directory, and the conf directory to the
classpath. For Zookeeper 3.3 you only need to add the Zookeeper jar, and not
what is in the Zookeeper lib directory. You can run the following command on a
configured Accumulo system to see what its using for its classpath.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo classpath</pre>
</div>
</div>
<div class="paragraph">
<p>Another option for running your code is to put a jar file in
<code>$ACCUMULO_HOME/lib/ext</code>. After doing this you can use the accumulo
script to execute your code. For example if you create a jar containing the
class <code>com.foo.Client</code> and placed that in <code>lib/ext</code>, then you could use the command
<code>$ACCUMULO_HOME/bin/accumulo com.foo.Client</code> to execute your code.</p>
</div>
<div class="paragraph">
<p>If you are writing map reduce job that access Accumulo, then you can use the
bin/tool.sh script to run those jobs. See the map reduce example.</p>
</div>
</div>
<div class="sect2">
<h3 id="_connecting">4.2. Connecting</h3>
<div class="paragraph">
<p>All clients must first identify the Accumulo instance to which they will be
communicating. Code to do this is as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">String instanceName = "myinstance";
String zooServers = "zooserver-one,zooserver-two"
Instance inst = new ZooKeeperInstance(instanceName, zooServers);
Connector conn = inst.getConnector("user", new PasswordToken("passwd"));</code></pre>
</div>
</div>
<div class="paragraph">
<p>The PasswordToken is the most common implementation of an <code>AuthenticationToken</code>.
This general interface allows authentication as an Accumulo user to come from a variety of sources
or means. The CredentialProviderToken leverages the Hadoop CredentialProviders (new in Hadoop 2.6).</p>
</div>
<div class="paragraph">
<p>For example, the CredentialProviderToken can be used in conjunction with a Java KeyStore
to alleviate passwords stored in cleartext. When stored in HDFS, a single KeyStore can be
used across an entire instance. Be aware that KeyStores stored on the local filesystem
must be made available to all nodes in the Accumulo cluster.</p>
</div>
</div>
<div class="sect2">
<h3 id="_writing_data">4.3. Writing Data</h3>
<div class="paragraph">
<p>Data are written to Accumulo by creating Mutation objects that represent all the
changes to the columns of a single row. The changes are made atomically in the
TabletServer. Clients then add Mutations to a BatchWriter which submits them to
the appropriate TabletServers.</p>
</div>
<div class="paragraph">
<p>Mutations can be created thus:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Text rowID = new Text("row1");
Text colFam = new Text("myColFam");
Text colQual = new Text("myColQual");
ColumnVisibility colVis = new ColumnVisibility("public");
long timestamp = System.currentTimeMillis();
Value value = new Value("myValue".getBytes());
Mutation mutation = new Mutation(rowID);
mutation.put(colFam, colQual, colVis, timestamp, value);</code></pre>
</div>
</div>
<div class="sect3">
<h4 id="_batchwriter">4.3.1. BatchWriter</h4>
<div class="paragraph">
<p>The BatchWriter is highly optimized to send Mutations to multiple TabletServers
and automatically batches Mutations destined for the same TabletServer to
amortize network overhead. Care must be taken to avoid changing the contents of
any Object passed to the BatchWriter since it keeps objects in memory while
batching.</p>
</div>
<div class="paragraph">
<p>Mutations are added to a BatchWriter thus:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// BatchWriterConfig has reasonable defaults
BatchWriterConfig config = new BatchWriterConfig();
config.setMaxMemory(10000000L); // bytes available to batchwriter for buffering mutations
BatchWriter writer = conn.createBatchWriter("table", config)
writer.add(mutation);
writer.close();</code></pre>
</div>
</div>
<div class="paragraph">
<p>An example of using the batch writer can be found at
<code>accumulo/docs/examples/README.batch</code>.</p>
</div>
</div>
<div class="sect3">
<h4 id="_conditionalwriter">4.3.2. ConditionalWriter</h4>
<div class="paragraph">
<p>The ConditionalWriter enables efficient, atomic read-modify-write operations on
rows. The ConditionalWriter writes special Mutations which have a list of per
column conditions that must all be met before the mutation is applied. The
conditions are checked in the tablet server while a row lock is
held (Mutations written by the BatchWriter will not obtain a row
lock). The conditions that can be checked for a column are equality and
absence. For example a conditional mutation can require that column A is
absent inorder to be applied. Iterators can be applied when checking
conditions. Using iterators, many other operations besides equality and
absence can be checked. For example, using an iterator that converts values
less than 5 to 0 and everything else to 1, its possible to only apply a
mutation when a column is less than 5.</p>
</div>
<div class="paragraph">
<p>In the case when a tablet server dies after a client sent a conditional
mutation, its not known if the mutation was applied or not. When this happens
the ConditionalWriter reports a status of UNKNOWN for the ConditionalMutation.
In many cases this situation can be dealt with by simply reading the row again
and possibly sending another conditional mutation. If this is not sufficient,
then a higher level of abstraction can be built by storing transactional
information within a row.</p>
</div>
<div class="paragraph">
<p>An example of using the batch writer can be found at
<code>accumulo/docs/examples/README.reservations</code>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_reading_data">4.4. Reading Data</h3>
<div class="paragraph">
<p>Accumulo is optimized to quickly retrieve the value associated with a given key, and
to efficiently return ranges of consecutive keys and their associated values.</p>
</div>
<div class="sect3">
<h4 id="_scanner">4.4.1. Scanner</h4>
<div class="paragraph">
<p>To retrieve data, Clients use a Scanner, which acts like an Iterator over
keys and values. Scanners can be configured to start and stop at particular keys, and
to return a subset of the columns available.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// specify which visibilities we are allowed to see
Authorizations auths = new Authorizations("public");
Scanner scan =
conn.createScanner("table", auths);
scan.setRange(new Range("harry","john"));
scan.fetchColumnFamily(new Text("attributes"));
for(Entry&lt;Key,Value&gt; entry : scan) {
Text row = entry.getKey().getRow();
Value value = entry.getValue();
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_isolated_scanner">4.4.2. Isolated Scanner</h4>
<div class="paragraph">
<p>Accumulo supports the ability to present an isolated view of rows when
scanning. There are three possible ways that a row could change in Accumulo :</p>
</div>
<div class="ulist">
<ul>
<li>
<p>a mutation applied to a table</p>
</li>
<li>
<p>iterators executed as part of a minor or major compaction</p>
</li>
<li>
<p>bulk import of new files</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Isolation guarantees that either all or none of the changes made by these
operations on a row are seen. Use the IsolatedScanner to obtain an isolated
view of an Accumulo table. When using the regular scanner it is possible to see
a non isolated view of a row. For example if a mutation modifies three
columns, it is possible that you will only see two of those modifications.
With the isolated scanner either all three of the changes are seen or none.</p>
</div>
<div class="paragraph">
<p>The IsolatedScanner buffers rows on the client side so a large row will not
crash a tablet server. By default rows are buffered in memory, but the user
can easily supply their own buffer if they wish to buffer to disk when rows are
large.</p>
</div>
<div class="paragraph">
<p>For an example, look at the following</p>
</div>
<div class="literalblock">
<div class="content">
<pre>examples/simple/src/main/java/org/apache/accumulo/examples/simple/isolation/InterferenceTest.java</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_batchscanner">4.4.3. BatchScanner</h4>
<div class="paragraph">
<p>For some types of access, it is more efficient to retrieve several ranges
simultaneously. This arises when accessing a set of rows that are not consecutive
whose IDs have been retrieved from a secondary index, for example.</p>
</div>
<div class="paragraph">
<p>The BatchScanner is configured similarly to the Scanner; it can be configured to
retrieve a subset of the columns available, but rather than passing a single Range,
BatchScanners accept a set of Ranges. It is important to note that the keys returned
by a BatchScanner are not in sorted order since the keys streamed are from multiple
TabletServers in parallel.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">ArrayList&lt;Range&gt; ranges = new ArrayList&lt;Range&gt;();
// populate list of ranges ...
BatchScanner bscan =
conn.createBatchScanner("table", auths, 10);
bscan.setRanges(ranges);
bscan.fetchColumnFamily(new Text("attributes"));
for(Entry&lt;Key,Value&gt; entry : bscan) {
System.out.println(entry.getValue());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>An example of the BatchScanner can be found at
<code>accumulo/docs/examples/README.batch</code>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_proxy">4.5. Proxy</h3>
<div class="paragraph">
<p>The proxy API allows the interaction with Accumulo with languages other than Java.
A proxy server is provided in the codebase and a client can further be generated.</p>
</div>
<div class="sect3">
<h4 id="_prequisites">4.5.1. Prequisites</h4>
<div class="paragraph">
<p>The proxy server can live on any node in which the basic client API would work. That
means it must be able to communicate with the Master, ZooKeepers, NameNode, and the
DataNodes. A proxy client only needs the ability to communicate with the proxy server.</p>
</div>
</div>
<div class="sect3">
<h4 id="_configuration">4.5.2. Configuration</h4>
<div class="paragraph">
<p>The configuration options for the proxy server live inside of a properties file. At
the very least, you need to supply the following properties:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>protocolFactory=org.apache.thrift.protocol.TCompactProtocol$Factory
tokenClass=org.apache.accumulo.core.client.security.tokens.PasswordToken
port=42424
instance=test
zookeepers=localhost:2181</pre>
</div>
</div>
<div class="paragraph">
<p>You can find a sample configuration file in your distribution:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/proxy/proxy.properties.</pre>
</div>
</div>
<div class="paragraph">
<p>This sample configuration file further demonstrates an ability to back the proxy server
by MockAccumulo or the MiniAccumuloCluster.</p>
</div>
</div>
<div class="sect3">
<h4 id="_running_the_proxy_server">4.5.3. Running the Proxy Server</h4>
<div class="paragraph">
<p>After the properties file holding the configuration is created, the proxy server
can be started using the following command in the Accumulo distribution (assuming
your properties file is named <code>config.properties</code>):</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo proxy -p config.properties</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_creating_a_proxy_client">4.5.4. Creating a Proxy Client</h4>
<div class="paragraph">
<p>Aside from installing the Thrift compiler, you will also need the language-specific library
for Thrift installed to generate client code in that language. Typically, your operating
system&#8217;s package manager will be able to automatically install these for you in an expected
location such as <code>/usr/lib/python/site-packages/thrift</code>.</p>
</div>
<div class="paragraph">
<p>You can find the thrift file for generating the client:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/proxy/proxy.thrift.</pre>
</div>
</div>
<div class="paragraph">
<p>After a client is generated, the port specified in the configuration properties above will be
used to connect to the server.</p>
</div>
</div>
<div class="sect3">
<h4 id="_using_a_proxy_client">4.5.5. Using a Proxy Client</h4>
<div class="paragraph">
<p>The following examples have been written in Java and the method signatures may be
slightly different depending on the language specified when generating client with
the Thrift compiler. After initiating a connection to the Proxy (see Apache Thrift&#8217;s
documentation for examples of connecting to a Thrift service), the methods on the
proxy client will be available. The first thing to do is log in:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Map password = new HashMap&lt;String,String&gt;();
password.put("password", "secret");
ByteBuffer token = client.login("root", password);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Once logged in, the token returned will be used for most subsequent calls to the client.
Let&#8217;s create a table, add some data, scan the table, and delete it.</p>
</div>
<div class="paragraph">
<p>First, create a table.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">client.createTable(token, "myTable", true, TimeType.MILLIS);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Next, add some data:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// first, create a writer on the server
String writer = client.createWriter(token, "myTable", new WriterOptions());
// build column updates
Map&lt;ByteBuffer, List&lt;ColumnUpdate&gt; cells&gt; cellsToUpdate = //...
// send updates to the server
client.updateAndFlush(writer, "myTable", cellsToUpdate);
client.closeWriter(writer);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Scan for the data and batch the return of the results on the server:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">String scanner = client.createScanner(token, "myTable", new ScanOptions());
ScanResult results = client.nextK(scanner, 100);
for(KeyValue keyValue : results.getResultsIterator()) {
// do something with results
}
client.closeScanner(scanner);</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_development_clients">5. Development Clients</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Normally, Accumulo consists of lots of moving parts. Even a stand-alone version of
Accumulo requires Hadoop, Zookeeper, the Accumulo master, a tablet server, etc. If
you want to write a unit test that uses Accumulo, you need a lot of infrastructure
in place before your test can run.</p>
</div>
<div class="sect2">
<h3 id="_mock_accumulo">5.1. Mock Accumulo</h3>
<div class="paragraph">
<p>Mock Accumulo supplies mock implementations for much of the client API. It presently
does not enforce users, logins, permissions, etc. It does support Iterators and Combiners.
Note that MockAccumulo holds all data in memory, and will not retain any data or
settings between runs.</p>
</div>
<div class="paragraph">
<p>While normal interaction with the Accumulo client looks like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Instance instance = new ZooKeeperInstance(...);
Connector conn = instance.getConnector(user, passwordToken);</code></pre>
</div>
</div>
<div class="paragraph">
<p>To interact with the MockAccumulo, just replace the ZooKeeperInstance with MockInstance:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Instance instance = new MockInstance();</code></pre>
</div>
</div>
<div class="paragraph">
<p>In fact, you can use the <code>--fake</code> option to the Accumulo shell and interact with
MockAccumulo:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ ./bin/accumulo shell --fake -u root -p ''
Shell - Apache Accumulo Interactive Shell
-
- version: 1.6
- instance name: fake
- instance id: mock-instance-id
-
- type 'help' for a list of available commands
-
root@fake&gt; createtable test
root@fake test&gt; insert row1 cf cq value
root@fake test&gt; insert row2 cf cq value2
root@fake test&gt; insert row3 cf cq value3
root@fake test&gt; scan
row1 cf:cq [] value
row2 cf:cq [] value2
row3 cf:cq [] value3
root@fake test&gt; scan -b row2 -e row2
row2 cf:cq [] value2
root@fake test&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>When testing Map Reduce jobs, you can also set the Mock Accumulo on the AccumuloInputFormat
and AccumuloOutputFormat classes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">AccumuloInputFormat.setMockInstance(job, "mockInstance");
AccumuloOutputFormat.setMockInstance(job, "mockInstance");</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_mini_accumulo_cluster">5.2. Mini Accumulo Cluster</h3>
<div class="paragraph">
<p>While the Mock Accumulo provides a lightweight implementation of the client API for unit
testing, it is often necessary to write more realistic end-to-end integration tests that
take advantage of the entire ecosystem. The Mini Accumulo Cluster makes this possible by
configuring and starting Zookeeper, initializing Accumulo, and starting the Master as well
as some Tablet Servers. It runs against the local filesystem instead of having to start
up HDFS.</p>
</div>
<div class="paragraph">
<p>To start it up, you will need to supply an empty directory and a root password as arguments:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">File tempDirectory = // JUnit and Guava supply mechanisms for creating temp directories
MiniAccumuloCluster accumulo = new MiniAccumuloCluster(tempDirectory, "password");
accumulo.start();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Once we have our mini cluster running, we will want to interact with the Accumulo client API:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Instance instance = new ZooKeeperInstance(accumulo.getInstanceName(), accumulo.getZooKeepers());
Connector conn = instance.getConnector("root", new PasswordToken("password"));</code></pre>
</div>
</div>
<div class="paragraph">
<p>Upon completion of our development code, we will want to shutdown our MiniAccumuloCluster:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">accumulo.stop();
// delete your temporary folder</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_table_configuration">6. Table Configuration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Accumulo tables have a few options that can be configured to alter the default
behavior of Accumulo as well as improve performance based on the data stored.
These include locality groups, constraints, bloom filters, iterators, and block
cache. For a complete list of available configuration options, see <a href="#configuration">Configuration Management</a>.</p>
</div>
<div class="sect2">
<h3 id="_locality_groups">6.1. Locality Groups</h3>
<div class="paragraph">
<p>Accumulo supports storing sets of column families separately on disk to allow
clients to efficiently scan over columns that are frequently used together and to avoid
scanning over column families that are not requested. After a locality group is set,
Scanner and BatchScanner operations will automatically take advantage of them
whenever the fetchColumnFamilies() method is used.</p>
</div>
<div class="paragraph">
<p>By default, tables place all column families into the same &#8220;default&#8221; locality group.
Additional locality groups can be configured at any time via the shell or
programmatically as follows:</p>
</div>
<div class="sect3">
<h4 id="_managing_locality_groups_via_the_shell">6.1.1. Managing Locality Groups via the Shell</h4>
<div class="literalblock">
<div class="content">
<pre>usage: setgroups &lt;group&gt;=&lt;col fam&gt;{,&lt;col fam&gt;}{ &lt;group&gt;=&lt;col fam&gt;{,&lt;col fam&gt;}}
[-?] -t &lt;table&gt;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; setgroups group_one=colf1,colf2 -t mytable</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; getgroups -t mytable</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_managing_locality_groups_via_the_client_api">6.1.2. Managing Locality Groups via the Client API</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Connector conn;
HashMap&lt;String,Set&lt;Text&gt;&gt; localityGroups = new HashMap&lt;String, Set&lt;Text&gt;&gt;();
HashSet&lt;Text&gt; metadataColumns = new HashSet&lt;Text&gt;();
metadataColumns.add(new Text("domain"));
metadataColumns.add(new Text("link"));
HashSet&lt;Text&gt; contentColumns = new HashSet&lt;Text&gt;();
contentColumns.add(new Text("body"));
contentColumns.add(new Text("images"));
localityGroups.put("metadata", metadataColumns);
localityGroups.put("content", contentColumns);
conn.tableOperations().setLocalityGroups("mytable", localityGroups);
// existing locality groups can be obtained as follows
Map&lt;String, Set&lt;Text&gt;&gt; groups =
conn.tableOperations().getLocalityGroups("mytable");</code></pre>
</div>
</div>
<div class="paragraph">
<p>The assignment of Column Families to Locality Groups can be changed at any time. The
physical movement of column families into their new locality groups takes place via
the periodic Major Compaction process that takes place continuously in the
background. Major Compaction can also be scheduled to take place immediately
through the shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; compact -t mytable</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_constraints">6.2. Constraints</h3>
<div class="paragraph">
<p>Accumulo supports constraints applied on mutations at insert time. This can be
used to disallow certain inserts according to a user defined policy. Any mutation
that fails to meet the requirements of the constraint is rejected and sent back to the
client.</p>
</div>
<div class="paragraph">
<p>Constraints can be enabled by setting a table property as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>user@myinstance mytable&gt; constraint -t mytable -a com.test.ExampleConstraint com.test.AnotherConstraint
user@myinstance mytable&gt; constraint -l
com.test.ExampleConstraint=1
com.test.AnotherConstraint=2</pre>
</div>
</div>
<div class="paragraph">
<p>Currently there are no general-purpose constraints provided with the Accumulo
distribution. New constraints can be created by writing a Java class that implements
the following interface:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>org.apache.accumulo.core.constraints.Constraint</pre>
</div>
</div>
<div class="paragraph">
<p>To deploy a new constraint, create a jar file containing the class implementing the
new constraint and place it in the lib directory of the Accumulo installation. New
constraint jars can be added to Accumulo and enabled without restarting but any
change to an existing constraint class requires Accumulo to be restarted.</p>
</div>
<div class="paragraph">
<p>An example of constraints can be found in
<code>accumulo/docs/examples/README.constraints</code> with corresponding code under
<code>accumulo/examples/simple/src/main/java/accumulo/examples/simple/constraints</code> .</p>
</div>
</div>
<div class="sect2">
<h3 id="_bloom_filters">6.3. Bloom Filters</h3>
<div class="paragraph">
<p>As mutations are applied to an Accumulo table, several files are created per tablet. If
bloom filters are enabled, Accumulo will create and load a small data structure into
memory to determine whether a file contains a given key before opening the file.
This can speed up lookups considerably.</p>
</div>
<div class="paragraph">
<p>To enable bloom filters, enter the following command in the Shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance&gt; config -t mytable -s table.bloom.enabled=true</pre>
</div>
</div>
<div class="paragraph">
<p>An extensive example of using Bloom Filters can be found at
<code>accumulo/docs/examples/README.bloom</code> .</p>
</div>
</div>
<div class="sect2">
<h3 id="_iterators">6.4. Iterators</h3>
<div class="paragraph">
<p>Iterators provide a modular mechanism for adding functionality to be executed by
TabletServers when scanning or compacting data. This allows users to efficiently
summarize, filter, and aggregate data. In fact, the built-in features of cell-level
security and column fetching are implemented using Iterators.
Some useful Iterators are provided with Accumulo and can be found in the
<strong><code>org.apache.accumulo.core.iterators.user</code></strong> package.
In each case, any custom Iterators must be included in Accumulo&#8217;s classpath,
typically by including a jar in <code>$ACCUMULO_HOME/lib</code> or
<code>$ACCUMULO_HOME/lib/ext</code>, although the VFS classloader allows for
classpath manipulation using a variety of schemes including URLs and HDFS URIs.</p>
</div>
<div class="sect3">
<h4 id="_setting_iterators_via_the_shell">6.4.1. Setting Iterators via the Shell</h4>
<div class="paragraph">
<p>Iterators can be configured on a table at scan, minor compaction and/or major
compaction scopes. If the Iterator implements the OptionDescriber interface, the
setiter command can be used which will interactively prompt the user to provide
values for the given necessary options.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>usage: setiter [-?] -ageoff | -agg | -class &lt;name&gt; | -regex |
-reqvis | -vers [-majc] [-minc] [-n &lt;itername&gt;] -p &lt;pri&gt;
[-scan] [-t &lt;table&gt;]</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; setiter -t mytable -scan -p 15 -n myiter -class com.company.MyIterator</pre>
</div>
</div>
<div class="paragraph">
<p>The config command can always be used to manually configure iterators which is useful
in cases where the Iterator does not implement the OptionDescriber interface.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>config -t mytable -s table.iterator.scan.myiter=15,com.company.MyIterator
config -t mytable -s table.iterator.minc.myiter=15,com.company.MyIterator
config -t mytable -s table.iterator.majc.myiter=15,com.company.MyIterator
config -t mytable -s table.iterator.scan.myiter.opt.myoptionname=myoptionvalue
config -t mytable -s table.iterator.minc.myiter.opt.myoptionname=myoptionvalue
config -t mytable -s table.iterator.majc.myiter.opt.myoptionname=myoptionvalue</pre>
</div>
</div>
<div class="paragraph">
<p>Typically, a table will have multiple iterators. Accumulo configures a set of
system level iterators for each table. These iterators provide core functionality
like visibility label filtering and may not be removed by users. User level iterators
are applied in the order of their priority. Priority is a user-configured integer;
iterators with lower numbers go first, passing the results of their iteration on
to the other iterators up the stack.</p>
</div>
</div>
<div class="sect3">
<h4 id="_setting_iterators_programmatically">6.4.2. Setting Iterators Programmatically</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">scanner.addIterator(new IteratorSetting(
15, // priority
"myiter", // name this iterator
"com.company.MyIterator" // class name
));</code></pre>
</div>
</div>
<div class="paragraph">
<p>Some iterators take additional parameters from client code, as in the following
example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">IteratorSetting iter = new IteratorSetting(...);
iter.addOption("myoptionname", "myoptionvalue");
scanner.addIterator(iter)</code></pre>
</div>
</div>
<div class="paragraph">
<p>Tables support separate Iterator settings to be applied at scan time, upon minor
compaction and upon major compaction. For most uses, tables will have identical
iterator settings for all three to avoid inconsistent results.</p>
</div>
</div>
<div class="sect3">
<h4 id="_versioning_iterators_and_timestamps">6.4.3. Versioning Iterators and Timestamps</h4>
<div class="paragraph">
<p>Accumulo provides the capability to manage versioned data through the use of
timestamps within the Key. If a timestamp is not specified in the key created by the
client then the system will set the timestamp to the current time. Two keys with
identical rowIDs and columns but different timestamps are considered two versions
of the same key. If two inserts are made into Accumulo with the same rowID,
column, and timestamp, then the behavior is non-deterministic.</p>
</div>
<div class="paragraph">
<p>Timestamps are sorted in descending order, so the most recent data comes first.
Accumulo can be configured to return the top k versions, or versions later than a
given date. The default is to return the one most recent version.</p>
</div>
<div class="paragraph">
<p>The version policy can be changed by changing the VersioningIterator options for a
table as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>user@myinstance mytable&gt; config -t mytable -s table.iterator.scan.vers.opt.maxVersions=3
user@myinstance mytable&gt; config -t mytable -s table.iterator.minc.vers.opt.maxVersions=3
user@myinstance mytable&gt; config -t mytable -s table.iterator.majc.vers.opt.maxVersions=3</pre>
</div>
</div>
<div class="paragraph">
<p>When a table is created, by default its configured to use the
VersioningIterator and keep one version. A table can be created without the
VersioningIterator with the -ndi option in the shell. Also the Java API
has the following method</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">connector.tableOperations.create(String tableName, boolean limitVersion);</code></pre>
</div>
</div>
<div class="sect4">
<h5 id="_logical_time">Logical Time</h5>
<div class="paragraph">
<p>Accumulo 1.2 introduces the concept of logical time. This ensures that timestamps
set by Accumulo always move forward. This helps avoid problems caused by
TabletServers that have different time settings. The per tablet counter gives unique
one up time stamps on a per mutation basis. When using time in milliseconds, if
two things arrive within the same millisecond then both receive the same
timestamp. When using time in milliseconds, Accumulo set times will still
always move forward and never backwards.</p>
</div>
<div class="paragraph">
<p>A table can be configured to use logical timestamps at creation time as follows:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance&gt; createtable -tl logical</pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_deletes">Deletes</h5>
<div class="paragraph">
<p>Deletes are special keys in Accumulo that get sorted along will all the other data.
When a delete key is inserted, Accumulo will not show anything that has a
timestamp less than or equal to the delete key. During major compaction, any keys
older than a delete key are omitted from the new file created, and the omitted keys
are removed from disk as part of the regular garbage collection process.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_filters">6.4.4. Filters</h4>
<div class="paragraph">
<p>When scanning over a set of key-value pairs it is possible to apply an arbitrary
filtering policy through the use of a Filter. Filters are types of iterators that return
only key-value pairs that satisfy the filter logic. Accumulo has a few built-in filters
that can be configured on any table: AgeOff, ColumnAgeOff, Timestamp, NoVis, and RegEx. More can be added
by writing a Java class that extends the
<code>org.apache.accumulo.core.iterators.Filter</code> class.</p>
</div>
<div class="paragraph">
<p>The AgeOff filter can be configured to remove data older than a certain date or a fixed
amount of time from the present. The following example sets a table to delete
everything inserted over 30 seconds ago:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>user@myinstance&gt; createtable filtertest
user@myinstance filtertest&gt; setiter -t filtertest -scan -minc -majc -p 10 -n myfilter -ageoff
AgeOffFilter removes entries with timestamps more than &lt;ttl&gt; milliseconds old
----------&gt; set org.apache.accumulo.core.iterators.user.AgeOffFilter parameter negate, default false
keeps k/v that pass accept method, true rejects k/v that pass accept method:
----------&gt; set org.apache.accumulo.core.iterators.user.AgeOffFilter parameter ttl, time to
live (milliseconds): 30000
----------&gt; set org.apache.accumulo.core.iterators.user.AgeOffFilter parameter currentTime, if set,
use the given value as the absolute time in milliseconds as the current time of day:
user@myinstance filtertest&gt;
user@myinstance filtertest&gt; scan
user@myinstance filtertest&gt; insert foo a b c
user@myinstance filtertest&gt; scan
foo a:b [] c
user@myinstance filtertest&gt; sleep 4
user@myinstance filtertest&gt; scan
user@myinstance filtertest&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>To see the iterator settings for a table, use:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@example filtertest&gt; config -t filtertest -f iterator
---------+---------------------------------------------+------------------
SCOPE | NAME | VALUE
---------+---------------------------------------------+------------------
table | table.iterator.majc.myfilter .............. | 10,org.apache.accumulo.core.iterators.user.AgeOffFilter
table | table.iterator.majc.myfilter.opt.ttl ...... | 30000
table | table.iterator.majc.vers .................. | 20,org.apache.accumulo.core.iterators.VersioningIterator
table | table.iterator.majc.vers.opt.maxVersions .. | 1
table | table.iterator.minc.myfilter .............. | 10,org.apache.accumulo.core.iterators.user.AgeOffFilter
table | table.iterator.minc.myfilter.opt.ttl ...... | 30000
table | table.iterator.minc.vers .................. | 20,org.apache.accumulo.core.iterators.VersioningIterator
table | table.iterator.minc.vers.opt.maxVersions .. | 1
table | table.iterator.scan.myfilter .............. | 10,org.apache.accumulo.core.iterators.user.AgeOffFilter
table | table.iterator.scan.myfilter.opt.ttl ...... | 30000
table | table.iterator.scan.vers .................. | 20,org.apache.accumulo.core.iterators.VersioningIterator
table | table.iterator.scan.vers.opt.maxVersions .. | 1
---------+---------------------------------------------+------------------</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_combiners">6.4.5. Combiners</h4>
<div class="paragraph">
<p>Accumulo allows Combiners to be configured on tables and column
families. When a Combiner is set it is applied across the values
associated with any keys that share rowID, column family, and column qualifier.
This is similar to the reduce step in MapReduce, which applied some function to all
the values associated with a particular key.</p>
</div>
<div class="paragraph">
<p>For example, if a summing combiner were configured on a table and the following
mutations were inserted:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>Row Family Qualifier Timestamp Value
rowID1 colfA colqA 20100101 1
rowID1 colfA colqA 20100102 1</pre>
</div>
</div>
<div class="paragraph">
<p>The table would reflect only one aggregate value:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>rowID1 colfA colqA - 2</pre>
</div>
</div>
<div class="paragraph">
<p>Combiners can be enabled for a table using the setiter command in the shell. Below is an example.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@a14 perDayCounts&gt; setiter -t perDayCounts -p 10 -scan -minc -majc -n daycount
-class org.apache.accumulo.core.iterators.user.SummingCombiner
TypedValueCombiner can interpret Values as a variety of number encodings
(VLong, Long, or String) before combining
----------&gt; set SummingCombiner parameter columns,
&lt;col fam&gt;[:&lt;col qual&gt;]{,&lt;col fam&gt;[:&lt;col qual&gt;]} : day
----------&gt; set SummingCombiner parameter type, &lt;VARNUM|LONG|STRING&gt;: STRING
root@a14 perDayCounts&gt; insert foo day 20080101 1
root@a14 perDayCounts&gt; insert foo day 20080101 1
root@a14 perDayCounts&gt; insert foo day 20080103 1
root@a14 perDayCounts&gt; insert bar day 20080101 1
root@a14 perDayCounts&gt; insert bar day 20080101 1
root@a14 perDayCounts&gt; scan
bar day:20080101 [] 2
foo day:20080101 [] 2
foo day:20080103 [] 1</pre>
</div>
</div>
<div class="paragraph">
<p>Accumulo includes some useful Combiners out of the box. To find these look in
the <strong><code>org.apache.accumulo.core.iterators.user</code></strong> package.</p>
</div>
<div class="paragraph">
<p>Additional Combiners can be added by creating a Java class that extends
<code>org.apache.accumulo.core.iterators.Combiner</code> and adding a jar containing that
class to Accumulo&#8217;s lib/ext directory.</p>
</div>
<div class="paragraph">
<p>An example of a Combiner can be found under</p>
</div>
<div class="literalblock">
<div class="content">
<pre>accumulo/examples/simple/src/main/java/org/apache/accumulo/examples/simple/combiner/StatsCombiner.java</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_block_cache">6.5. Block Cache</h3>
<div class="paragraph">
<p>In order to increase throughput of commonly accessed entries, Accumulo employs a block cache.
This block cache buffers data in memory so that it doesn&#8217;t have to be read off of disk.
The RFile format that Accumulo prefers is a mix of index blocks and data blocks, where the index blocks are used to find the appropriate data blocks.
Typical queries to Accumulo result in a binary search over several index blocks followed by a linear scan of one or more data blocks.</p>
</div>
<div class="paragraph">
<p>The block cache can be configured on a per-table basis, and all tablets hosted on a tablet server share a single resource pool.
To configure the size of the tablet server&#8217;s block cache, set the following properties:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>tserver.cache.data.size: Specifies the size of the cache for file data blocks.
tserver.cache.index.size: Specifies the size of the cache for file indices.</pre>
</div>
</div>
<div class="paragraph">
<p>To enable the block cache for your table, set the following properties:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>table.cache.block.enable: Determines whether file (data) block cache is enabled.
table.cache.index.enable: Determines whether index cache is enabled.</pre>
</div>
</div>
<div class="paragraph">
<p>The block cache can have a significant effect on alleviating hot spots, as well as reducing query latency.
It is enabled by default for the metadata tables.</p>
</div>
</div>
<div class="sect2">
<h3 id="_compaction">6.6. Compaction</h3>
<div class="paragraph">
<p>As data is written to Accumulo it is buffered in memory. The data buffered in
memory is eventually written to HDFS on a per tablet basis. Files can also be
added to tablets directly by bulk import. In the background tablet servers run
major compactions to merge multiple files into one. The tablet server has to
decide which tablets to compact and which files within a tablet to compact.
This decision is made using the compaction ratio, which is configurable on a
per table basis. To configure this ratio modify the following property:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>table.compaction.major.ratio</pre>
</div>
</div>
<div class="paragraph">
<p>Increasing this ratio will result in more files per tablet and less compaction
work. More files per tablet means more higher query latency. So adjusting
this ratio is a trade off between ingest and query performance. The ratio
defaults to 3.</p>
</div>
<div class="paragraph">
<p>The way the ratio works is that a set of files is compacted into one file if the
sum of the sizes of the files in the set is larger than the ratio multiplied by
the size of the largest file in the set. If this is not true for the set of all
files in a tablet, the largest file is removed from consideration, and the
remaining files are considered for compaction. This is repeated until a
compaction is triggered or there are no files left to consider.</p>
</div>
<div class="paragraph">
<p>The number of background threads tablet servers use to run major compactions is
configurable. To configure this modify the following property:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>tserver.compaction.major.concurrent.max</pre>
</div>
</div>
<div class="paragraph">
<p>Also, the number of threads tablet servers use for minor compactions is
configurable. To configure this modify the following property:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>tserver.compaction.minor.concurrent.max</pre>
</div>
</div>
<div class="paragraph">
<p>The numbers of minor and major compactions running and queued is visible on the
Accumulo monitor page. This allows you to see if compactions are backing up
and adjustments to the above settings are needed. When adjusting the number of
threads available for compactions, consider the number of cores and other tasks
running on the nodes such as maps and reduces.</p>
</div>
<div class="paragraph">
<p>If major compactions are not keeping up, then the number of files per tablet
will grow to a point such that query performance starts to suffer. One way to
handle this situation is to increase the compaction ratio. For example, if the
compaction ratio were set to 1, then every new file added to a tablet by minor
compaction would immediately queue the tablet for major compaction. So if a
tablet has a 200M file and minor compaction writes a 1M file, then the major
compaction will attempt to merge the 200M and 1M file. If the tablet server
has lots of tablets trying to do this sort of thing, then major compactions
will back up and the number of files per tablet will start to grow, assuming
data is being continuously written. Increasing the compaction ratio will
alleviate backups by lowering the amount of major compaction work that needs to
be done.</p>
</div>
<div class="paragraph">
<p>Another option to deal with the files per tablet growing too large is to adjust
the following property:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>table.file.max</pre>
</div>
</div>
<div class="paragraph">
<p>When a tablet reaches this number of files and needs to flush its in-memory
data to disk, it will choose to do a merging minor compaction. A merging minor
compaction will merge the tablet&#8217;s smallest file with the data in memory at
minor compaction time. Therefore the number of files will not grow beyond this
limit. This will make minor compactions take longer, which will cause ingest
performance to decrease. This can cause ingest to slow down until major
compactions have enough time to catch up. When adjusting this property, also
consider adjusting the compaction ratio. Ideally, merging minor compactions
never need to occur and major compactions will keep up. It is possible to
configure the file max and compaction ratio such that only merging minor
compactions occur and major compactions never occur. This should be avoided
because doing only merging minor compactions causes O(<em>N</em><sup>2</sup>) work to be done.
The amount of work done by major compactions is O(<em>N</em>*log<sub><em>R</em></sub>(<em>N</em>)) where
<em>R</em> is the compaction ratio.</p>
</div>
<div class="paragraph">
<p>Compactions can be initiated manually for a table. To initiate a minor
compaction, use the flush command in the shell. To initiate a major compaction,
use the compact command in the shell. The compact command will compact all
tablets in a table to one file. Even tablets with one file are compacted. This
is useful for the case where a major compaction filter is configured for a
table. In 1.4 the ability to compact a range of a table was added. To use this
feature specify start and stop rows for the compact command. This will only
compact tablets that overlap the given row range.</p>
</div>
</div>
<div class="sect2">
<h3 id="_pre_splitting_tables">6.7. Pre-splitting tables</h3>
<div class="paragraph">
<p>Accumulo will balance and distribute tables across servers. Before a
table gets large, it will be maintained as a single tablet on a single
server. This limits the speed at which data can be added or queried
to the speed of a single node. To improve performance when the a table
is new, or small, you can add split points and generate new tablets.</p>
</div>
<div class="paragraph">
<p>In the shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; createtable newTable
root@myinstance&gt; addsplits -t newTable g n t</pre>
</div>
</div>
<div class="paragraph">
<p>This will create a new table with 4 tablets. The table will be split
on the letters &#8220;g&#8221;, &#8220;n&#8221;, and &#8220;t&#8221; which will work nicely if the
row data start with lower-case alphabetic characters. If your row
data includes binary information or numeric information, or if the
distribution of the row information is not flat, then you would pick
different split points. Now ingest and query can proceed on 4 nodes
which can improve performance.</p>
</div>
</div>
<div class="sect2">
<h3 id="_merging_tablets">6.8. Merging tablets</h3>
<div class="paragraph">
<p>Over time, a table can get very large, so large that it has hundreds
of thousands of split points. Once there are enough tablets to spread
a table across the entire cluster, additional splits may not improve
performance, and may create unnecessary bookkeeping. The distribution
of data may change over time. For example, if row data contains date
information, and data is continually added and removed to maintain a
window of current information, tablets for older rows may be empty.</p>
</div>
<div class="paragraph">
<p>Accumulo supports tablet merging, which can be used to reduce
the number of split points. The following command will merge all rows
from &#8220;A&#8221; to &#8220;Z&#8221; into a single tablet:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; merge -t myTable -s A -e Z</pre>
</div>
</div>
<div class="paragraph">
<p>If the result of a merge produces a tablet that is larger than the
configured split size, the tablet may be split by the tablet server.
Be sure to increase your tablet size prior to any merges if the goal
is to have larger tablets:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; config -t myTable -s table.split.threshold=2G</pre>
</div>
</div>
<div class="paragraph">
<p>In order to merge small tablets, you can ask Accumulo to merge
sections of a table smaller than a given size.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; merge -t myTable -s 100M</pre>
</div>
</div>
<div class="paragraph">
<p>By default, small tablets will not be merged into tablets that are
already larger than the given size. This can leave isolated small
tablets. To force small tablets to be merged into larger tablets use
the <code>--force</code> option:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; merge -t myTable -s 100M --force</pre>
</div>
</div>
<div class="paragraph">
<p>Merging away small tablets works on one section at a time. If your
table contains many sections of small split points, or you are
attempting to change the split size of the entire table, it will be
faster to set the split point and merge the entire table:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; config -t myTable -s table.split.threshold=256M
root@myinstance&gt; merge -t myTable</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_delete_range">6.9. Delete Range</h3>
<div class="paragraph">
<p>Consider an indexing scheme that uses date information in each row.
For example &#8220;20110823-15:20:25.013&#8221; might be a row that specifies a
date and time. In some cases, we might like to delete rows based on
this date, say to remove all the data older than the current year.
Accumulo supports a delete range operation which efficiently
removes data between two rows. For example:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; deleterange -t myTable -s 2010 -e 2011</pre>
</div>
</div>
<div class="paragraph">
<p>This will delete all rows starting with &#8220;2010&#8221; and it will stop at
any row starting &#8220;2011&#8221;. You can delete any data prior to 2011
with:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>root@myinstance&gt; deleterange -t myTable -e 2011 --force</pre>
</div>
</div>
<div class="paragraph">
<p>The shell will not allow you to delete an unbounded range (no start)
unless you provide the <code>--force</code> option.</p>
</div>
<div class="paragraph">
<p>Range deletion is implemented using splits at the given start/end
positions, and will affect the number of splits in the table.</p>
</div>
</div>
<div class="sect2">
<h3 id="_cloning_tables">6.10. Cloning Tables</h3>
<div class="paragraph">
<p>A new table can be created that points to an existing table&#8217;s data. This is a
very quick metadata operation, no data is actually copied. The cloned table
and the source table can change independently after the clone operation. One
use case for this feature is testing. For example to test a new filtering
iterator, clone the table, add the filter to the clone, and force a major
compaction. To perform a test on less data, clone a table and then use delete
range to efficiently remove a lot of data from the clone. Another use case is
generating a snapshot to guard against human error. To create a snapshot,
clone a table and then disable write permissions on the clone.</p>
</div>
<div class="paragraph">
<p>The clone operation will point to the source table&#8217;s files. This is why the
flush option is present and is enabled by default in the shell. If the flush
option is not enabled, then any data the source table currently has in memory
will not exist in the clone.</p>
</div>
<div class="paragraph">
<p>A cloned table copies the configuration of the source table. However the
permissions of the source table are not copied to the clone. After a clone is
created, only the user that created the clone can read and write to it.</p>
</div>
<div class="paragraph">
<p>In the following example we see that data inserted after the clone operation is
not visible in the clone.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@a14&gt; createtable people
root@a14 people&gt; insert 890435 name last Doe
root@a14 people&gt; insert 890435 name first John
root@a14 people&gt; clonetable people test
root@a14 people&gt; insert 890436 name first Jane
root@a14 people&gt; insert 890436 name last Doe
root@a14 people&gt; scan
890435 name:first [] John
890435 name:last [] Doe
890436 name:first [] Jane
890436 name:last [] Doe
root@a14 people&gt; table test
root@a14 test&gt; scan
890435 name:first [] John
890435 name:last [] Doe
root@a14 test&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>The du command in the shell shows how much space a table is using in HDFS.
This command can also show how much overlapping space two cloned tables have in
HDFS. In the example below du shows table ci is using 428M. Then ci is cloned
to cic and du shows that both tables share 428M. After three entries are
inserted into cic and its flushed, du shows the two tables still share 428M but
cic has 226 bytes to itself. Finally, table cic is compacted and then du shows
that each table uses 428M.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@a14&gt; du ci
428,482,573 [ci]
root@a14&gt; clonetable ci cic
root@a14&gt; du ci cic
428,482,573 [ci, cic]
root@a14&gt; table cic
root@a14 cic&gt; insert r1 cf1 cq1 v1
root@a14 cic&gt; insert r1 cf1 cq2 v2
root@a14 cic&gt; insert r1 cf1 cq3 v3
root@a14 cic&gt; flush -t cic -w
27 15:00:13,908 [shell.Shell] INFO : Flush of table cic completed.
root@a14 cic&gt; du ci cic
428,482,573 [ci, cic]
226 [cic]
root@a14 cic&gt; compact -t cic -w
27 15:00:35,871 [shell.Shell] INFO : Compacting table ...
27 15:03:03,303 [shell.Shell] INFO : Compaction of table cic completed for given range
root@a14 cic&gt; du ci cic
428,482,573 [ci]
428,482,612 [cic]
root@a14 cic&gt;</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_exporting_tables">6.11. Exporting Tables</h3>
<div class="paragraph">
<p>Accumulo supports exporting tables for the purpose of copying tables to another
cluster. Exporting and importing tables preserves the tables configuration,
splits, and logical time. Tables are exported and then copied via the hadoop
distcp command. To export a table, it must be offline and stay offline while
discp runs. The reason it needs to stay offline is to prevent files from being
deleted. A table can be cloned and the clone taken offline inorder to avoid
losing access to the table. See <code>docs/examples/README.export</code> for an example.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_table_design">7. Table Design</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_basic_table">7.1. Basic Table</h3>
<div class="paragraph">
<p>Since Accumulo tables are sorted by row ID, each table can be thought of as being
indexed by the row ID. Lookups performed by row ID can be executed quickly, by doing
a binary search, first across the tablets, and then within a tablet. Clients should
choose a row ID carefully in order to support their desired application. A simple rule
is to select a unique identifier as the row ID for each entity to be stored and assign
all the other attributes to be tracked to be columns under this row ID. For example,
if we have the following data in a comma-separated file:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>userid,age,address,account-balance</pre>
</div>
</div>
<div class="paragraph">
<p>We might choose to store this data using the userid as the rowID, the column
name in the column family, and a blank column qualifier:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Mutation m = new Mutation(userid);
final String column_qualifier = "";
m.put("age", column_qualifier, age);
m.put("address", column_qualifier, address);
m.put("balance", column_qualifier, account_balance);
writer.add(m);</code></pre>
</div>
</div>
<div class="paragraph">
<p>We could then retrieve any of the columns for a specific userid by specifying the
userid as the range of a scanner and fetching specific columns:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Range r = new Range(userid, userid); // single row
Scanner s = conn.createScanner("userdata", auths);
s.setRange(r);
s.fetchColumnFamily(new Text("age"));
for(Entry&lt;Key,Value&gt; entry : s) {
System.out.println(entry.getValue().toString());
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_rowid_design">7.2. RowID Design</h3>
<div class="paragraph">
<p>Often it is necessary to transform the rowID in order to have rows ordered in a way
that is optimal for anticipated access patterns. A good example of this is reversing
the order of components of internet domain names in order to group rows of the
same parent domain together:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>com.google.code
com.google.labs
com.google.mail
com.yahoo.mail
com.yahoo.research</pre>
</div>
</div>
<div class="paragraph">
<p>Some data may result in the creation of very large rows - rows with many columns.
In this case the table designer may wish to split up these rows for better load
balancing while keeping them sorted together for scanning purposes. This can be
done by appending a random substring at the end of the row:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>com.google.code_00
com.google.code_01
com.google.code_02
com.google.labs_00
com.google.mail_00
com.google.mail_01</pre>
</div>
</div>
<div class="paragraph">
<p>It could also be done by adding a string representation of some period of time such as date to the week
or month:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>com.google.code_201003
com.google.code_201004
com.google.code_201005
com.google.labs_201003
com.google.mail_201003
com.google.mail_201004</pre>
</div>
</div>
<div class="paragraph">
<p>Appending dates provides the additional capability of restricting a scan to a given
date range.</p>
</div>
</div>
<div class="sect2">
<h3 id="_lexicoders">7.3. Lexicoders</h3>
<div class="paragraph">
<p>Since Keys in Accumulo are sorted lexicographically by default, it&#8217;s often useful to encode
common data types into a byte format in which their sort order corresponds to the sort order
in their native form. An example of this is encoding dates and numerical data so that they can
be better seeked or searched in ranges.</p>
</div>
<div class="paragraph">
<p>The lexicoders are a standard and extensible way of encoding Java types. Here&#8217;s an example
of a lexicoder that encodes a java Date object so that it sorts lexicographically:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// create new date lexicoder
DateLexicoder dateEncoder = new DateLexicoder();
// truncate time to hours
long epoch = System.currentTimeMillis();
Date hour = new Date(epoch - (epoch % 3600000));
// encode the rowId so that it is sorted lexicographically
Mutation mutation = new Mutation(dateEncoder.encode(hour));
mutation.put(new Text("colf"), new Text("colq"), new Value(new byte[]{}));</code></pre>
</div>
</div>
<div class="paragraph">
<p>If we want to return the most recent date first, we can reverse the sort order
with the reverse lexicoder:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// create new date lexicoder and reverse lexicoder
DateLexicoder dateEncoder = new DateLexicoder();
ReverseLexicoder reverseEncoder = new ReverseLexicoder(dateEncoder);
// truncate date to hours
long epoch = System.currentTimeMillis();
Date hour = new Date(epoch - (epoch % 3600000));
// encode the rowId so that it sorts in reverse lexicographic order
Mutation mutation = new Mutation(reverseEncoder.encode(hour));
mutation.put(new Text("colf"), new Text("colq"), new Value(new byte[]{}));</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_indexing">7.4. Indexing</h3>
<div class="paragraph">
<p>In order to support lookups via more than one attribute of an entity, additional
indexes can be built. However, because Accumulo tables can support any number of
columns without specifying them beforehand, a single additional index will often
suffice for supporting lookups of records in the main table. Here, the index has, as
the rowID, the Value or Term from the main table, the column families are the same,
and the column qualifier of the index table contains the rowID from the main table.</p>
</div>
<table class="tableblock frame-all grid-rows" style="width:75%; ">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">RowID</th>
<th class="tableblock halign-center valign-top">Column Family</th>
<th class="tableblock halign-center valign-top">Column Qualifier</th>
<th class="tableblock halign-center valign-top">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">Term</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Field Name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">MainRowID</p></td>
<td class="tableblock halign-center valign-top"></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Note: We store rowIDs in the column qualifier rather than the Value so that we can
have more than one rowID associated with a particular term within the index. If we
stored this in the Value we would only see one of the rows in which the value
appears since Accumulo is configured by default to return the one most recent
value associated with a key.</p>
</div>
<div class="paragraph">
<p>Lookups can then be done by scanning the Index Table first for occurrences of the
desired values in the columns specified, which returns a list of row ID from the main
table. These can then be used to retrieve each matching record, in their entirety, or a
subset of their columns, from the Main Table.</p>
</div>
<div class="paragraph">
<p>To support efficient lookups of multiple rowIDs from the same table, the Accumulo
client library provides a BatchScanner. Users specify a set of Ranges to the
BatchScanner, which performs the lookups in multiple threads to multiple servers
and returns an Iterator over all the rows retrieved. The rows returned are NOT in
sorted order, as is the case with the basic Scanner interface.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// first we scan the index for IDs of rows matching our query
Text term = new Text("mySearchTerm");
HashSet&lt;Range&gt; matchingRows = new HashSet&lt;Range&gt;();
Scanner indexScanner = createScanner("index", auths);
indexScanner.setRange(new Range(term, term));
// we retrieve the matching rowIDs and create a set of ranges
for(Entry&lt;Key,Value&gt; entry : indexScanner) {
matchingRows.add(new Range(entry.getKey().getColumnQualifier()));
}
// now we pass the set of rowIDs to the batch scanner to retrieve them
BatchScanner bscan = conn.createBatchScanner("table", auths, 10);
bscan.setRanges(matchingRows);
bscan.fetchColumnFamily(new Text("attributes"));
for(Entry&lt;Key,Value&gt; entry : bscan) {
System.out.println(entry.getValue());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>One advantage of the dynamic schema capabilities of Accumulo is that different
fields may be indexed into the same physical table. However, it may be necessary to
create different index tables if the terms must be formatted differently in order to
maintain proper sort order. For example, real numbers must be formatted
differently than their usual notation in order to be sorted correctly. In these cases,
usually one index per unique data type will suffice.</p>
</div>
</div>
<div class="sect2">
<h3 id="_entity_attribute_and_graph_tables">7.5. Entity-Attribute and Graph Tables</h3>
<div class="paragraph">
<p>Accumulo is ideal for storing entities and their attributes, especially of the
attributes are sparse. It is often useful to join several datasets together on common
entities within the same table. This can allow for the representation of graphs,
including nodes, their attributes, and connections to other nodes.</p>
</div>
<div class="paragraph">
<p>Rather than storing individual events, Entity-Attribute or Graph tables store
aggregate information about the entities involved in the events and the
relationships between entities. This is often preferrable when single events aren&#8217;t
very useful and when a continuously updated summarization is desired.</p>
</div>
<div class="paragraph">
<p>The physical schema for an entity-attribute or graph table is as follows:</p>
</div>
<table class="tableblock frame-all grid-rows" style="width:75%; ">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">RowID</th>
<th class="tableblock halign-center valign-top">Column Family</th>
<th class="tableblock halign-center valign-top">Column Qualifier</th>
<th class="tableblock halign-center valign-top">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">EntityID</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Attribute Name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Attribute Value</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Weight</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">EntityID</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Edge Type</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Related EntityID</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Weight</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>For example, to keep track of employees, managers and products the following
entity-attribute table could be used. Note that the weights are not always necessary
and are set to 0 when not used.</p>
</div>
<table class="tableblock frame-all grid-rows" style="width:75%; ">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">RowID</th>
<th class="tableblock halign-center valign-top">Column Family</th>
<th class="tableblock halign-center valign-top">Column Qualifier</th>
<th class="tableblock halign-center valign-top">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">bob</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">department</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">sales</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">hire_date</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">20030102</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">units_sold</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">780</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">george</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">department</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">sales</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">manager_of</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">E001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">manager_of</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">harry</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">department</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">accounts_recv</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">hire_date</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">20000405</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">units_sold</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">P002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">566</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">E003</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">units_sold</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">232</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">product_name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">nike_airs</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">product_type</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">shoe</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">in_stock</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">germany</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">900</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P001</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">in_stock</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">brazil</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">200</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">product_name</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">basic_jacket</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">product_type</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">clothing</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">in_stock</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">usa</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">3454</p></td>
</tr>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">P002</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">in_stock</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">germany</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">700</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>To allow efficient updating of edge weights, an aggregating iterator can be
configured to add the value of all mutations applied with the same key. These types
of tables can easily be created from raw events by simply extracting the entities,
attributes, and relationships from individual events and inserting the keys into
Accumulo each with a count of 1. The aggregating iterator will take care of
maintaining the edge weights.</p>
</div>
</div>
<div class="sect2">
<h3 id="_document_partitioned_indexing">7.6. Document-Partitioned Indexing</h3>
<div class="paragraph">
<p>Using a simple index as described above works well when looking for records that
match one of a set of given criteria. When looking for records that match more than
one criterion simultaneously, such as when looking for documents that contain all of
the words &#8216;the&#8217; and &#8216;white&#8217; and &#8216;house&#8217;, there are several issues.</p>
</div>
<div class="paragraph">
<p>First is that the set of all records matching any one of the search terms must be sent
to the client, which incurs a lot of network traffic. The second problem is that the
client is responsible for performing set intersection on the sets of records returned
to eliminate all but the records matching all search terms. The memory of the client
may easily be overwhelmed during this operation.</p>
</div>
<div class="paragraph">
<p>For these reasons Accumulo includes support for a scheme known as sharded
indexing, in which these set operations can be performed at the TabletServers and
decisions about which records to include in the result set can be made without
incurring network traffic.</p>
</div>
<div class="paragraph">
<p>This is accomplished via partitioning records into bins that each reside on at most
one TabletServer, and then creating an index of terms per record within each bin as
follows:</p>
</div>
<table class="tableblock frame-all grid-rows" style="width:75%; ">
<colgroup>
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
<col style="width:25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">RowID</th>
<th class="tableblock halign-center valign-top">Column Family</th>
<th class="tableblock halign-center valign-top">Column Qualifier</th>
<th class="tableblock halign-center valign-top">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">BinID</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Term</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">DocID</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Weight</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Documents or records are mapped into bins by a user-defined ingest application. By
storing the BinID as the RowID we ensure that all the information for a particular
bin is contained in a single tablet and hosted on a single TabletServer since
Accumulo never splits rows across tablets. Storing the Terms as column families
serves to enable fast lookups of all the documents within this bin that contain the
given term.</p>
</div>
<div class="paragraph">
<p>Finally, we perform set intersection operations on the TabletServer via a special
iterator called the Intersecting Iterator. Since documents are partitioned into many
bins, a search of all documents must search every bin. We can use the BatchScanner
to scan all bins in parallel. The Intersecting Iterator should be enabled on a
BatchScanner within user query code as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Text[] terms = {new Text("the"), new Text("white"), new Text("house")};
BatchScanner bscan = conn.createBatchScanner(table, auths, 20);
IteratorSetting iter = new IteratorSetting(20, "ii", IntersectingIterator.class);
IntersectingIterator.setColumnFamilies(iter, terms);
bscan.addScanIterator(iter);
bscan.setRanges(Collections.singleton(new Range()));
for(Entry&lt;Key,Value&gt; entry : bscan) {
System.out.println(" " + entry.getKey().getColumnQualifier());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>This code effectively has the BatchScanner scan all tablets of a table, looking for
documents that match all the given terms. Because all tablets are being scanned for
every query, each query is more expensive than other Accumulo scans, which
typically involve a small number of TabletServers. This reduces the number of
concurrent queries supported and is subject to what is known as the &#8216;straggler&#8217;
problem in which every query runs as slow as the slowest server participating.</p>
</div>
<div class="paragraph">
<p>Of course, fast servers will return their results to the client which can display them
to the user immediately while they wait for the rest of the results to arrive. If the
results are unordered this is quite effective as the first results to arrive are as good
as any others to the user.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_high_speed_ingest">8. High-Speed Ingest</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Accumulo is often used as part of a larger data processing and storage system. To
maximize the performance of a parallel system involving Accumulo, the ingestion
and query components should be designed to provide enough parallelism and
concurrency to avoid creating bottlenecks for users and other systems writing to
and reading from Accumulo. There are several ways to achieve high ingest
performance.</p>
</div>
<div class="sect2">
<h3 id="_pre_splitting_new_tables">8.1. Pre-Splitting New Tables</h3>
<div class="paragraph">
<p>New tables consist of a single tablet by default. As mutations are applied, the table
grows and splits into multiple tablets which are balanced by the Master across
TabletServers. This implies that the aggregate ingest rate will be limited to fewer
servers than are available within the cluster until the table has reached the point
where there are tablets on every TabletServer.</p>
</div>
<div class="paragraph">
<p>Pre-splitting a table ensures that there are as many tablets as desired available
before ingest begins to take advantage of all the parallelism possible with the cluster
hardware. Tables can be split at any time by using the shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; addsplits -sf /local_splitfile -t mytable</pre>
</div>
</div>
<div class="paragraph">
<p>For the purposes of providing parallelism to ingest it is not necessary to create more
tablets than there are physical machines within the cluster as the aggregate ingest
rate is a function of the number of physical machines. Note that the aggregate ingest
rate is still subject to the number of machines running ingest clients, and the
distribution of rowIDs across the table. The aggregation ingest rate will be
suboptimal if there are many inserts into a small number of rowIDs.</p>
</div>
</div>
<div class="sect2">
<h3 id="_multiple_ingester_clients">8.2. Multiple Ingester Clients</h3>
<div class="paragraph">
<p>Accumulo is capable of scaling to very high rates of ingest, which is dependent upon
not just the number of TabletServers in operation but also the number of ingest
clients. This is because a single client, while capable of batching mutations and
sending them to all TabletServers, is ultimately limited by the amount of data that
can be processed on a single machine. The aggregate ingest rate will scale linearly
with the number of clients up to the point at which either the aggregate I/O of
TabletServers or total network bandwidth capacity is reached.</p>
</div>
<div class="paragraph">
<p>In operational settings where high rates of ingest are paramount, clusters are often
configured to dedicate some number of machines solely to running Ingester Clients.
The exact ratio of clients to TabletServers necessary for optimum ingestion rates
will vary according to the distribution of resources per machine and by data type.</p>
</div>
</div>
<div class="sect2">
<h3 id="_bulk_ingest">8.3. Bulk Ingest</h3>
<div class="paragraph">
<p>Accumulo supports the ability to import files produced by an external process such
as MapReduce into an existing table. In some cases it may be faster to load data this
way rather than via ingesting through clients using BatchWriters. This allows a large
number of machines to format data the way Accumulo expects. The new files can
then simply be introduced to Accumulo via a shell command.</p>
</div>
<div class="paragraph">
<p>To configure MapReduce to format data in preparation for bulk loading, the job
should be set to use a range partitioner instead of the default hash partitioner. The
range partitioner uses the split points of the Accumulo table that will receive the
data. The split points can be obtained from the shell and used by the MapReduce
RangePartitioner. Note that this is only useful if the existing table is already split
into multiple tablets.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; getsplits
aa
ab
ac
...
zx
zy
zz</pre>
</div>
</div>
<div class="paragraph">
<p>Run the MapReduce job, using the AccumuloFileOutputFormat to create the files to
be introduced to Accumulo. Once this is complete, the files can be added to
Accumulo via the shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@myinstance mytable&gt; importdirectory /files_dir /failures</pre>
</div>
</div>
<div class="paragraph">
<p>Note that the paths referenced are directories within the same HDFS instance over
which Accumulo is running. Accumulo places any files that failed to be added to the
second directory specified.</p>
</div>
<div class="paragraph">
<p>A complete example of using Bulk Ingest can be found at
<code>accumulo/docs/examples/README.bulkIngest</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_logical_time_for_bulk_ingest">8.4. Logical Time for Bulk Ingest</h3>
<div class="paragraph">
<p>Logical time is important for bulk imported data, for which the client code may
be choosing a timestamp. At bulk import time, the user can choose to enable
logical time for the set of files being imported. When its enabled, Accumulo
uses a specialized system iterator to lazily set times in a bulk imported file.
This mechanism guarantees that times set by unsynchronized multi-node
applications (such as those running on MapReduce) will maintain some semblance
of causal ordering. This mitigates the problem of the time being wrong on the
system that created the file for bulk import. These times are not set when the
file is imported, but whenever it is read by scans or compactions. At import, a
time is obtained and always used by the specialized system iterator to set that
time.</p>
</div>
<div class="paragraph">
<p>The timestamp assigned by Accumulo will be the same for every key in the file.
This could cause problems if the file contains multiple keys that are identical
except for the timestamp. In this case, the sort order of the keys will be
undefined. This could occur if an insert and an update were in the same bulk
import file.</p>
</div>
</div>
<div class="sect2">
<h3 id="_mapreduce_ingest">8.5. MapReduce Ingest</h3>
<div class="paragraph">
<p>It is possible to efficiently write many mutations to Accumulo in parallel via a
MapReduce job. In this scenario the MapReduce is written to process data that lives
in HDFS and write mutations to Accumulo using the AccumuloOutputFormat. See
the MapReduce section under Analytics for details.</p>
</div>
<div class="paragraph">
<p>An example of using MapReduce can be found under
<code>accumulo/docs/examples/README.mapred</code>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_analytics">9. Analytics</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Accumulo supports more advanced data processing than simply keeping keys
sorted and performing efficient lookups. Analytics can be developed by using
MapReduce and Iterators in conjunction with Accumulo tables.</p>
</div>
<div class="sect2">
<h3 id="_mapreduce">9.1. MapReduce</h3>
<div class="paragraph">
<p>Accumulo tables can be used as the source and destination of MapReduce jobs. To
use an Accumulo table with a MapReduce job (specifically with the new Hadoop API
as of version 0.20), configure the job parameters to use the AccumuloInputFormat
and AccumuloOutputFormat. Accumulo specific parameters can be set via these
two format classes to do the following:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Authenticate and provide user credentials for the input</p>
</li>
<li>
<p>Restrict the scan to a range of rows</p>
</li>
<li>
<p>Restrict the input to a subset of available columns</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="_mapper_and_reducer_classes">9.1.1. Mapper and Reducer classes</h4>
<div class="paragraph">
<p>To read from an Accumulo table create a Mapper with the following class
parameterization and be sure to configure the AccumuloInputFormat.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">class MyMapper extends Mapper&lt;Key,Value,WritableComparable,Writable&gt; {
public void map(Key k, Value v, Context c) {
// transform key and value data here
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>To write to an Accumulo table, create a Reducer with the following class
parameterization and be sure to configure the AccumuloOutputFormat. The key
emitted from the Reducer identifies the table to which the mutation is sent. This
allows a single Reducer to write to more than one table if desired. A default table
can be configured using the AccumuloOutputFormat, in which case the output table
name does not have to be passed to the Context object within the Reducer.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">class MyReducer extends Reducer&lt;WritableComparable, Writable, Text, Mutation&gt; {
public void reduce(WritableComparable key, Iterable&lt;Text&gt; values, Context c) {
Mutation m;
// create the mutation based on input key and value
c.write(new Text("output-table"), m);
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The Text object passed as the output should contain the name of the table to which
this mutation should be applied. The Text can be null in which case the mutation
will be applied to the default table name specified in the AccumuloOutputFormat
options.</p>
</div>
</div>
<div class="sect3">
<h4 id="_accumuloinputformat_options">9.1.2. AccumuloInputFormat options</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Job job = new Job(getConf());
AccumuloInputFormat.setInputInfo(job,
"user",
"passwd".getBytes(),
"table",
new Authorizations());
AccumuloInputFormat.setZooKeeperInstance(job, "myinstance",
"zooserver-one,zooserver-two");</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Optional Settings:</strong></p>
</div>
<div class="paragraph">
<p>To restrict Accumulo to a set of row ranges:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">ArrayList&lt;Range&gt; ranges = new ArrayList&lt;Range&gt;();
// populate array list of row ranges ...
AccumuloInputFormat.setRanges(job, ranges);</code></pre>
</div>
</div>
<div class="paragraph">
<p>To restrict Accumulo to a list of columns:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">ArrayList&lt;Pair&lt;Text,Text&gt;&gt; columns = new ArrayList&lt;Pair&lt;Text,Text&gt;&gt;();
// populate list of columns
AccumuloInputFormat.fetchColumns(job, columns);</code></pre>
</div>
</div>
<div class="paragraph">
<p>To use a regular expression to match row IDs:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">IteratorSetting is = new IteratorSetting(30, RexExFilter.class);
RegExFilter.setRegexs(is, ".*suffix", null, null, null, true);
AccumuloInputFormat.addIterator(job, is);</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_accumulomultitableinputformat_options">9.1.3. AccumuloMultiTableInputFormat options</h4>
<div class="paragraph">
<p>The AccumuloMultiTableInputFormat allows the scanning over multiple tables
in a single MapReduce job. Separate ranges, columns, and iterators can be
used for each table.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">InputTableConfig tableOneConfig = new InputTableConfig();
InputTableConfig tableTwoConfig = new InputTableConfig();</code></pre>
</div>
</div>
<div class="paragraph">
<p>To set the configuration objects on the job:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Map&lt;String, InputTableConfig&gt; configs = new HashMap&lt;String,InputTableConfig&gt;();
configs.put("table1", tableOneConfig);
configs.put("table2", tableTwoConfig);
AccumuloMultiTableInputFormat.setInputTableConfigs(job, configs);</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Optional settings:</strong></p>
</div>
<div class="paragraph">
<p>To restrict to a set of ranges:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">ArrayList&lt;Range&gt; tableOneRanges = new ArrayList&lt;Range&gt;();
ArrayList&lt;Range&gt; tableTwoRanges = new ArrayList&lt;Range&gt;();
// populate array lists of row ranges for tables...
tableOneConfig.setRanges(tableOneRanges);
tableTwoConfig.setRanges(tableTwoRanges);</code></pre>
</div>
</div>
<div class="paragraph">
<p>To restrict Accumulo to a list of columns:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">ArrayList&lt;Pair&lt;Text,Text&gt;&gt; tableOneColumns = new ArrayList&lt;Pair&lt;Text,Text&gt;&gt;();
ArrayList&lt;Pair&lt;Text,Text&gt;&gt; tableTwoColumns = new ArrayList&lt;Pair&lt;Text,Text&gt;&gt;();
// populate lists of columns for each of the tables ...
tableOneConfig.fetchColumns(tableOneColumns);
tableTwoConfig.fetchColumns(tableTwoColumns);</code></pre>
</div>
</div>
<div class="paragraph">
<p>To set scan iterators:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">List&lt;IteratorSetting&gt; tableOneIterators = new ArrayList&lt;IteratorSetting&gt;();
List&lt;IteratorSetting&gt; tableTwoIterators = new ArrayList&lt;IteratorSetting&gt;();
// populate the lists of iterator settings for each of the tables ...
tableOneConfig.setIterators(tableOneIterators);
tableTwoConfig.setIterators(tableTwoIterators);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The name of the table can be retrieved from the input split:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">class MyMapper extends Mapper&lt;Key,Value,WritableComparable,Writable&gt; {
public void map(Key k, Value v, Context c) {
RangeInputSplit split = (RangeInputSplit)c.getInputSplit();
String tableName = split.getTableName();
// do something with table name
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_accumulooutputformat_options">9.1.4. AccumuloOutputFormat options</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">boolean createTables = true;
String defaultTable = "mytable";
AccumuloOutputFormat.setOutputInfo(job,
"user",
"passwd".getBytes(),
createTables,
defaultTable);
AccumuloOutputFormat.setZooKeeperInstance(job, "myinstance",
"zooserver-one,zooserver-two");</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Optional Settings:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">AccumuloOutputFormat.setMaxLatency(job, 300000); // milliseconds
AccumuloOutputFormat.setMaxMutationBufferSize(job, 50000000); // bytes</code></pre>
</div>
</div>
<div class="paragraph">
<p>An example of using MapReduce with Accumulo can be found at
<code>accumulo/docs/examples/README.mapred</code>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_combiners_2">9.2. Combiners</h3>
<div class="paragraph">
<p>Many applications can benefit from the ability to aggregate values across common
keys. This can be done via Combiner iterators and is similar to the Reduce step in
MapReduce. This provides the ability to define online, incrementally updated
analytics without the overhead or latency associated with batch-oriented
MapReduce jobs.</p>
</div>
<div class="paragraph">
<p>All that is needed to aggregate values of a table is to identify the fields over which
values will be grouped, insert mutations with those fields as the key, and configure
the table with a combining iterator that supports the summarizing operation
desired.</p>
</div>
<div class="paragraph">
<p>The only restriction on an combining iterator is that the combiner developer
should not assume that all values for a given key have been seen, since new
mutations can be inserted at anytime. This precludes using the total number of
values in the aggregation such as when calculating an average, for example.</p>
</div>
<div class="sect3">
<h4 id="_feature_vectors">9.2.1. Feature Vectors</h4>
<div class="paragraph">
<p>An interesting use of combining iterators within an Accumulo table is to store
feature vectors for use in machine learning algorithms. For example, many
algorithms such as k-means clustering, support vector machines, anomaly detection,
etc. use the concept of a feature vector and the calculation of distance metrics to
learn a particular model. The columns in an Accumulo table can be used to efficiently
store sparse features and their weights to be incrementally updated via the use of an
combining iterator.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_statistical_modeling">9.3. Statistical Modeling</h3>
<div class="paragraph">
<p>Statistical models that need to be updated by many machines in parallel could be
similarly stored within an Accumulo table. For example, a MapReduce job that is
iteratively updating a global statistical model could have each map or reduce worker
reference the parts of the model to be read and updated through an embedded
Accumulo client.</p>
</div>
<div class="paragraph">
<p>Using Accumulo this way enables efficient and fast lookups and updates of small
pieces of information in a random access pattern, which is complementary to
MapReduce&#8217;s sequential access model.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_security">10. Security</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Accumulo extends the BigTable data model to implement a security mechanism
known as cell-level security. Every key-value pair has its own security label, stored
under the column visibility element of the key, which is used to determine whether
a given user meets the security requirements to read the value. This enables data of
various security levels to be stored within the same row, and users of varying
degrees of access to query the same table, while preserving data confidentiality.</p>
</div>
<div class="sect2">
<h3 id="_security_label_expressions">10.1. Security Label Expressions</h3>
<div class="paragraph">
<p>When mutations are applied, users can specify a security label for each value. This is
done as the Mutation is created by passing a ColumnVisibility object to the put()
method:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Text rowID = new Text("row1");
Text colFam = new Text("myColFam");
Text colQual = new Text("myColQual");
ColumnVisibility colVis = new ColumnVisibility("public");
long timestamp = System.currentTimeMillis();
Value value = new Value("myValue");
Mutation mutation = new Mutation(rowID);
mutation.put(colFam, colQual, colVis, timestamp, value);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_security_label_expression_syntax">10.2. Security Label Expression Syntax</h3>
<div class="paragraph">
<p>Security labels consist of a set of user-defined tokens that are required to read the
value the label is associated with. The set of tokens required can be specified using
syntax that supports logical AND <code>&</code> and OR <code>|</code> combinations of tokens, as well as nesting
groups <code>()</code> of tokens together.</p>
</div>
<div class="paragraph">
<p>Each term is comprised of one to many alpha-numeric characters, hyphens, underscores
or periods. Optionally, each term may be wrapped in quotation marks which removes the
restriction on valid characters. In quoted terms, quotation marks and backslash characters
can be used as characters in the term by escaping them with a backslash.</p>
</div>
<div class="paragraph">
<p>For example, suppose within our organization we want to label our data values with
security labels defined in terms of user roles. We might have tokens such as:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>admin
audit
system</pre>
</div>
</div>
<div class="paragraph">
<p>These can be specified alone or combined using logical operators:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>// Users must have admin privileges
admin
// Users must have admin and audit privileges
admin&amp;audit
// Users with either admin or audit privileges
admin|audit
// Users must have audit and one or both of admin or system
(admin|system)&amp;audit</pre>
</div>
</div>
<div class="paragraph">
<p>When both <code>|</code> and <code>&amp;</code> operators are used, parentheses must be used to specify
precedence of the operators.</p>
</div>
</div>
<div class="sect2">
<h3 id="_authorization">10.3. Authorization</h3>
<div class="paragraph">
<p>When clients attempt to read data from Accumulo, any security labels present are
examined against the set of authorizations passed by the client code when the
Scanner or BatchScanner are created. If the authorizations are determined to be
insufficient to satisfy the security label, the value is suppressed from the set of
results sent back to the client.</p>
</div>
<div class="paragraph">
<p>Authorizations are specified as a comma-separated list of tokens the user possesses:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">// user possesses both admin and system level access
Authorization auths = new Authorization("admin","system");
Scanner s = connector.createScanner("table", auths);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_user_authorizations">10.4. User Authorizations</h3>
<div class="paragraph">
<p>Each Accumulo user has a set of associated security labels. To manipulate
these in the shell while using the default authorizor, use the setuaths and getauths commands.
These may also be modified for the default authorizor using the java security operations API.</p>
</div>
<div class="paragraph">
<p>When a user creates a scanner a set of Authorizations is passed. If the
authorizations passed to the scanner are not a subset of the users
authorizations, then an exception will be thrown.</p>
</div>
<div class="paragraph">
<p>To prevent users from writing data they can not read, add the visibility
constraint to a table. Use the -evc option in the createtable shell command to
enable this constraint. For existing tables use the following shell command to
enable the visibility constraint. Ensure the constraint number does not
conflict with any existing constraints.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>config -t table -s table.constraint.1=org.apache.accumulo.core.security.VisibilityConstraint</pre>
</div>
</div>
<div class="paragraph">
<p>Any user with the alter table permission can add or remove this constraint.
This constraint is not applied to bulk imported data, if this a concern then
disable the bulk import permission.</p>
</div>
</div>
<div class="sect2">
<h3 id="_pluggable_security">10.5. Pluggable Security</h3>
<div class="paragraph">
<p>New in 1.5 of Accumulo is a pluggable security mechanism. It can be broken into three actions&#8201;&#8212;&#8201;authentication, authorization, and permission handling. By default all of these are handled in
Zookeeper, which is how things were handled in Accumulo 1.4 and before. It is worth noting at this
point, that it is a new feature in 1.5 and may be adjusted in future releases without the standard
deprecation cycle.</p>
</div>
<div class="paragraph">
<p>Authentication simply handles the ability for a user to verify their integrity. A combination of
principal and authentication token are used to verify a user is who they say they are. An
authentication token should be constructed, either directly through its constructor, but it is
advised to use the <code>init(Property)</code> method to populate an authentication token. It is expected that a
user knows what the appropriate token to use for their system is. The default token is
<code>PasswordToken</code>.</p>
</div>
<div class="paragraph">
<p>Once a user is authenticated by the Authenticator, the user has access to the other actions within
Accumulo. All actions in Accumulo are ACLed, and this ACL check is handled by the Permission
Handler. This is what manages all of the permissions, which are divided in system and per table
level. From there, if a user is doing an action which requires authorizations, the Authorizor is
queried to determine what authorizations the user has.</p>
</div>
<div class="paragraph">
<p>This setup allows a variety of different mechanisms to be used for handling different aspects of
Accumulo&#8217;s security. A system like Kerberos can be used for authentication, then a system like LDAP
could be used to determine if a user has a specific permission, and then it may default back to the
default ZookeeperAuthorizor to determine what Authorizations a user is ultimately allowed to use.
This is a pluggable system so custom components can be created depending on your need.</p>
</div>
</div>
<div class="sect2">
<h3 id="_secure_authorizations_handling">10.6. Secure Authorizations Handling</h3>
<div class="paragraph">
<p>For applications serving many users, it is not expected that an Accumulo user
will be created for each application user. In this case an Accumulo user with
all authorizations needed by any of the applications users must be created. To
service queries, the application should create a scanner with the application
user&#8217;s authorizations. These authorizations could be obtained from a trusted 3rd
party.</p>
</div>
<div class="paragraph">
<p>Often production systems will integrate with Public-Key Infrastructure (PKI) and
designate client code within the query layer to negotiate with PKI servers in order
to authenticate users and retrieve their authorization tokens (credentials). This
requires users to specify only the information necessary to authenticate themselves
to the system. Once user identity is established, their credentials can be accessed by
the client code and passed to Accumulo outside of the reach of the user.</p>
</div>
</div>
<div class="sect2">
<h3 id="_query_services_layer">10.7. Query Services Layer</h3>
<div class="paragraph">
<p>Since the primary method of interaction with Accumulo is through the Java API,
production environments often call for the implementation of a Query layer. This
can be done using web services in containers such as Apache Tomcat, but is not a
requirement. The Query Services Layer provides a mechanism for providing a
platform on which user facing applications can be built. This allows the application
designers to isolate potentially complex query logic, and enables a convenient point
at which to perform essential security functions.</p>
</div>
<div class="paragraph">
<p>Several production environments choose to implement authentication at this layer,
where users identifiers are used to retrieve their access credentials which are then
cached within the query layer and presented to Accumulo through the
Authorizations mechanism.</p>
</div>
<div class="paragraph">
<p>Typically, the query services layer sits between Accumulo and user workstations.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ssl">11. SSL</h2>
<div class="sectionbody">
<p>
Accumulo, through Thrift's TSSLTransport, provides the ability to encrypt
wire communication between Accumulo servers and clients using secure
sockets layer (SSL). SSL certifcates signed by the same certificate authority
control the "circle of trust" in which a secure connection can be established.
Typically, each host running Accumulo processes would be given a certificate
which identifies itself.
Clients can optionally also be given a certificate, when client-auth is enabled,
which prevents unwanted clients from accessing the system. The SSL integration
presently provides no authentication support within Accumulo (an Accumulo username
and password are still required) and is only used to establish a means for
secure communication.
</p>
</div>
<div class="sect2">
<h3 id="_ssl_server_configuration">11.1. Server Configuration</h3>
<div class="paragraph">
<p>As previously mentioned, the circle of trust is established by the certificate
authority which created the certificates in use. Because of the tight coupling
of certificate generation with an organization's policies, Accumulo does not
provide a method in which to automatically create the necessary SSL components.</p>
</div>
<div class="paragraph">
<p>Administrators without existing infrastructure built on SSL are encourage to
use OpenSSL and the \texttt{keytool} command. An example of these commands are
included in a section below. Accumulo servers require a certificate and keystore,
in the form of Java KeyStores, to enable SSL. The following configuration assumes
these files already exist.</p>
</div>
<div class="paragraph">
<p>In <code>$ACCUMULO_CONF_DIR/accumulo-site.xml</code>, the following properties are required:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight">
rpc.javax.net.ssl.keyStore=The path on the local filesystem to the keystore containing the server's certificate
rpc.javax.net.ssl.keyStorePassword=The password for the keystore containing the server's certificate
rpc.javax.net.ssl.trustStore=The path on the local filesystem to the keystore containing the certificate authority's public key
rpc.javax.net.ssl.trustStorePassword=The password for the keystore containing the certificate authority's public key
instance.rpc.ssl.enabled=true
</pre>
</div>
</div>
<div class="paragraph">
<p>Optionally, SSL client-authentication (two-way SSL) can also be enabled by setting
<code>instance.rpc.ssl.clientAuth=true</code> in <code>$ACCUMULO_CONF_DIR/accumulo-site.xml</code>.
This requires that each client has access to valid certificate to set up a secure connection
to the servers. By default, Accumulo uses one-way SSL which does not require clients to have
their own certificate.</p>
</div>
</div>
<div class="sect2">
<h3 id="_ssl_client_configuration">11.2. Client Configuration</h3>
<div class="paragraph">
<p>To establish a connection to Accumulo servers, each client must also have
special configuration. This is typically accomplished through the use of
the client configuration file whose default location is <code>~/.accumulo/config</code>.</p>
</div>
<div class="paragraph">
<p>The following properties must be set to connect to an Accumulo instance using SSL:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight">
rpc.javax.net.ssl.trustStore=The path on the local filesystem to the keystore containing the certificate authority's public key
rpc.javax.net.ssl.trustStorePassword=The password for the keystore containing the certificate authority's public key
instance.rpc.ssl.enabled=true</pre>
</div>
</div>
<div class="paragraph">
<p>If two-way SSL if enabled (\texttt{instance.rpc.ssl.clientAuth=true}) for the instance, the client must also define
their own certificate and enable client authenticate as well.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight">
rpc.javax.net.ssl.keyStore=The path on the local filesystem to the keystore containing the server's certificate
rpc.javax.net.ssl.keyStorePassword=The password for the keystore containing the server's certificate
instance.rpc.ssl.clientAuth=true</pre>
</div>
</div>
</div>
<div class="sect3">
<h3 id="_ssl_generate_ssl_material_openssl">11.3. Generating SSL material using OpenSSL</h3>
<div class="paragraph">
<p>The following is included as an example for generating your own SSL material (certificate authority and server/client
certificates) using OpenSSL and Java's KeyTool command.</p>
</div>
<div class="sect2">
<h4 id="_ssl_generate_ca">11.3.1. Generating a certificate authority</h3>
<div class="literalblock">
<div class="content">
<pre>
# Create a private key
openssl genrsa -des3 -out root.key 4096
# Create a certificate request using the private key
openssl req -x509 -new -key root.key -days 365 -out root.pem
# Generate a Base64-encoded version of the PEM just created
openssl x509 -outform der -in root.pem -out root.der
# Import the key into a Java KeyStore
keytool -import -alias root-key -keystore truststore.jks -file root.der
# Remove the DER formatted key file (as we don't need it anymore)
rm root.der
</pre>
</div>
</div>
<div class="paragraph">
<p>The <code>truststore.jks</code> file is the Java keystore which contains the certificate authority's public key.</p>
</div>
</div>
<div class="sect2">
<h4 id="_ssl_generate_certs">11.3.2. Generating a certificate/keystore per host</h3>
<div class="paragraph">
<p>It's common that each host in the instance is issued its own certificate (notably to ensure that revocation procedures
can be easily followed). The following steps can be taken for each host.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>
# Create the private key for our server
openssl genrsa -out server.key 4096
# Generate a certificate signing request (CSR) with our private key
openssl req -new -key server.key -out server.csr
# Use the CSR and the CA to create a certificate for the server (a reply to the CSR)
openssl x509 -req -in server.csr -CA root.pem -CAkey root.key -CAcreateserial \
-out server.crt -days 365
# Use the certificate and the private key for our server to create PKCS12 file
openssl pkcs12 -export -in server.crt -inkey server.key -certfile server.crt \
-name 'server-key' -out server.p12
# Create a Java KeyStore for the server using the PKCS12 file (private key)
keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -destkeystore \
server.jks -deststoretype JKS
# Remove the PKCS12 file as we don't need it
rm server.p12
# Import the CA-signed certificate to the keystore
keytool -import -trustcacerts -alias server-crt -file server.crt -keystore server.jks
</pre>
</div>
</div>
<div class="paragraph">
<p>The <code>server.jks</code> file is the Java keystore containing the certificate for a given host. The above
methods are equivalent whether the certficate is generate for an Accumulo server or a client.</p>
</div>
</div>
<div class="sect1">
<h2 id="_implementation_details">12. Implementation Details</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_implementation_fate">12.1. Fault-Tolerant Executor (FATE)</h3>
<div class="paragraph">
<p>Accumulo must implement a number of distributed, multi-step operations to support
the client API. Creating a new table is a simple example of an atomic client call
which requires multiple steps in the implementation: get a unique table ID, configure
default table permissions, populate information in ZooKeeper to record the table's
existence, create directories in HDFS for the table's data, etc. Implementing these
steps in a way that is tolerant to node failure and other concurrent operations is
very difficult to achieve. Accumulo includes a Fault-Tolerant Executor (FATE) which
is widely used server-side to implement the client API safely and correctly.
FATE is the implementation detail which ensures that tables in creation when the
Master dies will be successfully created when another Master process is started.
This alleviates the need for any external tools to correct some bad state -- Accumulo can
undo the failure and self-heal without any external intervention.</p>
</div>
<div class="sect3">
<h4 id="_implementation_fate_overview">12.1.1 Overview</h3>
<div class="paragraph">
<p>FATE consists of two primary components: a repeatable, persisted operation (REPO), a storage
layer for REPOs and an execution system to run REPOs. Accumulo uses ZooKeeper as the storage
layer for FATE and the Accumulo Master acts as the execution system to run REPOs.
The important characteristic of REPOs are that they implemented in a way that is idempotent:
every operation must be able to undo or replay a partial execution of itself. Requiring the
implementation of the operation to support this functional greatly simplifies the execution
of these operations. This property is also what guarantees safety in light of failure conditions.</P>
</div>
<div class="sect3">
<h4 id="_implementation_fate_administration">12.1.2 Administration</h3>
<div class="paragraph">
<p>Sometimes, it is useful to inspect the current FATE operations, both pending and executing.
For example, a command that is not completing could be blocked on the execution of another
operation. Accumulo provides an Accumulo shell command to interact with fate.</p>
</div>
<div class="paragraph">
<p>The <code>fate</code> shell command accepts a number of arguments for different functionality:
<code>list</code>/<code>print</code>, <code>fail</code>, <code>delete</code>.</p>
</div>
<div class="sect3">
<h4 id="_implementation_fate_list_print">12.1.3 List/Print</h3>
<div class="paragraph">
<p>Without any additional arguments, this command will print all operations that still exist in
the FATE store (ZooKeeper). This will include active, pending, and completed operations (completed
operations are lazily removed from the store). Each operation includes a unique "transaction ID", the
state of the operation (e.g. <code>NEW</code>, <code>IN_PROGRESS</code>, <code>FAILED</code>), any locks the
transaction actively holds and any locks it is waiting to acquire.</p>
</div>
<div class="paragraph">
<p>This option can also accept transaction IDs which will restrict the list of transactions shown. </p>
</div>
<div class="sect3">
<h4 id="_implementation_fate_fail">12.1.4 Fail</h3>
<div class="paragraph">
<p>This command can be used to manually fail a FATE transaction and requires a transaction ID
as an argument. Failing an operation is not a normal procedure and should only be performed
by an administrator who understands the implications of why they are failing the operation.</p>
</div>
<div class="sect3">
<h4 id="_implementation_fate_delete">12.1.5 Delete</h3>
<div class="paragraph">
<p>This command requires a transaction ID and will delete any locks that the transaction
holds. Like the fail command, this command should only be used in extreme circumstances
by an administrator that understands the implications of the command they are about to
invoke. It is not normal to invoke this command.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_administration">13. Administration</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_hardware">13.1. Hardware</h3>
<div class="paragraph">
<p>Because we are running essentially two or three systems simultaneously layered
across the cluster: HDFS, Accumulo and MapReduce, it is typical for hardware to
consist of 4 to 8 cores, and 8 to 32 GB RAM. This is so each running process can have
at least one core and 2 - 4 GB each.</p>
</div>
<div class="paragraph">
<p>One core running HDFS can typically keep 2 to 4 disks busy, so each machine may
typically have as little as 2 x 300GB disks and as much as 4 x 1TB or 2TB disks.</p>
</div>
<div class="paragraph">
<p>It is possible to do with less than this, such as with 1u servers with 2 cores and 4GB
each, but in this case it is recommended to only run up to two processes per
machine&#8201;&#8212;&#8201;i.e. DataNode and TabletServer or DataNode and MapReduce worker but
not all three. The constraint here is having enough available heap space for all the
processes on a machine.</p>
</div>
</div>
<div class="sect2">
<h3 id="_network">13.2. Network</h3>
<div class="paragraph">
<p>Accumulo communicates via remote procedure calls over TCP/IP for both passing
data and control messages. In addition, Accumulo uses HDFS clients to
communicate with HDFS. To achieve good ingest and query performance, sufficient
network bandwidth must be available between any two machines.</p>
</div>
<div class="paragraph">
<p>In addition to needing access to ports associated with HDFS and ZooKeeper, Accumulo will
use the following default ports. Please make sure that they are open, or change
their value in conf/accumulo-site.xml.</p>
</div>
<table class="tableblock frame-all grid-all" style="width:75%; ">
<caption class="title">Table 1. Accumulo default ports</caption>
<colgroup>
<col style="width:20%;">
<col style="width:40%;">
<col style="width:40%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-right valign-top">Port</th>
<th class="tableblock halign-center valign-top">Description</th>
<th class="tableblock halign-center valign-top">Property Name</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">4445</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Shutdown Port (Accumulo MiniCluster)</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">n/a</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">4560</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Accumulo monitor (for centralized log display)</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">monitor.port.log4j</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">9997</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Tablet Server</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">tserver.port.client</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">9999</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Master Server</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">master.port.client</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">12234</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Accumulo Tracer</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">trace.port.client</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">42424</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Accumulo Proxy Server</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">n/a</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">50091</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Accumulo GC</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">gc.port.client</p></td>
</tr>
<tr>
<td class="tableblock halign-right valign-top"><p class="tableblock">50095</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">Accumulo HTTP monitor</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">monitor.port.client</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>In addition, the user can provide <code>0</code> and an ephemeral port will be chosen instead. This
ephemeral port is likely to be unique and not already bound. Thus, configuring ports to
use <code>0</code> instead of an explicit value, should, in most cases, work around any issues of
running multiple distinct Accumulo instances (or any other process which tries to use the
same default ports) on the same hardware.</p>
</div>
</div>
<div class="sect2">
<h3 id="_installation">13.3. Installation</h3>
<div class="paragraph">
<p>Choose a directory for the Accumulo installation. This directory will be referenced
by the environment variable <code>$ACCUMULO_HOME</code>. Run the following:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ tar xzf accumulo-1.6.0-bin.tar.gz # unpack to subdirectory
$ mv accumulo-1.6.0 $ACCUMULO_HOME # move to desired location</pre>
</div>
</div>
<div class="paragraph">
<p>Repeat this step at each machine within the cluster. Usually all machines have the
same <code>$ACCUMULO_HOME</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_dependencies">13.4. Dependencies</h3>
<div class="paragraph">
<p>Accumulo requires HDFS and ZooKeeper to be configured and running
before starting. Password-less SSH should be configured between at least the
Accumulo master and TabletServer machines. It is also a good idea to run Network
Time Protocol (NTP) within the cluster to ensure nodes' clocks don&#8217;t get too out of
sync, which can cause problems with automatically timestamped data.</p>
</div>
</div>
<div class="sect2">
<h3 id="_configuration_2">13.5. Configuration</h3>
<div class="paragraph">
<p>Accumulo is configured by editing several Shell and XML files found in
<code>$ACCUMULO_HOME/conf</code>. The structure closely resembles Hadoop&#8217;s configuration
files.</p>
</div>
<div class="sect3">
<h4 id="_edit_conf_accumulo_env_sh">13.5.1. Edit conf/accumulo-env.sh</h4>
<div class="paragraph">
<p>Accumulo needs to know where to find the software it depends on. Edit accumulo-env.sh
and specify the following:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Enter the location of the installation directory of Accumulo for <code>$ACCUMULO_HOME</code></p>
</li>
<li>
<p>Enter your system&#8217;s Java home for <code>$JAVA_HOME</code></p>
</li>
<li>
<p>Enter the location of Hadoop for <code>$HADOOP_PREFIX</code></p>
</li>
<li>
<p>Choose a location for Accumulo logs and enter it for <code>$ACCUMULO_LOG_DIR</code></p>
</li>
<li>
<p>Enter the location of ZooKeeper for <code>$ZOOKEEPER_HOME</code></p>
</li>
</ol>
</div>
<div class="paragraph">
<p>By default Accumulo TabletServers are set to use 1GB of memory. You may change
this by altering the value of <code>$ACCUMULO_TSERVER_OPTS</code>. Note the syntax is that of
the Java JVM command line options. This value should be less than the physical
memory of the machines running TabletServers.</p>
</div>
<div class="paragraph">
<p>There are similar options for the master&#8217;s memory usage and the garbage collector
process. Reduce these if they exceed the physical RAM of your hardware and
increase them, within the bounds of the physical RAM, if a process fails because of
insufficient memory.</p>
</div>
<div class="paragraph">
<p>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 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, likewise make sure their heap space settings fit
within the available memory.</p>
</div>
</div>
<div class="sect3">
<h4 id="_native_map">13.5.2. Native Map</h4>
<div class="paragraph">
<p>The tablet server uses a data structure called a MemTable to store sorted key/value
pairs in memory when they are first received from the client. When a minor compaction
occurs, this data structure is written to HDFS. The MemTable will default to using
memory in the JVM but a JNI version, called the native map, can be used to significantly
speed up performance by utilizing the memory space of the native operating system. The
native map also avoids the performance implications brought on by garbage collection
in the JVM by causing it to pause much less frequently.</p>
</div>
<div class="sect4">
<h5 id="_native_map_building">13.5.2.1 Building</h4>
<div class="paragraph">
<p>32-bit and 64-bit Linux and Mac OS X versions of the native map can be built from the
Accumulo bin package by executing <code>$ACCUMULO_HOME/bin/build_native_library.sh</code>.
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.</p>
<p>Examples:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>$ACCUMULO_HOME/bin/build_native_library.sh</code></p>
</li>
<li>
<p><code>$ACCUMULO_HOME/bin/build_native_library.sh -m32</code></p>
</li>
</ol>
</div>
<div class="paragraph">
<p>After building the native map from the source, you will find the artifact in
<code>$ACCUMULO_HOME/lib/native</code>. Upon starting up, the tablet server will look
in this directory for the map library. If the file is renamed or moved from its
target directory, the tablet server may not be able to find it. The system can also
locate the native maps shared library by setting <code>LD_LIBRARY_PATH</code> (or
<code>DYLD_LIBRARY_PATH</code> on Mac OS X) in <code>$ACCUMULO_HOME/conf/accumulo-env.sh</code></p>
</div>
</div>
<div class="sect3">
<h4 id="_administration_configuration">13.5.3. Configuration</h4>
<div class="paragraph">
<p>As mentioned, Accumulo will use the native libraries if they are found in the expected
location and <code>tserver.memory.maps.native.enabled</code> is set to <code>true</code> (which is the default).
Using the native maps over JVM Maps nets a noticable improvement in ingest rates; however,
certain configuration variables are important to modify when increasing the size of the
native map.</p>
</div>
<div class="paragraph">
<p>To adjust the size of the native map, increase the value of <code>tserver.memory.maps.max</code>.
By default, the maximum size of the native map is 1GB. When increasing this value, it is
also important to adjust the values of <code>table.compaction.minor.logs.threshold</code> and
<code>tserver.walog.max.size</code>. <code>table.compaction.minor.logs.threshold</code> is the maximum
number of write-ahead log files that a tablet can reference before they will be automatically
minor compacted. <code>tserver.walog.max.size</code> is the maximum size of a write-ahead log.</p>
</div>
<div class="paragraph">
<p>The maximum size of the native maps for a server should be less than the product
of the write-ahead log maximum size and minor compaction threshold for log files:</p>
</div>
<div class="paragraph">
<p><pre>(table.compaction.minor.logs.threshold * tserver.walog.max.size >= tserver.memory.maps.max)</pre></p>
</div>
<div class="paragraph">
<p>This formula ensures that minor compactions won't be automatically triggered before the native
maps can be completely saturated.</p>
</div>
<div class="paragraph">
<p>Subsequently, when increasing the size of the write-ahead logs, it can also be important
to increase the HDFS block size that Accumulo uses when creating the files for the write-ahead log.
This is controlled via <code>tserver.wal.blocksize</code>. A basic recommendation is that when
<code>tserver.walog.max.size</code> is larger than 2GB in size, set <code>tserver.wal.blocksize</code>
to 2GB. Increasing the block size to a value larger than 2GB can result in decreased write
performance to the write-ahead log file which will slow ingest.</p>
</div>
</div>
<div class="sect3">
<h4 id="_cluster_specification">13.5.4. Cluster Specification</h4>
<div class="paragraph">
<p>On the machine that will serve as the Accumulo master:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Write the IP address or domain name of the Accumulo Master to the <code>$ACCUMULO_HOME/conf/masters</code> file.</p>
</li>
<li>
<p>Write the IP addresses or domain name of the machines that will be TabletServers in <code>$ACCUMULO_HOME/conf/slaves</code>, one per line.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Note that if using domain names rather than IP addresses, DNS must be configured
properly for all machines participating in the cluster. DNS can be a confusing source
of errors.</p>
</div>
</div>
<div class="sect3">
<h4 id="_accumulo_settings">13.5.5. Accumulo Settings</h4>
<div class="paragraph">
<p>Specify appropriate values for the following settings in
<code>$ACCUMULO_HOME/conf/accumulo-site.xml</code> :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;instance.zookeeper.host&lt;/name&gt;
&lt;value&gt;zooserver-one:2181,zooserver-two:2181&lt;/value&gt;
&lt;description&gt;list of zookeeper servers&lt;/description&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This enables Accumulo to find ZooKeeper. Accumulo uses ZooKeeper to coordinate
settings between processes and helps finalize TabletServer failure.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;instance.secret&lt;/name&gt;
&lt;value&gt;DEFAULT&lt;/value&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The instance needs a secret to enable secure communication between servers. Configure your
secret and make sure that the <code>accumulo-site.xml</code> file is not readable to other users.
For alternatives to storing the <code>instance.secret</code> in plaintext, please read the
<code>Sensitive Configuration Values</code> section.</p>
</div>
<div class="paragraph">
<p>Some settings can be modified via the Accumulo shell and take effect immediately, but
some settings require a process restart to take effect. See the configuration documentation
(available in the docs directory of the tarball and in <a href="#configuration">Configuration Management</a>) for details.</p>
</div>
</div>
<div class="sect3">
<h4 id="_deploy_configuration">13.5.6. Deploy Configuration</h4>
<div class="paragraph">
<p>Copy the masters, slaves, accumulo-env.sh, and if necessary, accumulo-site.xml
from the <code>$ACCUMULO_HOME/conf/</code> directory on the master to all the machines
specified in the slaves file.</p>
</div>
</div>
<div class="sect3">
<h4 id="_sensitive_configuration_values">13.5.7. Sensitive Configuration Values</h4>
<div class="paragraph">
<p>Accumulo has a number of properties that can be specified via the accumulo-site.xml
file which are sensitive in nature, instance.secret and trace.token.property.password
are two common examples. Both of these properties, if compromised, have the ability
to result in data being leaked to users who should not have access to that data.</p>
</div>
<div class="paragraph">
<p>In Hadoop-2.6.0, a new CredentialProvider class was introduced which serves as a common
implementation to abstract away the storage and retrieval of passwords from plaintext
storage in configuration files. Any Property marked with the <code>Sensitive</code> annotation
is a candidate for use with these CredentialProviders. For version of Hadoop which lack
these classes, the feature will just be unavailable for use.</p>
</div>
<div class="paragraph">
<p>A comma separated list of CredentialProviders can be configured using the Accumulo Property
<code>general.security.credential.provider.paths</code>. Each configured URL will be consulted
when the Configuration object for accumulo-site.xml is accessed.</p>
</div>
</div>
<div class="sect3">
<h4 id="_using_a_javakeystorecredentialprovider_for_storage">13.5.8. Using a JavaKeyStoreCredentialProvider for storage</h4>
<div class="paragraph">
<p>One of the implementations provided in Hadoop-2.6.0 is a Java KeyStore CredentialProvider.
Each entry in the KeyStore is the Accumulo Property key name. For example, to store the
<code>instance.secret</code>, the following command can be used:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>hadoop credential create instance.secret --provider jceks://file/etc/accumulo/conf/accumulo.jceks</pre>
</div>
</div>
<div class="paragraph">
<p>The command will then prompt you to enter the secret to use and create a keystore in:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>/etc/accumulo/conf/accumulo.jceks</pre>
</div>
</div>
<div class="paragraph">
<p>Then, accumulo-site.xml must be configured to use this KeyStore as a CredentialProvider:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;general.security.credential.provider.paths&lt;/name&gt;
&lt;value&gt;jceks://file/etc/accumulo/conf/accumulo.jceks&lt;/value&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>This configuration will then transparently extract the <code>instance.secret</code> from
the configured KeyStore and alleviates a human readable storage of the sensitive
property.</p>
</div>
<div class="paragraph">
<p>A KeyStore can also be stored in HDFS, which will make the KeyStore readily available to
all Accumulo servers. If the local filesystem is used, be aware that each Accumulo server
will expect the KeyStore in the same location.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_initialization">13.6. Initialization</h3>
<div class="paragraph">
<p>Accumulo must be initialized to create the structures it uses internally to locate
data across the cluster. HDFS is required to be configured and running before
Accumulo can be initialized.</p>
</div>
<div class="paragraph">
<p>Once HDFS is started, initialization can be performed by executing
<code>$ACCUMULO_HOME/bin/accumulo init</code> . This script will prompt for a name
for this instance of Accumulo. The instance name is used to identify a set of tables
and instance-specific settings. The script will then write some information into
HDFS so Accumulo can start properly.</p>
</div>
<div class="paragraph">
<p>The initialization script will prompt you to set a root password. Once Accumulo is
initialized it can be started.</p>
</div>
</div>
<div class="sect2">
<h3 id="_running">13.7. Running</h3>
<div class="sect3">
<h4 id="_starting_accumulo">13.7.1. Starting Accumulo</h4>
<div class="paragraph">
<p>Make sure Hadoop is configured on all of the machines in the cluster, including
access to a shared HDFS instance. Make sure HDFS and ZooKeeper are running.
Make sure ZooKeeper is configured and running on at least one machine in the
cluster.
Start Accumulo using the <code>bin/start-all.sh</code> script.</p>
</div>
<div class="paragraph">
<p>To verify that Accumulo is running, check the Status page as described under
<em>Monitoring</em>. In addition, the Shell can provide some information about the status of
tables via reading the metadata tables.</p>
</div>
</div>
<div class="sect3">
<h4 id="_stopping_accumulo">13.7.2. Stopping Accumulo</h4>
<div class="paragraph">
<p>To shutdown cleanly, run <code>bin/stop-all.sh</code> and the master will orchestrate the
shutdown of all the tablet servers. Shutdown waits for all minor compactions to finish, so it may
take some time for particular configurations.</p>
</div>
</div>
<div class="sect3">
<h4 id="_adding_a_node">13.7.3. Adding a Node</h4>
<div class="paragraph">
<p>Update your <code>$ACCUMULO_HOME/conf/slaves</code> (or <code>$ACCUMULO_CONF_DIR/slaves</code>) file to account for the addition.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo admin start &lt;host(s)&gt; {&lt;host&gt; ...}</pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively, you can ssh to each of the hosts you want to add and run:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/start-here.sh</pre>
</div>
</div>
<div class="paragraph">
<p>Make sure the host in question has the new configuration, or else the tablet
server won&#8217;t start; at a minimum this needs to be on the host(s) being added,
but in practice it&#8217;s good to ensure consistent configuration across all nodes.</p>
</div>
</div>
<div class="sect3">
<h4 id="_decomissioning_a_node">13.7.4. Decomissioning a Node</h4>
<div class="paragraph">
<p>If you need to take a node out of operation, you can trigger a graceful shutdown of a tablet
server. Accumulo will automatically rebalance the tablets across the available tablet servers.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo admin stop &lt;host[:port]&gt; {&lt;host[:port]&gt; ...}</pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively, you can ssh to each of the hosts you want to remove and run:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/stop-here.sh</pre>
</div>
</div>
<div class="paragraph">
<p>Be sure to update your <code>$ACCUMULO_HOME/conf/slaves</code> (or <code>$ACCUMULO_CONF_DIR/slaves</code>) file to
account for the removal of these hosts. Bear in mind that the monitor will not re-read the
slaves file automatically, so it will report the decomissioned servers as down; it&#8217;s
recommended that you restart the monitor so that the node list is up to date.</p>
</div>
</div>
<div class="sect3">
<h4 id="_restarting_process_on_a_node">13.7.5. Restarting process on a node</h4>
<div class="paragraph">
<p>Occasionally, it might be necessary to restart the processes on a specific node. In addition
to the <code>start-all.sh</code> and <code>stop-all.sh</code> scripts, Accumulo contains scripts to start/stop all processes
on a node and start/stop a given process on a node.</p>
</div>
<div class="paragraph">
<p><code>start-here.sh</code> and <code>stop-here.sh</code> will start/stop all Accumulo processes on the current node. The
necessary processes to start/stop are determined via the "hosts" files (e.g. slaves, masters, etc).
These scripts expect no arguments.</p>
</div>
<div class="paragraph">
<p><code>start-server.sh</code> can also be useful in starting a given process on a host.
The first argument to the process is the hostname of the machine. Use the same host that
you specified in hosts file (if you specified FQDN in the masters file, use the FQDN, not
the shortname). The second argument is the name of the process to start (e.g. master, tserver).</>
</div>
<div class="paragraph">
<p>The steps described to decomission a node can also be used (without removal of the host
from the <code>$ACCUMULO_HOME/conf/slaves</code> file) to gracefully stop a node. This will
ensure that the tabletserver is cleanly stopped and recovery will not need to be performed
when the tablets are re-hosted.</p>
</div>
</div>
<div class="sect3">
<h4 id="_running_multiple_tabletservers_on_a_single_node">13.7.6. Running multiple TabletServers on a single node</h4>
<div class="paragraph">
<p>With very powerful nodes, it may be beneficial to run more than one TabletServer on a given
node. This decision should be made carefully and with much deliberation as Accumulo is designed
to be able to scale to using 10's of GB of RAM and 10's of CPU cores.</p>
</div>
<div class="paragraph">
<p>To run multiple TabletServers on a single host, it is necessary to create multiple Accumulo configuration
directories. Ensuring that these properties are appropriately set (and remain consistent) are an exercise
for the user.</p>
</div>
<div class="paragraph">
<p>Accumulo TabletServers bind certain ports on the host to accommodate remote procedure calls to/from
other nodes. This requires additional configuration values in <code>accumulo-site.xml</code>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>tserver.port.client</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Normally, setting a value of <code>0</code> for these configuration properties is sufficient. In some
environment, the ports used by Accumulo must be well-known for security reasons and require a
separate copy of the configuration files to use a static port for each TabletServer instance.</p>
</div>
<div class="paragraph">
<p>It is also necessary to update the following exported variables in <code>accumulo-env.sh</code>.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>ACCUMULO_LOG_DIR</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The values for these properties are left up to the user to define; there are no constraints
other than ensuring that the directory exists and the user running Accumulo has the permission
to read/write into that directory.</p>
</div>
<div class="paragraph">
<p>Accumulo's provided scripts for stopping a cluster operate under the assumption that one process
is running per host. As such, starting and stopping multiple TabletServers on one host requires
more effort on the user. It is important to ensure that <code>ACCUMULO_CONF_DIR</code> is correctly
set for the instance of the TabletServer being started.</p>
</div>
<div class="paragraph">
<p><code>$ACCUMULO_CONF_DIR=$ACCUMULO_HOME/conf $ACCUMULO_HOME/bin/accumulo tserver --address <your_server_ip> &amp;</code></p>
</div>
<div class="paragraph">
<p>To stop TabletServers, the normal <code>stop-all.sh</code> will stop all instances of TabletServers across all nodes.
Using the provided <code>kill</code> command by your operation system is an option to stop a single instance on
a single node. <code>stop-server.sh</code> can be used to stop all TabletServers on a single node.</p>
</div>
</div>
<div class="sect2">
<h3 id="_monitoring">13.8. Monitoring</h3>
<div class="paragraph">
<p>The Accumulo Master provides an interface for monitoring the status and health of
Accumulo components. This interface can be accessed by pointing a web browser to
<code><a href="http://accumulomaster:50095/status">http://accumulomaster:50095/status</a></code></p>
</div>
</div>
<div class="sect2">
<h3 id="_tracing">13.9. Tracing</h3>
<div class="paragraph">
<p>It can be difficult to determine why some operations are taking longer
than expected. For example, you may be looking up items with very low
latency, but sometimes the lookups take much longer. Determining the
cause of the delay is difficult because the system is distributed, and
the typical lookup is fast.</p>
</div>
<div class="paragraph">
<p>Accumulo has been instrumented to record the time that various
operations take when tracing is turned on. The fact that tracing is
enabled follows all the requests made on behalf of the user throughout
the distributed infrastructure of accumulo, and across all threads of
execution.</p>
</div>
<div class="paragraph">
<p>These time spans will be inserted into the <code>trace</code> table in
Accumulo. You can browse recent traces from the Accumulo monitor
page. You can also read the <code>trace</code> table directly like any
other table.</p>
</div>
<div class="paragraph">
<p>The design of Accumulo&#8217;s distributed tracing follows that of
<a href="http://research.google.com/pubs/pub36356.html">Google&#8217;s Dapper</a>.</p>
</div>
<div class="sect3">
<h4 id="_tracers">13.9.1. Tracers</h4>
<div class="paragraph">
<p>To collect traces, Accumulo needs at least one server listed in
<code>$ACCUMULO_HOME/conf/tracers</code>. The server collects traces
from clients and writes them to the <code>trace</code> table. The Accumulo
user that the tracer connects to Accumulo with can be configured with
the following properties</p>
</div>
<div class="literalblock">
<div class="content">
<pre>trace.user
trace.token.property.password</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_instrumenting_a_client">13.9.2. Instrumenting a Client</h4>
<div class="paragraph">
<p>Tracing can be used to measure a client operation, such as a scan, as
the operation traverses the distributed system. To enable tracing for
your application call</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">DistributedTrace.enable(instance, new ZooReader(instance), hostname, "myApplication");</code></pre>
</div>
</div>
<div class="paragraph">
<p>Once tracing has been enabled, a client can wrap an operation in a trace.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Trace.on("Client Scan");
BatchScanner scanner = conn.createBatchScanner(...);
// Configure your scanner
for (Entry entry : scanner) {
}
Trace.off();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Additionally, the user can create additional Spans within a Trace.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Trace.on("Client Update");
...
Span readSpan = Trace.start("Read");
...
readSpan.stop();
...
Span writeSpan = Trace.start("Write");
...
writeSpan.stop();
Trace.off();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Like Dapper, Accumulo tracing supports user defined annotations to associate additional data with a Trace.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">...
int numberOfEntriesRead = 0;
Span readSpan = Trace.start("Read");
// Do the read, update the counter
...
readSpan.data("Number of Entries Read", String.valueOf(numberOfEntriesRead));</code></pre>
</div>
</div>
<div class="paragraph">
<p>Some client operations may have a high volume within your
application. As such, you may wish to only sample a percentage of
operations for tracing. As seen below, the CountSampler can be used to
help enable tracing for 1-in-1000 operations</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="java language-java">Sampler sampler = new CountSampler(1000);
...
if (sampler.next()) {
Trace.on("Read");
}
...
Trace.offNoFlush();</code></pre>
</div>
</div>
<div class="paragraph">
<p>It should be noted that it is safe to turn off tracing even if it
isn&#8217;t currently active. The <code>Trace.offNoFlush()</code> should be used if the
user does not wish to have <code>Trace.off()</code> block while flushing trace
data.</p>
</div>
</div>
<div class="sect3">
<h4 id="_viewing_collected_traces">13.9.3. Viewing Collected Traces</h4>
<div class="paragraph">
<p>To view collected traces, use the "Recent Traces" link on the Monitor
UI. You can also programmatically access and print traces using the
<code>TraceDump</code> class.</p>
</div>
</div>
<div class="sect3">
<h4 id="_tracing_from_the_shell">13.9.4. Tracing from the Shell</h4>
<div class="paragraph">
<p>You can enable tracing for operations run from the shell by using the
<code>trace on</code> and <code>trace off</code> commands.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>root@test test&gt; trace on
root@test test&gt; scan
a b:c [] d
root@test test&gt; trace off
Waiting for trace information
Waiting for trace information
Trace started at 2013/08/26 13:24:08.332
Time Start Service@Location Name
3628+0 shell@localhost shell:root
8+1690 shell@localhost scan
7+1691 shell@localhost scan:location
6+1692 tserver@localhost startScan
5+1692 tserver@localhost tablet read ahead 6</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_logging">13.10. Logging</h3>
<div class="paragraph">
<p>Accumulo processes each write to a set of log files. By default these are found under
<code>$ACCUMULO/logs/</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_recovery">13.11. Recovery</h3>
<div class="paragraph">
<p>In the event of TabletServer failure or error on shutting Accumulo down, some
mutations may not have been minor compacted to HDFS properly. In this case,
Accumulo will automatically reapply such mutations from the write-ahead log
either when the tablets from the failed server are reassigned by the Master (in the
case of a single TabletServer failure) or the next time Accumulo starts (in the event of
failure during shutdown).</p>
</div>
<div class="paragraph">
<p>Recovery is performed by asking a tablet server to sort the logs so that tablets can easily find their missing
updates. The sort status of each file is displayed on
Accumulo monitor status page. Once the recovery is complete any
tablets involved should return to an &#8220;online&#8221; state. Until then those tablets will be
unavailable to clients.</p>
</div>
<div class="paragraph">
<p>The Accumulo client library is configured to retry failed mutations and in many
cases clients will be able to continue processing after the recovery process without
throwing an exception.</p>
</div>
</div>
<h3 id="_migrating_from_non_ha_to_ha">12.12. Migrating Accumulo from non-HA Namenode to HA Namenode</h3>
<div class="paragraph"><p>
The following steps will allow a non-HA instance to be migrated to an HA instance. Consider an HDFS URL
<code>hdfs://namenode.example.com:8020</code> which is going to be moved to <code>hdfs://nameservice1</code>.</p>
</div>
<div class="paragraph"><p>
Before moving HDFS over to the HA namenode, use <code>$ACCUMULO_HOME/bin/accumulo admin volumes</code> to confirm
that the only volume displayed is the volume from the current namenode's HDFS URL.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>
Listing volumes referenced in zookeeper
Volume : hdfs://namenode.example.com:8020/accumulo
Listing volumes referenced in accumulo.root tablets section
Volume : hdfs://namenode.example.com:8020/accumulo
Listing volumes referenced in accumulo.root deletes section (volume replacement occurrs at deletion time)
Listing volumes referenced in accumulo.metadata tablets section
Volume : hdfs://namenode.example.com:8020/accumulo
Listing volumes referenced in accumulo.metadata deletes section (volume replacement occurrs at deletion time)
</pre>
</div>
</div>
<div class="paragraph"><p>
After verifying the current volume is correct, shut down the cluster and transition HDFS to the HA nameservice.
Edit <code>$ACCUMULO_HOME/conf/accumulo-site.xml</code> to notify accumulo that a volume is being replaced. First,
add the new nameservice volume to the <code>instance.volumes</code> property. Next, add the
<code>instance.volumes.replacements</code> property in the form of <code>old new</code>. It's important to not include
the volume that's being replaced in <code>instance.volumes</code>, otherwise it's possible accumulo could continue
to write to the volume.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;!-- instance.dfs.uri and instance.dfs.dir should not be set--&gt;
&lt;property&gt;
&lt;name&gt;instance.volumes&lt;/name&gt;
&lt;value&gt;hdfs://nameservice1/accumulo&lt;/value&gt;
&lt;/property&gt;
&lt;property&gt;
&lt;name>instance.volumes.replacements&lt;/name&gt;
&lt;value>hdfs://namenode.example.com:8020/accumulo hdfs://nameservice1/accumulo&lt;/value&gt;
&lt;/property>
</code></pre>
</div>
</div>
<div class="paragraph">
<p>Run <code>$ACCUMULO_HOME/bin/accumulo init --add-volumes</code> and start up the accumulo cluster. Verify that the
new nameservice volume shows up with <code>$ACCUMULO_HOME/bin/accumulo admin volumes</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>
Listing volumes referenced in zookeeper
Volume : hdfs://namenode.example.com:8020/accumulo
Volume : hdfs://nameservice1/accumulo
Listing volumes referenced in accumulo.root tablets section
Volume : hdfs://namenode.example.com:8020/accumulo
Volume : hdfs://nameservice1/accumulo
Listing volumes referenced in accumulo.root deletes section (volume replacement occurrs at deletion time)
Listing volumes referenced in accumulo.metadata tablets section
Volume : hdfs://namenode.example.com:8020/accumulo
Volume : hdfs://nameservice1/accumulo
Listing volumes referenced in accumulo.metadata deletes section (volume replacement occurrs at deletion time)
</pre>
</div>
</div>
<div class="paragraph"><p>
Some erroneous GarbageCollector messages may still be seen for a small period while data is transitioning to
the new volumes. This is expected and can usually be ignored.</p>
</div>
</div>
<div class="sect1">
<h2 id="_multi_volume_installations">14. Multi-Volume Installations</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This is an advanced configuration setting for very large clusters
under a lot of write pressure.</p>
</div>
<div class="paragraph">
<p>The HDFS NameNode holds all of the metadata about the files in
HDFS. For fast performance, all of this information needs to be stored
in memory. A single NameNode with 64G of memory can store the
metadata for tens of millions of files.However, when scaling beyond a
thousand nodes, an active Accumulo system can generate lots of updates
to the file system, especially when data is being ingested. The large
number of write transactions to the NameNode, and the speed of a
single edit log, can become the limiting factor for large scale
Accumulo installations.</p>
</div>
<div class="paragraph">
<p>You can see the effect of slow write transactions when the Accumulo
Garbage Collector takes a long time (more than 5 minutes) to delete
the files Accumulo no longer needs. If your Garbage Collector
routinely runs in less than a minute, the NameNode is performing well.</p>
</div>
<div class="paragraph">
<p>However, if you do begin to experience slow-down and poor GC
performance, Accumulo can be configured to use multiple NameNode
servers. The configuration &#8220;instance.volumes&#8221; should be set to a
comma-separated list, using full URI references to different NameNode
servers:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;instance.volumes&lt;/name&gt;
&lt;value&gt;hdfs://ns1:9001,hdfs://ns2:9001&lt;/value&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The introduction of multiple volume support in 1.6 changed the way Accumulo
stores pointers to files. It now stores fully qualified URI references to
files. Before 1.6, Accumulo stored paths that were relative to a table
directory. After an upgrade these relative paths will still exist and are
resolved using instance.dfs.dir, instance.dfs.uri, and Hadoop configuration in
the same way they were before 1.6.</p>
</div>
<div class="paragraph">
<p>If the URI for a namenode changes (e.g. namenode was running on host1 and its
moved to host2), then Accumulo will no longer function. Even if Hadoop and
Accumulo configurations are changed, the fully qualified URIs stored in
Accumulo will still contain the old URI. To handle this Accumulo has the
following configuration property for replacing URI stored in its metadata. The
example configuration below will replace ns1 with nsA and ns2 with nsB in
Accumulo metadata. For this property to take affect, Accumulo will need to be
restarted.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;instance.volumes.replacements&lt;/name&gt;
&lt;value&gt;hdfs://ns1:9001 hdfs://nsA:9001, hdfs://ns2:9001 hdfs://nsB:9001&lt;/value&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using viewfs or HA namenode, introduced in Hadoop 2, offers another option for
managing the fully qualified URIs stored in Accumulo. Viewfs and HA namenode
both introduce a level of indirection in the Hadoop configuration. For
example assume viewfs:///nn1 maps to hdfs://nn1 in the Hadoop configuration.
If viewfs://nn1 is used by Accumulo, then its easy to map viewfs://nn1 to
hdfs://nnA by changing the Hadoop configuration w/o doing anything to Accumulo.
A production system should probably use a HA namenode. Viewfs may be useful on
a test system with a single non HA namenode.</p>
</div>
<div class="paragraph">
<p>You may also want to configure your cluster to use Federation,
available in Hadoop 2.0, which allows DataNodes to respond to multiple
NameNode servers, so you do not have to partition your DataNodes by
NameNode.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_troubleshooting">15. Troubleshooting</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_logs">15.1. Logs</h3>
<div class="paragraph">
<p><strong>Q</strong>: The tablet server does not seem to be running!? What happened?</p>
</div>
<div class="paragraph">
<p>Accumulo is a distributed system. It is supposed to run on remote
equipment, across hundreds of computers. Each program that runs on
these remote computers writes down events as they occur, into a local
file. By default, this is defined in
<code>$ACCUMULO_HOME/conf/accumule-env.sh</code> as <code>ACCUMULO_LOG_DIR</code>.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Look in the <code>$ACCUMULO_LOG_DIR/tserver*.log</code> file. Specifically, check the end of the file.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: The tablet server did not start and the debug log does not exists! What happened?</p>
</div>
<div class="paragraph">
<p>When the individual programs are started, the stdout and stderr output
of these programs are stored in <code>.out</code> and <code>.err</code> files in
<code>$ACCUMULO_LOG_DIR</code>. Often, when there are missing configuration
options, files or permissions, messages will be left in these files.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Probably a start-up problem. Look in <code>$ACCUMULO_LOG_DIR/tserver*.err</code></p>
</div>
</div>
<div class="sect2">
<h3 id="_monitor_2">15.2. Monitor</h3>
<div class="paragraph">
<p><strong>Q</strong>: Accumulo is not working, what&#8217;s wrong?</p>
</div>
<div class="paragraph">
<p>There&#8217;s a small web server that collects information about all the
components that make up a running Accumulo instance. It will highlight
unusual or unexpected conditions.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Point your browser to the monitor (typically the master host, on port 50095). Is anything red or yellow?</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My browser is reporting connection refused, and I cannot get to the monitor</p>
</div>
<div class="paragraph">
<p>The monitor program&#8217;s output is also written to .err and .out files in
the <code>$ACCUMULO_LOG_DIR</code>. Look for problems in this file if the
<code>$ACCUMULO_LOG_DIR/monitor*.log</code> file does not exist.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: The monitor program is probably not running. Check the log files for errors.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My browser hangs trying to talk to the monitor.</p>
</div>
<div class="paragraph">
<p>Your browser needs to be able to reach the monitor program. Often
large clusters are firewalled, or use a VPN for internal
communications. You can use SSH to proxy your browser to the cluster,
or consult with your system administrator to gain access to the server
from your browser.</p>
</div>
<div class="paragraph">
<p>It is sometimes helpful to use a text-only browser to sanity-check the
monitor while on the machine running the monitor:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ links http://localhost:50095</pre>
</div>
</div>
<div class="paragraph">
<p><strong>A</strong>: Verify that you are not firewalled from the monitor if it is running on a remote host.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: The monitor responds, but there are no numbers for tservers and tables. The summary page says the master is down.</p>
</div>
<div class="paragraph">
<p>The monitor program gathers all the details about the master and the
tablet servers through the master. It will be mostly blank if the
master is down.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Check for a running master.</p>
</div>
</div>
<div class="sect2">
<h3 id="_hdfs">15.3. HDFS</h3>
<div class="paragraph">
<p>Accumulo reads and writes to the Hadoop Distributed File System.
Accumulo needs this file system available at all times for normal operations.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: Accumulo is having problems &#8220;getting a block blk_1234567890123.&#8221; How do I fix it?</p>
</div>
<div class="paragraph">
<p>This troubleshooting guide does not cover HDFS, but in general, you
want to make sure that all the datanodes are running and an fsck check
finds the file system clean:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ hadoop fsck /accumulo</pre>
</div>
</div>
<div class="paragraph">
<p>You can use:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ hadoop fsck /accumulo/path/to/corrupt/file -locations -blocks -files</pre>
</div>
</div>
<div class="paragraph">
<p>to locate the block references of individual corrupt files and use those
references to search the name node and individual data node logs to determine which
servers those blocks have been assigned and then try to fix any underlying file
system issues on those nodes.</p>
</div>
<div class="paragraph">
<p>On a larger cluster, you may need to increase the number of Xcievers for HDFS DataNodes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="xml language-xml">&lt;property&gt;
&lt;name&gt;dfs.datanode.max.xcievers&lt;/name&gt;
&lt;value&gt;4096&lt;/value&gt;
&lt;/property&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>A</strong>: Verify HDFS is healthy, check the datanode logs.</p>
</div>
</div>
<div class="sect2">
<h3 id="_zookeeper">15.4. Zookeeper</h3>
<div class="paragraph">
<p><strong>Q</strong>: <code>accumulo init</code> is hanging. It says something about talking to zookeeper.</p>
</div>
<div class="paragraph">
<p>Zookeeper is also a distributed service. You will need to ensure that
it is up. You can run the zookeeper command line tool to connect to
any one of the zookeeper servers:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ zkCli.sh -server zoohost
...
[zk: zoohost:2181(CONNECTED) 0]</pre>
</div>
</div>
<div class="paragraph">
<p>It is important to see the word <code>CONNECTED</code>! If you only see
<code>CONNECTING</code> you will need to diagnose zookeeper errors.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Check to make sure that zookeeper is up, and that
<code>$ACCUMULO_HOME/conf/accumulo-site.xml</code> has been pointed to
your zookeeper server(s).</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: Zookeeper is running, but it does not say <code>CONNECTED</code></p>
</div>
<div class="paragraph">
<p>Zookeeper processes talk to each other to elect a leader. All updates
go through the leader and propagate to a majority of all the other
nodes. If a majority of the nodes cannot be reached, zookeeper will
not allow updates. Zookeeper also limits the number connections to a
server from any other single host. By default, this limit can be as small as 10
and can be reached in some everything-on-one-machine test configurations.</p>
</div>
<div class="paragraph">
<p>You can check the election status and connection status of clients by
asking the zookeeper nodes for their status. You connect to zookeeper
and ask it with the four-letter <code>stat</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ nc zoohost 2181
stat
Zookeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
Clients:
/127.0.0.1:58289[0](queued=0,recved=1,sent=0)
/127.0.0.1:60231[1](queued=0,recved=53910,sent=53915)
Latency min/avg/max: 0/5/3008
Received: 1561459
Sent: 1561592
Connections: 2
Outstanding: 0
Zxid: 0x621a3b
Mode: standalone
Node count: 22524</pre>
</div>
</div>
<div class="paragraph">
<p><strong>A</strong>: Check zookeeper status, verify that it has a quorum, and has not exceeded maxClientCnxns.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My tablet server crashed! The logs say that it lost its zookeeper lock.</p>
</div>
<div class="paragraph">
<p>Tablet servers reserve a lock in zookeeper to maintain their ownership
over the tablets that have been assigned to them. Part of their
responsibility for keeping the lock is to send zookeeper a keep-alive
message periodically. If the tablet server fails to send a message in
a timely fashion, zookeeper will remove the lock and notify the tablet
server. If the tablet server does not receive a message from
zookeeper, it will assume its lock has been lost, too. If a tablet
server loses its lock, it kills itself: everything assumes it is dead
already.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Investigate why the tablet server did not send a timely message to
zookeeper.</p>
</div>
<div class="sect3">
<h4 id="_keeping_the_tablet_server_lock">15.4.1. Keeping the tablet server lock</h4>
<div class="paragraph">
<p><strong>Q</strong>: My tablet server lost its lock. Why?</p>
</div>
<div class="paragraph">
<p>The primary reason a tablet server loses its lock is that it has been pushed into swap.</p>
</div>
<div class="paragraph">
<p>A large java program (like the tablet server) may have a large portion
of its memory image unused. The operation system will favor pushing
this allocated, but unused memory into swap so that the memory can be
re-used as a disk buffer. When the java virtual machine decides to
access this memory, the OS will begin flushing disk buffers to return that
memory to the VM. This can cause the entire process to block long
enough for the zookeeper lock to be lost.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Configure your system to reduce the kernel parameter <em>swappiness</em> from the default (60) to zero.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My tablet server lost its lock, and I have already set swappiness to
zero. Why?</p>
</div>
<div class="paragraph">
<p>Be careful not to over-subscribe memory. This can be easy to do if
your accumulo processes run on the same nodes as hadoop&#8217;s map-reduce
framework. Remember to add up:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>size of the JVM for the tablet server</p>
</li>
<li>
<p>size of the in-memory map, if using the native map implementation</p>
</li>
<li>
<p>size of the JVM for the data node</p>
</li>
<li>
<p>size of the JVM for the task tracker</p>
</li>
<li>
<p>size of the JVM times the maximum number of mappers and reducers</p>
</li>
<li>
<p>size of the kernel and any support processes</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If a 16G node can run 2 mappers and 2 reducers, and each can be 2G,
then there is only 8G for the data node, tserver, task tracker and OS.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Reduce the memory footprint of each component until it fits comfortably.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My tablet server lost its lock, swappiness is zero, and my node has lots of unused memory!</p>
</div>
<div class="paragraph">
<p>The JVM memory garbage collector may fall behind and cause a
"stop-the-world" garbage collection. On a large memory virtual
machine, this collection can take a long time. This happens more
frequently when the JVM is getting low on free memory. Check the logs
of the tablet server. You will see lines like this:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>2013-06-20 13:43:20,607 [tabletserver.TabletServer] DEBUG: gc ParNew=0.00(+0.00) secs
ConcurrentMarkSweep=0.00(+0.00) secs freemem=1,868,325,952(+1,868,325,952) totalmem=2,040,135,680</pre>
</div>
</div>
<div class="paragraph">
<p>When <code>freemem</code> becomes small relative to the amount of memory
needed, the JVM will spend more time finding free memory than
performing work. This can cause long delays in sending keep-alive
messages to zookeeper.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Ensure the tablet server JVM is not running low on memory.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_tools">15.5. Tools</h3>
<div class="paragraph">
<p>The accumulo script can be used to run classes from the command line.
This section shows how a few of the utilities work, but there are many
more.</p>
</div>
<div class="paragraph">
<p>There&#8217;s a class that will examine an accumulo storage file and print
out basic metadata.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.core.file.rfile.PrintInfo /accumulo/tables/1/default_tablet/A000000n.rf
2013-07-16 08:17:14,778 [util.NativeCodeLoader] INFO : Loaded the native-hadoop library
Locality group : &lt;DEFAULT&gt;
Start block : 0
Num blocks : 1
Index level 0 : 62 bytes 1 blocks
First key : 288be9ab4052fe9e span:34078a86a723e5d3:3da450f02108ced5 [] 1373373521623 false
Last key : start:13fc375709e id:615f5ee2dd822d7a [] 1373373821660 false
Num entries : 466
Column families : [waitForCommits, start, md major compactor 1, md major compactor 2, md major compactor 3,
bringOnline, prep, md major compactor 4, md major compactor 5, md root major compactor 3,
minorCompaction, wal, compactFiles, md root major compactor 4, md root major compactor 1,
md root major compactor 2, compact, id, client:update, span, update, commit, write,
majorCompaction]
Meta block : BCFile.index
Raw size : 4 bytes
Compressed size : 12 bytes
Compression type : gz
Meta block : RFile.index
Raw size : 780 bytes
Compressed size : 344 bytes
Compression type : gz</pre>
</div>
</div>
<div class="paragraph">
<p>When trying to diagnose problems related to key size, the <code>PrintInfo</code> tool can provide a histogram of the individual key sizes:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.core.file.rfile.PrintInfo --histogram /accumulo/tables/1/default_tablet/A000000n.rf
...
Up to size count %-age
10 : 222 28.23%
100 : 244 71.77%
1000 : 0 0.00%
10000 : 0 0.00%
100000 : 0 0.00%
1000000 : 0 0.00%
10000000 : 0 0.00%
100000000 : 0 0.00%
1000000000 : 0 0.00%
10000000000 : 0 0.00%</pre>
</div>
</div>
<div class="paragraph">
<p>Likewise, <code>PrintInfo</code> will dump the key-value pairs and show you the contents of the RFile:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.core.file.rfile.PrintInfo --dump /accumulo/tables/1/default_tablet/A000000n.rf
row columnFamily:columnQualifier [visibility] timestamp deleteFlag -&gt; Value
...</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: Accumulo is not showing me any data!</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Do you have your auths set so that it matches your visibilities?</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: What are my visibilities?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use <code>PrintInfo</code> on a representative file to get some idea of the visibilities in the underlying data.</p>
</div>
<div class="paragraph">
<p>Note that the use of <code>PrintInfo</code> is an administrative tool and can only
by used by someone who can access the underlying Accumulo data. It
does not provide the normal access controls in Accumulo.</p>
</div>
<div class="paragraph">
<p>If you would like to backup, or otherwise examine the contents of Zookeeper, there are commands to dump and load to/from XML.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.DumpZookeeper --root /accumulo &gt;dump.xml
$ ./bin/accumulo org.apache.accumulo.server.util.RestoreZookeeper --overwrite &lt; dump.xml</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: How can I get the information in the monitor page for my cluster monitoring system?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use GetMasterStats:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.test.GetMasterStats | grep Load
OS Load Average: 0.27</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: The monitor page is showing an offline tablet. How can I find out which tablet it is?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use FindOfflineTablets:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.FindOfflineTablets
2&lt;&lt;@(null,null,localhost:9997) is UNASSIGNED #walogs:2</pre>
</div>
</div>
<div class="paragraph">
<p>Here&#8217;s what the output means:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>2&lt;&lt;</code></dt>
<dd>
<p>This is the tablet from (-inf, +inf) for the
table with id 2. The command <code>tables -l</code> in the shell will show table ids for
tables.</p>
</dd>
<dt class="hdlist1"><code>@(null, null, localhost:9997)</code></dt>
<dd>
<p>Location information. The
format is <code>@(assigned, hosted, last)</code>. In this case, the
tablet has not been assigned, is not hosted anywhere, and was once
hosted on localhost.</p>
</dd>
<dt class="hdlist1"><code>#walogs:2</code></dt>
<dd>
<p>The number of write-ahead logs that this tablet requires for recovery.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>An unassigned tablet with write-ahead logs is probably waiting for
logs to be sorted for efficient recovery.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: How can I be sure that the metadata tables are up and consistent?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: <code>CheckForMetadataProblems</code> will verify the start/end of
every tablet matches, and the start and stop for the table is empty:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.CheckForMetadataProblems -u root --password
Enter the connection password:
All is well for table !0
All is well for table 1</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My hadoop cluster has lost a file due to a NameNode failure. How can I remove the file?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: There&#8217;s a utility that will check every file reference and ensure
that the file exists in HDFS. Optionally, it will remove the
reference:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.RemoveEntriesForMissingFiles -u root --password
Enter the connection password:
2013-07-16 13:10:57,293 [util.RemoveEntriesForMissingFiles] INFO : File /accumulo/tables/2/default_tablet/F0000005.rf
is missing
2013-07-16 13:10:57,296 [util.RemoveEntriesForMissingFiles] INFO : 1 files of 3 missing</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: I have many entries in zookeeper for old instances I no longer need. How can I remove them?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use CleanZookeeper:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.CleanZookeeper</pre>
</div>
</div>
<div class="paragraph">
<p>This command will not delete the instance pointed to by the local <code>conf/accumulo-site.xml</code> file.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: I need to decommission a node. How do I stop the tablet server on it?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use the admin command:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo admin stop hostname:9997
2013-07-16 13:15:38,403 [util.Admin] INFO : Stopping server 12.34.56.78:9997</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: I cannot login to a tablet server host, and the tablet server will not shut down. How can I kill the server?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Sometimes you can kill a "stuck" tablet server by deleting its lock in zookeeper:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.TabletServerLocks --list
127.0.0.1:9997 TSERV_CLIENT=127.0.0.1:9997
$ ./bin/accumulo org.apache.accumulo.server.util.TabletServerLocks -delete 127.0.0.1:9997
$ ./bin/accumulo org.apache.accumulo.server.util.TabletServerLocks -list
127.0.0.1:9997 null</pre>
</div>
</div>
<div class="paragraph">
<p>You can find the master and instance id for any accumulo instances using the same zookeeper instance:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ ./bin/accumulo org.apache.accumulo.server.util.ListInstances
INFO : Using ZooKeepers localhost:2181
Instance Name | Instance ID | Master
---------------------+--------------------------------------+-------------------------------
"test" | 6140b72e-edd8-4126-b2f5-e74a8bbe323b | 127.0.0.1:9999</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="metadata">15.6. System Metadata Tables</h3>
<div class="paragraph">
<p>Accumulo tracks information about tables in metadata tables. The metadata for
most tables is contained within the metadata table in the accumulo namespace,
while metadata for that table is contained in the root table in the accumulo
namespace. The root table is composed of a single tablet, which does not
split, so it is also called the root tablet. Information about the root
table, such as its location and write-ahead logs, are stored in ZooKeeper.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s create a table and put some data into it:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>shell&gt; createtable test
shell&gt; tables -l
accumulo.metadata =&gt; !0
accumulo.root =&gt; +r
test =&gt; 2
trace =&gt; 1
shell&gt; insert a b c d
shell&gt; flush -w</pre>
</div>
</div>
<div class="paragraph">
<p>Now let&#8217;s take a look at the metadata for this table:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>shell&gt; table accumulo.metadata
shell&gt; scan -b 3; -e 3&lt;
3&lt; file:/default_tablet/F000009y.rf [] 186,1
3&lt; last:13fe86cd27101e5 [] 127.0.0.1:9997
3&lt; loc:13fe86cd27101e5 [] 127.0.0.1:9997
3&lt; log:127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995 [] 127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995|6
3&lt; srv:dir [] /default_tablet
3&lt; srv:flush [] 1
3&lt; srv:lock [] tservers/127.0.0.1:9997/zlock-0000000001$13fe86cd27101e5
3&lt; srv:time [] M1373998392323
3&lt; ~tab:~pr [] \x00</pre>
</div>
</div>
<div class="paragraph">
<p>Let&#8217;s decode this little session:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>scan -b 3; -e 3&lt;</code></dt>
<dd>
<p>Every tablet gets its own row. Every row starts with the table id followed by
<code>;</code> or <code>&lt;</code>, and followed by the end row split point for that tablet.</p>
</dd>
<dt class="hdlist1"><code>file:/default_tablet/F000009y.rf [] 186,1</code></dt>
<dd>
<p>File entry for this tablet. This tablet contains a single file reference. The
file is <code>/accumulo/tables/3/default_tablet/F000009y.rf</code>. It contains 1
key/value pair, and is 186 bytes long.</p>
</dd>
<dt class="hdlist1"><code>last:13fe86cd27101e5 [] 127.0.0.1:9997</code></dt>
<dd>
<p>Last location for this tablet. It was last held on 127.0.0.1:9997, and the
unique tablet server lock data was <code>13fe86cd27101e5</code>. The default balancer
will tend to put tablets back on their last location.</p>
</dd>
<dt class="hdlist1"><code>loc:13fe86cd27101e5 [] 127.0.0.1:9997</code></dt>
<dd>
<p>The current location of this tablet.</p>
</dd>
<dt class="hdlist1"><code>log:127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995 [] 127.0. &#8230;</code></dt>
<dd>
<p>This tablet has a reference to a single write-ahead log. This file can be found in
<code>/accumulo/wal/127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995</code>. The value
of this entry could refer to multiple files. This tablet&#8217;s data is encoded as
<code>6</code> within the log.</p>
</dd>
<dt class="hdlist1"><code>srv:dir [] /default_tablet</code></dt>
<dd>
<p>Files written for this tablet will be placed into
<code>/accumulo/tables/3/default_tablet</code>.</p>
</dd>
<dt class="hdlist1"><code>srv:flush [] 1</code></dt>
<dd>
<p>Flush id. This table has successfully completed the flush with the id of <code>1</code>.</p>
</dd>
<dt class="hdlist1"><code>srv:lock [] tservers/127.0.0.1:9997/zlock-0000000001\$13fe86cd27101e5</code></dt>
<dd>
<p>This is the lock information for the tablet holding the present lock. This
information is checked against zookeeper whenever this is updated, which
prevents a metadata update from a tablet server that no longer holds its
lock.</p>
</dd>
<dt class="hdlist1"><code>srv:time [] M1373998392323</code></dt>
<dd>
<p>This indicates the time time type (<code>M</code> for milliseconds or <code>L</code> for logical) and the timestamp of the most recently written key in this tablet. It is used to ensure automatically assigned key timestamps are strictly increasing for the tablet, regardless of the tablet server&#8217;s system time.</p>
</dd>
<dt class="hdlist1"><code>~tab:~pr [] \x00</code></dt>
<dd>
<p>The end-row marker for the previous tablet (prev-row). The first byte
indicates the presence of a prev-row. This tablet has the range (-inf, +inf),
so it has no prev-row (or end row).</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Besides these columns, you may see:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>rowId future:zooKeeperID location</code></dt>
<dd>
<p>Tablet has been assigned to a tablet, but not yet loaded.</p>
</dd>
<dt class="hdlist1"><code>~del:filename</code></dt>
<dd>
<p>When a tablet server is done use a file, it will create a delete marker in the appropriate metadata table, unassociated with any tablet. The garbage collector will remove the marker, and the file, when no other reference to the file exists.</p>
</dd>
<dt class="hdlist1"><code>~blip:txid</code></dt>
<dd>
<p>Bulk-Load In Progress marker.</p>
</dd>
<dt class="hdlist1"><code>rowId loaded:filename</code></dt>
<dd>
<p>A file has been bulk-loaded into this tablet, however the bulk load has not yet completed on other tablets, so this marker prevents the file from being loaded multiple times.</p>
</dd>
<dt class="hdlist1"><code>rowId !cloned</code></dt>
<dd>
<p>A marker that indicates that this tablet has been successfully cloned.</p>
</dd>
<dt class="hdlist1"><code>rowId splitRatio:ratio</code></dt>
<dd>
<p>A marker that indicates a split is in progress, and the files are being split at the given ratio.</p>
</dd>
<dt class="hdlist1"><code>rowId chopped</code></dt>
<dd>
<p>A marker that indicates that the files in the tablet do not contain keys outside the range of the tablet.</p>
</dd>
<dt class="hdlist1"><code>rowId scan</code></dt>
<dd>
<p>A marker that prevents a file from being removed while there are still active scans using it.</p>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="_simple_system_recovery">15.7. Simple System Recovery</h3>
<div class="paragraph">
<p><strong>Q</strong>: One of my Accumulo processes died. How do I bring it back?</p>
</div>
<div class="paragraph">
<p>The easiest way to bring all services online for an Accumulo instance is to run the <code>start-all.sh</code> script.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ bin/start-all.sh</pre>
</div>
</div>
<div class="paragraph">
<p>This process will check the process listing, using <code>jps</code> on each host before attempting to restart a service on the given host.
Typically, this check is sufficient except in the face of a hung/zombie process. For large clusters, it may be
undesirable to ssh to every node in the cluster to ensure that all hosts are running the appropriate processes and <code>start-here.sh</code> may be of use.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ ssh host_with_dead_process
$ bin/start-here.sh</pre>
</div>
</div>
<div class="paragraph">
<p><code>start-here.sh</code> should be invoked on the host which is missing a given process. Like start-all.sh, it will start all
necessary processes that are not currently running, but only on the current host and not cluster-wide. Tools such as <code>pssh</code> or
<code>pdsh</code> can be used to automate this process.</p>
</div>
<div class="paragraph">
<p><code>start-server.sh</code> can also be used to start a process on a given host; however, it is not generally recommended for
users to issue this directly as the <code>start-all.sh</code> and <code>start-here.sh</code> scripts provide the same functionality with
more automation and are less prone to user error.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use <code>start-all.sh</code> or <code>start-here.sh</code>.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: My process died again. Should I restart it via <code>cron</code> or tools like <code>supervisord</code>?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: A repeatedly dying Accumulo process is a sign of a larger problem. Typically these problems are due to a
misconfiguration of Accumulo or over-saturation of resources. Blind automation of any service restart inside of Accumulo
is generally an undesirable situation as it is indicative of a problem that is being masked and ignored. Accumulo
processes should be stable on the order of months and not require frequent restart.</p>
</div>
</div>
<div class="sect2">
<h3 id="_advanced_system_recovery">15.8. Advanced System Recovery</h3>
<div class="sect3">
<h4 id="_hdfs_failure">15.8.1. HDFS Failure</h4>
<div class="paragraph">
<p><strong>Q</strong>: I had disasterous HDFS failure. After bringing everything back up, several tablets refuse to go online.</p>
</div>
<div class="paragraph">
<p>Data written to tablets is written into memory before being written into indexed files. In case the server
is lost before the data is saved into a an indexed file, all data stored in memory is first written into a
write-ahead log (WAL). When a tablet is re-assigned to a new tablet server, the write-ahead logs are read to
recover any mutations that were in memory when the tablet was last hosted.</p>
</div>
<div class="paragraph">
<p>If a write-ahead log cannot be read, then the tablet is not re-assigned. All it takes is for one of
the blocks in the write-ahead log to be missing. This is unlikely unless multiple data nodes in HDFS have been
lost.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Get the WAL files online and healthy. Restore any data nodes that may be down.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: How do find out which tablets are offline?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Use <code>accumulo admin checkTablets</code></p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ bin/accumulo admin checkTablets</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Q</strong>: I lost three data nodes, and I&#8217;m missing blocks in a WAL. I don&#8217;t care about data loss, how
can I get those tablets online?</p>
</div>
<div class="paragraph">
<p>See the discussion in <a href="#metadata">System Metadata Tables</a>, which shows a typical metadata table listing.
The entries with a column family of <code>log</code> are references to the WAL for that tablet.
If you know what WAL is bad, you can find all the references with a grep in the shell:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>shell&gt; grep 0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995
3&lt; log:127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995 [] 127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995|6</pre>
</div>
</div>
<div class="paragraph">
<p><strong>A</strong>: You can remove the WAL references in the metadata table.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>shell&gt; grant -u root Table.WRITE -t accumulo.metadata
shell&gt; delete 3&lt; log 127.0.0.1+9997/0cb7ce52-ac46-4bf7-ae1d-acdcfaa97995</pre>
</div>
</div>
<div class="paragraph">
<p>Note: the colon (<code>:</code>) is omitted when specifying the <em>row cf cq</em> for the delete command.</p>
</div>
<div class="paragraph">
<p>The master will automatically discover the tablet no longer has a bad WAL reference and will
assign the tablet. You will need to remove the reference from all the tablets to get them
online.</p>
</div>
<div class="paragraph">
<p><strong>Q</strong>: The metadata (or root) table has references to a corrupt WAL.</p>
</div>
<div class="paragraph">
<p>This is a much more serious state, since losing updates to the metadata table will result
in references to old files which may not exist, or lost references to new files, resulting
in tablets that cannot be read, or large amounts of data loss.</p>
</div>
<div class="paragraph">
<p>The best hope is to restore the WAL by fixing HDFS data nodes and bringing the data back online.
If this is not possible, the best approach is to re-create the instance and bulk import all files from
the old instance into a new tables.</p>
</div>
<div class="paragraph">
<p>A complete set of instructions for doing this is outside the scope of this guide,
but the basic approach is:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Use <code>tables -l</code> in the shell to discover the table name to table id mapping</p>
</li>
<li>
<p>Stop all accumulo processes on all nodes</p>
</li>
<li>
<p>Move the accumulo directory in HDFS out of the way:
$ hadoop fs -mv /accumulo /corrupt</p>
</li>
<li>
<p>Re-initalize accumulo</p>
</li>
<li>
<p>Recreate tables, users and permissions</p>
</li>
<li>
<p>Import the directories under <code>/corrupt/tables/&lt;id&gt;</code> into the new instance</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Q</strong>: One or more HDFS Files under /accumulo/tables are corrupt</p>
</div>
<div class="paragraph">
<p>Accumulo maintains multiple references into the tablet files in the metadata
tables and within the tablet server hosting the file, this makes it difficult to
reliably just remove those references.</p>
</div>
<div class="paragraph">
<p>The directory structure in HDFS for tables will follow the general structure:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>/accumulo
/accumulo/tables/
/accumulo/tables/!0
/accumulo/tables/!0/default_tablet/A000001.rf
/accumulo/tables/!0/t-00001/A000002.rf
/accumulo/tables/1
/accumulo/tables/1/default_tablet/A000003.rf
/accumulo/tables/1/t-00001/A000004.rf
/accumulo/tables/1/t-00001/A000005.rf
/accumulo/tables/2/default_tablet/A000006.rf
/accumulo/tables/2/t-00001/A000007.rf</pre>
</div>
</div>
<div class="paragraph">
<p>If files under <code>/accumulo/tables</code> are corrupt, the best course of action is to
recover those files in hdsf see the section on HDFS. Once these recovery efforts
have been exhausted, the next step depends on where the missing file(s) are
located. Different actions are required when the bad files are in Accumulo data
table files or if they are metadata table files.</p>
</div>
<div class="paragraph">
<p><strong>Data File Corruption</strong></p>
</div>
<div class="paragraph">
<p>When an Accumulo data file is corrupt, the most reliable way to restore Accumulo
operations is to replace the missing file with an &#8220;empty&#8221; file so that
references to the file in the METADATA table and within the tablet server
hosting the file can be resolved by Accumulo. An empty file can be created using
the CreateEmpty utiity:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ accumulo org.apache.accumulo.core.file.rfile.CreateEmpty /path/to/empty/file/empty.rf</pre>
</div>
</div>
<div class="paragraph">
<p>The process is to delete the corrupt file and then move the empty file into its
place (The generated empty file can be copied and used multiple times if necessary and does not need
to be regenerated each time)</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ hadoop fs –rm /accumulo/tables/corrupt/file/thename.rf; \
hadoop fs -mv /path/to/empty/file/empty.rf /accumulo/tables/corrupt/file/thename.rf</pre>
</div>
</div>
<div class="paragraph">
<p><strong>Metadata File Corruption</strong></p>
</div>
<div class="paragraph">
<p>If the corrupt files are metadata files, see <a href="#metadata">System Metadata Tables</a> (under the path
<code>/accumulo/tables/!0</code>) then you will need to rebuild
the metadata table by initializing a new instance of Accumulo and then importing
all of the existing data into the new instance. This is the same procedure as
recovering from a zookeeper failure (see <a href="#zookeeper_failure">ZooKeeper Failure</a>), except that
you will have the benefit of having the existing user and table authorizations
that are maintained in zookeeper.</p>
</div>
<div class="paragraph">
<p>You can use the DumpZookeeper utility to save this information for reference
before creating the new instance. You will not be able to use RestoreZookeeper
because the table names and references are likely to be different between the
original and the new instances, but it can serve as a reference.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: If the files cannot be recovered, replace corrupt data files with a empty
rfiles to allow references in the metadata table and in the tablet servers to be
resolved. Rebuild the metadata table if the corrupt files are metadata files.</p>
</div>
</div>
<div class="sect3">
<h4 id="zookeeper_failure">15.8.2. ZooKeeper Failure</h4>
<div class="paragraph">
<p><strong>Q</strong>: I lost my ZooKeeper quorum (hardware failure), but HDFS is still intact. How can I recover my Accumulo instance?</p>
</div>
<div class="paragraph">
<p>ZooKeeper, in addition to its lock-service capabilities, also serves to bootstrap an Accumulo
instance from some location in HDFS. It contains the pointers to the root tablet in HDFS which
is then used to load the Accumulo metadata tablets, which then loads all user tables. ZooKeeper
also stores all namespace and table configuration, the user database, the mapping of table IDs to
table names, and more across Accumulo restarts.</p>
</div>
<div class="paragraph">
<p>Presently, the only way to recover such an instance is to initialize a new instance and import all
of the old data into the new instance. The easiest way to tackle this problem is to first recreate
the mapping of table ID to table name and then recreate each of those tables in the new instance.
Set any necessary configuration on the new tables and add some split points to the tables to close
the gap between how many splits the old table had and no splits.</p>
</div>
<div class="paragraph">
<p>The directory structure in HDFS for tables will follow the general structure:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>/accumulo
/accumulo/tables/
/accumulo/tables/1
/accumulo/tables/1/default_tablet/A000001.rf
/accumulo/tables/1/t-00001/A000002.rf
/accumulo/tables/1/t-00001/A000003.rf
/accumulo/tables/2/default_tablet/A000004.rf
/accumulo/tables/2/t-00001/A000005.rf</pre>
</div>
</div>
<div class="paragraph">
<p>For each table, make a new directory that you can move (or copy if you have the HDFS space to do so)
all of the rfiles for a given table into. For example, to process the table with an ID of <code>1</code>, make a new directory,
say <code>/new-table-1</code> and then copy all files from <code>/accumulo/tables/1/*/*.rf</code> into that directory. Additionally,
make a directory, <code>/new-table-1-failures</code>, for any failures during the import process. Then, issue the import
command using the Accumulo shell into the new table, telling Accumulo to not re-set the timestamp:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>user@instance new_table&gt; importdirectory /new-table-1 /new-table-1-failures false</pre>
</div>
</div>
<div class="paragraph">
<p>Any RFiles which were failed to be loaded will be placed in <code>/new-table-1-failures</code>. Rfiles that were successfully
imported will no longer exist in <code>/new-table-1</code>. For failures, move them back to the import directory and retry
the <code>importdirectory</code> command.</p>
</div>
<div class="paragraph">
<p>It is <strong>extremely</strong> important to note that this approach may introduce stale data back into
the tables. For a few reasons, RFiles may exist in the table directory which are candidates for deletion but have
not yet been deleted. Additionally, deleted data which was not compacted away, but still exists in write-ahead logs if
the original instance was somehow recoverable, will be re-introduced in the new instance. Table splits and merges
(which also include the deleteRows API call on TableOperations, are also vulnerable to this problem. This process should
<strong>not</strong> be used if these are unacceptable risks. It is possible to try to re-create a view of the <code>accumulo.metadata</code>
table to prune out files that are candidates for deletion, but this is a difficult task that also may not be entirely accurate.</p>
</div>
<div class="paragraph">
<p>Likewise, it is also possible that data loss may occur from write-ahead log (WAL) files which existed on the old table but
were not minor-compacted into an RFile. Again, it may be possible to reconstruct the state of these WAL files to
replay data not yet in an RFile; however, this is a difficult task and is not implemented in any automated fashion.</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: The <code>importdirectory</code> shell command can be used to import RFiles from the old instance into a newly created instance,
but extreme care should go into the decision to do this as it may result in reintroduction of stale data or the
omission of new data.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_upgrade_issues">15.9. Upgrade Issues</h3>
<div class="paragraph">
<p><strong>Q</strong>: I upgrade from 1.4 to 1.5 to 1.6 but still have some WAL files on local disk. Do I have any way
to recover them?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: Yes, you can recover them by running the LocalWALRecovery utility on each node that needs
recovery performed. The utility will default to using the directory specified by <code>logger.dir.walog</code> in your
configuration, or can be overriden by using the <code>--local-wal-directories</code> option on the tool. It can be
invoked as follows:</p>
<div class="literalblock">
<div class="content">
<pre>$ACCUMULO_HOME/bin/accumulo org.apache.accumulo.tserver.log.LocalWALRecovery</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_file_naming_conventions">15.10. File Naming Conventions</h3>
<div class="paragraph">
<p><strong>Q</strong>: Why are files named like they are? Why do some start with <code>C</code> and others with <code>F</code>?</p>
</div>
<div class="paragraph">
<p><strong>A</strong>: The file names give you a basic idea for the source of the file.</p>
</div>
<div class="paragraph">
<p>The base of the filename is a base-36 unique number. All filenames in accumulo are coordinated
with a counter in zookeeper, so they are always unique, which is useful for debugging.</p>
</div>
<div class="paragraph">
<p>The leading letter gives you an idea of how the file was created:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>F</code></dt>
<dd>
<p>Flush: entries in memory were written to a file (Minor Compaction)</p>
</dd>
<dt class="hdlist1"><code>M</code></dt>
<dd>
<p>Merging compaction: entries in memory were combined with the smallest file to create one new file</p>
</dd>
<dt class="hdlist1"><code>C</code></dt>
<dd>
<p>Several files, but not all files, were combined to produce this file (Major Compaction)</p>
</dd>
<dt class="hdlist1"><code>A</code></dt>
<dd>
<p>All files were compacted, delete entries were dropped</p>
</dd>
<dt class="hdlist1"><code>I</code></dt>
<dd>
<p>Bulk import, complete, sorted index files. Always in a directory starting with <code>b-</code></p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>This simple file naming convention allows you to see the basic structure of the files from just
their filenames, and reason about what should be happening to them next, just
by scanning their entries in the metadata tables.</p>
</div>
<div class="paragraph">
<p>For example, if you see multiple files with <code>M</code> prefixes, the tablet is, or was, up against its
maximum file limit, so it began merging memory updates with files to keep the file count reasonable. This
slows down ingest performance, so knowing there are many files like this tells you that the system
is struggling to keep up with ingest vs the compaction strategy which reduces the number of files.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuration">16. Appendix A: Configuration Management</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_configuration_overview">16.1. Configuration Overview</h3>
<div class="paragraph">
<p>All accumulo properties have a default value in the source code. Properties can also be set
in accumulo-site.xml and in zookeeper on per-table or system-wide basis. If properties are set in more than one location,
accumulo will choose the property with the highest precedence. This order of precedence is described
below (from highest to lowest):</p>
</div>
<div class="sect3">
<h4 id="_zookeeper_table_properties">16.1.1. Zookeeper table properties</h4>
<div class="paragraph">
<p>Table properties are applied to the entire cluster when set in zookeeper using the accumulo API or shell. While table properties take precedent over system properties, both will override properties set in accumulo-site.xml</p>
</div>
<div class="paragraph">
<p>Table properties consist of all properties with the table.* prefix. Table properties are configured on a per-table basis using the following shell commmand:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>config -t TABLE -s PROPERTY=VALUE</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_zookeeper_system_properties">16.1.2. Zookeeper system properties</h4>
<div class="paragraph">
<p>System properties are applied to the entire cluster when set in zookeeper using the accumulo API or shell. System properties consist of all properties with a <code>yes</code> in the <em>Zookeeper Mutable</em> column in the table below. They are set with the following shell command:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>config -s PROPERTY=VALUE</pre>
</div>
</div>
<div class="paragraph">
<p>If a table.* property is set using this method, the value will apply to all tables except those configured on per-table basis (which have higher precedence).</p>
</div>
<div class="paragraph">
<p>While most system properties take effect immediately, some require a restart of the process which is indicated in <em>Zookeeper Mutable</em>.</p>
</div>
</div>
<div class="sect3">
<h4 id="_accumulo_site_xml">16.1.3. accumulo-site.xml</h4>
<div class="paragraph">
<p>Accumulo processes (master, tserver, etc) read their local accumulo-site.xml on start up. Therefore, changes made to accumulo-site.xml must rsynced across the cluster and processes must be restarted to apply changes.</p>
</div>
<div class="paragraph">
<p>Certain properties (indicated by a <code>no</code> in <em>Zookeeper Mutable</em>) cannot be set in zookeeper and only set in this file. The accumulo-site.xml also allows you to configure tablet servers with different settings.</p>
</div>
</div>
<div class="sect3">
<h4 id="_default_values">16.1.4. Default Values</h4>
<div class="paragraph">
<p>All properties have a default value in the source code. This value has the lowest precedence and is overriden if set in accumulo-site.xml or zookeeper.</p>
</div>
<div class="paragraph">
<p>While the default value is usually optimal, there are cases where a change can increase query and ingest performance.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_configuration_in_the_shell">16.2. Configuration in the Shell</h3>
<div class="paragraph">
<p>The <code>config</code> command in the shell allows you to view the current system configuration. You can also use the <code>-t</code> option to view a table&#8217;s configuration as below:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ ./bin/accumulo shell -u root
Enter current password for 'root'@'accumulo-instance': ******
Shell - Apache Accumulo Interactive Shell
-
- version: 1.6.0
- instance name: accumulo-instance
- instance id: 4f48fa03-f692-43ce-ae03-94c9ea8b7181
-
- type 'help' for a list of available commands
-
root@accumulo-instance&gt; config -t foo
---------+---------------------------------------------+------------------------------------------------------
SCOPE | NAME | VALUE
---------+---------------------------------------------+------------------------------------------------------
default | table.balancer ............................ | org.apache.accumulo.server.master.balancer.DefaultLoadBalancer
default | table.bloom.enabled ....................... | false
default | table.bloom.error.rate .................... | 0.5%
default | table.bloom.hash.type ..................... | murmur
default | table.bloom.key.functor ................... | org.apache.accumulo.core.file.keyfunctor.RowFunctor
default | table.bloom.load.threshold ................ | 1
default | table.bloom.size .......................... | 1048576
default | table.cache.block.enable .................. | false
default | table.cache.index.enable .................. | false
default | table.compaction.major.everything.at ...... | 19700101000000GMT
default | table.compaction.major.everything.idle .... | 1h
default | table.compaction.major.ratio .............. | 1.3
site | @override .............................. | 1.4
system | @override .............................. | 1.5
table | @override .............................. | 1.6
default | table.compaction.minor.idle ............... | 5m
default | table.compaction.minor.logs.threshold ..... | 3
default | table.failures.ignore ..................... | false</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_available_properties">16.3. Available Properties</h3>
<div class="paragraph">
<p>Jump to:
<a href="#RPC_PREFIX">rpc.*</a> | <a href="#INSTANCE_PREFIX">instance.*</a> | <a href="#GENERAL_PREFIX">general.*</a> | <a href="#MASTER_PREFIX">master.*</a> | <a href="#TSERV_PREFIX">tserver.*</a> | <a href="#LOGGER_PREFIX">logger.*</a> | <a href="#GC_PREFIX">gc.*</a> | <a href="#MONITOR_PREFIX">monitor.*</a> | <a href="#TRACE_PREFIX">trace.*</a> | <a href="#TRACE_TOKEN_PROPERTY_PREFIX">trace.token.property.*</a> | <a href="#TABLE_PREFIX">table.*</a> | <a href="#TABLE_CONSTRAINT_PREFIX">table.constraint.*</a> | <a href="#TABLE_ITERATOR_PREFIX">table.iterator.*</a> | <a href="#TABLE_LOCALITY_GROUP_PREFIX">table.group.*</a> | <a href="#TABLE_COMPACTION_STRATEGY_PREFIX">table.majc.compaction.strategy.opts.*</a> | <a href="#VFS_CONTEXT_CLASSPATH_PROPERTY">general.vfs.context.classpath.*</a></p>
</div>
<div class="sect3">
<h4 id="RPC_PREFIX">16.3.1. rpc.*</h4>
<div class="paragraph">
<p>Properties in this category related to the configuration of SSL keys for RPC. See also instance.ssl.enabled</p>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_keystore">rpc.javax.net.ssl.keyStore</h5>
<div class="paragraph">
<p>Path of the keystore file for the servers' private SSL key</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PATH<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>$ACCUMULO_CONF_DIR/ssl/keystore.jks</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_keystorepassword">rpc.javax.net.ssl.keyStorePassword</h5>
<div class="paragraph">
<p>Password used to encrypt the SSL private keystore. Leave blank to use the Accumulo instance secret</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_keystoretype">rpc.javax.net.ssl.keyStoreType</h5>
<div class="paragraph">
<p>Type of SSL keystore</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>jks</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_truststore">rpc.javax.net.ssl.trustStore</h5>
<div class="paragraph">
<p>Path of the truststore file for the root cert</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PATH<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>$ACCUMULO_CONF_DIR/ssl/truststore.jks</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_truststorepassword">rpc.javax.net.ssl.trustStorePassword</h5>
<div class="paragraph">
<p>Password used to encrypt the SSL truststore. Leave blank to use no password</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_javax_net_ssl_truststoretype">rpc.javax.net.ssl.trustStoreType</h5>
<div class="paragraph">
<p>Type of SSL truststore</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>jks</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_rpc_usejsse">rpc.useJsse</h5>
<div class="paragraph">
<p>Use JSSE system properties to configure SSL rather than the rpc.javax.net.ssl.* Accumulo properties</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="INSTANCE_PREFIX">16.3.2. instance.*</h4>
<div class="paragraph">
<p>Properties in this category must be consistent throughout a cloud. This is enforced and servers won&#8217;t be able to communicate if these differ.</p>
</div>
<div class="sect4">
<h5 id="_instance_dfs_dir">instance.dfs.dir</h5>
<div class="paragraph">
<p><span class="line-through"><em>Deprecated.</em> HDFS directory in which accumulo instance will run. Do not change after accumulo is initialized.</span></p>
</div>
<div class="paragraph">
<p><span class="line-through"><em>Type:</em> ABSOLUTEPATH</span><br>
<span class="line-through"><em>Zookeeper Mutable:</em> no</span><br>
<span class="line-through"><em>Default Value:</em> <code>/accumulo</code></span></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_dfs_uri">instance.dfs.uri</h5>
<div class="paragraph">
<p><span class="line-through"><em>Deprecated.</em> A url accumulo should use to connect to DFS. If this is empty, accumulo will obtain this information from the hadoop configuration. This property will only be used when creating new files if instance.volumes is empty. After an upgrade to 1.6.0 Accumulo will start using absolute paths to reference files. Files created before a 1.6.0 upgrade are referenced via relative paths. Relative paths will always be resolved using this config (if empty using the hadoop config).</span></p>
</div>
<div class="paragraph">
<p><span class="line-through"><em>Type:</em> URI</span><br>
<span class="line-through"><em>Zookeeper Mutable:</em> no</span><br>
<span class="line-through"><em>Default Value:</em> <em>empty</em></span></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_rpc_ssl_clientauth">instance.rpc.ssl.clientAuth</h5>
<div class="paragraph">
<p>Require clients to present certs signed by a trusted root</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_rpc_ssl_enabled">instance.rpc.ssl.enabled</h5>
<div class="paragraph">
<p>Use SSL for socket connections from clients and among accumulo services</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_secret">instance.secret</h5>
<div class="paragraph">
<p>A secret unique to a given instance that all servers must know in order to communicate with one another. It should be changed prior to the initialization of Accumulo. To change after Accumulo has been initialized, use the ChangeSecret tool and then update conf/accumulo-site.xml everywhere. Before using the ChangeSecret tool, make sure Accumulo is not running and you are logged in as the user that controls Accumulo files in HDFS. To use the ChangeSecret tool, run the command: <code>./bin/accumulo org.apache.accumulo.server.util.ChangeSecret</code></p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>DEFAULT</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_security_authenticator">instance.security.authenticator</h5>
<div class="paragraph">
<p>The authenticator class that accumulo will use to determine if a user has privilege to perform an action</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.security.handler.ZKAuthenticator</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_security_authorizor">instance.security.authorizor</h5>
<div class="paragraph">
<p>The authorizor class that accumulo will use to determine what labels a user has privilege to see</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.security.handler.ZKAuthorizor</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_security_permissionhandler">instance.security.permissionHandler</h5>
<div class="paragraph">
<p>The permission handler class that accumulo will use to determine if a user has privilege to perform an action</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.security.handler.ZKPermHandler</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_volumes">instance.volumes</h5>
<div class="paragraph">
<p>A comma seperated list of dfs uris to use. Files will be stored across these filesystems. If this is empty, then instance.dfs.uri will be used. After adding uris to this list, run <em>accumulo init --add-volume</em> and then restart tservers. If entries are removed from this list then tservers will need to be restarted. After a uri is removed from the list Accumulo will not create new files in that location, however Accumulo can still reference files created at that location before the config change. To use a comma or other reserved characters in a URI use standard URI hex encoding. For example replace commas with %2C.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_volumes_replacements">instance.volumes.replacements</h5>
<div class="paragraph">
<p>Since accumulo stores absolute URIs changing the location of a namenode could prevent Accumulo from starting. The property helps deal with that situation. Provide a comma seperated list of uri replacement pairs here if a namenode location changes. Each pair shold be separated with a space. For example, if hdfs://nn1 was repalced with hdfs://nnA and hdfs://nn2 was replaced with hdfs://nnB, then set this property to <em>hdfs://nn1 hdfs://nnA,hdfs://nn2 hdfs://nnB&#8217;Replacements must be configured for use. To see which volumes are currently in use, run 'accumulo admin volumes -l</em>. To use a comma or other reserved characters in a URI use standard URI hex encoding. For example replace commas with %2C.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_zookeeper_host">instance.zookeeper.host</h5>
<div class="paragraph">
<p>Comma separated list of zookeeper servers</p>
</div>
<div class="paragraph">
<p><em>Type:</em> HOSTLIST<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>localhost:2181</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_instance_zookeeper_timeout">instance.zookeeper.timeout</h5>
<div class="paragraph">
<p>Zookeeper session timeout; max value when represented as milliseconds should be no larger than 2147483647</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>30s</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="GENERAL_PREFIX">16.3.3. general.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of accumulo overall, but do not have to be consistent throughout a cloud.</p>
</div>
<div class="sect4">
<h5 id="_general_classpaths">general.classpaths</h5>
<div class="paragraph">
<p>A list of all of the places to look for a class. Order does matter, as it will look for the jar starting in the first location to the last. Please note, hadoop conf and hadoop lib directories NEED to be here, along with accumulo lib and zookeeper directory. Supports full regex on filename alone.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em></p>
</div>
<div class="listingblock">
<div class="content">
<pre>$ACCUMULO_CONF_DIR,
$ACCUMULO_HOME/lib/[^.].*.jar,
$ZOOKEEPER_HOME/zookeeper[^.].*.jar,
$HADOOP_CONF_DIR,
$HADOOP_PREFIX/[^.].*.jar,
$HADOOP_PREFIX/lib/[^.].*.jar,
$HADOOP_PREFIX/share/hadoop/common/.*.jar,
$HADOOP_PREFIX/share/hadoop/common/lib/.*.jar,
$HADOOP_PREFIX/share/hadoop/hdfs/.*.jar,
$HADOOP_PREFIX/share/hadoop/mapreduce/.*.jar,
/usr/lib/hadoop/[^.].*.jar,
/usr/lib/hadoop/lib/[^.].*.jar,
/usr/lib/hadoop-hdfs/[^.].*.jar,
/usr/lib/hadoop-mapreduce/[^.].*.jar,
/usr/lib/hadoop-yarn/[^.].*.jar,</pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_general_dynamic_classpaths">general.dynamic.classpaths</h5>
<div class="paragraph">
<p>A list of all of the places where changes in jars or classes will force a reload of the classloader.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>$ACCUMULO_HOME/lib/ext/[^.].*.jar</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_kerberos_keytab">general.kerberos.keytab</h5>
<div class="paragraph">
<p>Path to the kerberos keytab to use. Leave blank if not using kerberoized hdfs</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PATH<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_kerberos_principal">general.kerberos.principal</h5>
<div class="paragraph">
<p>Name of the kerberos principal to use. _HOST will automatically be replaced by the machines hostname in the hostname portion of the principal. Leave blank if not using kerberoized hdfs</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_rpc_timeout">general.rpc.timeout</h5>
<div class="paragraph">
<p>Time to wait on I/O for simple, short RPC calls</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>120s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_server_message_size_max">general.server.message.size.max</h5>
<div class="paragraph">
<p>The maximum size of a message that can be sent to a server.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>1G</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_server_simpletimer_threadpool_size">general.server.simpletimer.threadpool.size</h5>
<div class="paragraph">
<p>The number of threads to use for server-internal scheduled tasks</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>1</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_vfs_cache_dir">general.vfs.cache.dir</h5>
<div class="paragraph">
<p>Directory to use for the vfs cache. The cache will keep a soft reference to all of the classes loaded in the VM. This should be on local disk on each node with sufficient space. It defaults to ${java.io.tmpdir}/accumulo-vfs-cache-${user.name}</p>
</div>
<div class="paragraph">
<p><em>Type:</em> ABSOLUTEPATH<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>${java.io.tmpdir}/accumulo-vfs-cache-${user.name}</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_general_vfs_classpaths">general.vfs.classpaths</h5>
<div class="paragraph">
<p>Configuration for a system level vfs classloader. Accumulo jar can be configured here and loaded out of HDFS.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="MASTER_PREFIX">16.3.4. master.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of the master server</p>
</div>
<div class="sect4">
<h5 id="_master_bulk_retries">master.bulk.retries</h5>
<div class="paragraph">
<p>The number of attempts to bulk-load a file before giving up.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>3</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_bulk_threadpool_size">master.bulk.threadpool.size</h5>
<div class="paragraph">
<p>The number of threads to use when coordinating a bulk-import.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_bulk_timeout">master.bulk.timeout</h5>
<div class="paragraph">
<p>The time to wait for a tablet server to process a bulk import request</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_fate_threadpool_size">master.fate.threadpool.size</h5>
<div class="paragraph">
<p>The number of threads used to run FAult-Tolerant Executions. These are primarily table operations like merge.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>4</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_lease_recovery_interval">master.lease.recovery.interval</h5>
<div class="paragraph">
<p>The amount of time to wait after requesting a WAL file to be recovered</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_port_client">master.port.client</h5>
<div class="paragraph">
<p>The port used for handling client connections on the master</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> yes but requires restart of the master<br>
<em>Default Value:</em> <code>9999</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_recovery_delay">master.recovery.delay</h5>
<div class="paragraph">
<p>When a tablet server&#8217;s lock is deleted, it takes time for it to completely quit. This delay gives it time before log recoveries begin.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>10s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_recovery_max_age">master.recovery.max.age</h5>
<div class="paragraph">
<p>Recovery files older than this age will be removed.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>60m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_recovery_time_max">master.recovery.time.max</h5>
<div class="paragraph">
<p>The maximum time to attempt recovery before giving up</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>30m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_server_threadcheck_time">master.server.threadcheck.time</h5>
<div class="paragraph">
<p>The time between adjustments of the server thread pool.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_server_threads_minimum">master.server.threads.minimum</h5>
<div class="paragraph">
<p>The minimum number of threads to use to handle incoming requests.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>20</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_tablet_balancer">master.tablet.balancer</h5>
<div class="paragraph">
<p>The balancer class that accumulo will use to make tablet assignment and migration decisions.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.master.balancer.TableLoadBalancer</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_master_walog_closer_implementation">master.walog.closer.implementation</h5>
<div class="paragraph">
<p>A class that implements a mechansim to steal write access to a file</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.master.recovery.HadoopLogCloser</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="TSERV_PREFIX">16.3.5. tserver.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of the tablet servers</p>
</div>
<div class="sect4">
<h5 id="_tserver_archive_walogs">tserver.archive.walogs</h5>
<div class="paragraph">
<p>Keep copies of the WALOGs for debugging purposes</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_bloom_load_concurrent_max">tserver.bloom.load.concurrent.max</h5>
<div class="paragraph">
<p>The number of concurrent threads that will load bloom filters in the background. Setting this to zero will make bloom filters load in the foreground.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>4</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_bulk_assign_threads">tserver.bulk.assign.threads</h5>
<div class="paragraph">
<p>The master delegates bulk file processing and assignment to tablet servers. After the bulk file has been processed, the tablet server will assign the file to the appropriate tablets on all servers. This property controls the number of threads used to communicate to the other servers.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_bulk_process_threads">tserver.bulk.process.threads</h5>
<div class="paragraph">
<p>The master will task a tablet server with pre-processing a bulk file prior to assigning it to the appropriate tablet servers. This configuration value controls the number of threads used to process the files.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_bulk_retry_max">tserver.bulk.retry.max</h5>
<div class="paragraph">
<p>The number of times the tablet server will attempt to assign a file to a tablet as it migrates and splits.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_bulk_timeout">tserver.bulk.timeout</h5>
<div class="paragraph">
<p>The time to wait for a tablet server to process a bulk import request.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_cache_data_size">tserver.cache.data.size</h5>
<div class="paragraph">
<p>Specifies the size of the cache for file data blocks.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>128M</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_cache_index_size">tserver.cache.index.size</h5>
<div class="paragraph">
<p>Specifies the size of the cache for file indices.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>512M</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_client_timeout">tserver.client.timeout</h5>
<div class="paragraph">
<p>Time to wait for clients to continue scans before closing a session.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>3s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_compaction_major_concurrent_max">tserver.compaction.major.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of concurrent major compactions for a tablet server</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>3</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_compaction_major_delay">tserver.compaction.major.delay</h5>
<div class="paragraph">
<p>Time a tablet server will sleep between checking which tablets need compaction.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>30s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_compaction_major_thread_files_open_max">tserver.compaction.major.thread.files.open.max</h5>
<div class="paragraph">
<p>Max number of files a major compaction thread can open at once.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>10</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_compaction_minor_concurrent_max">tserver.compaction.minor.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of concurrent minor compactions for a tablet server</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>4</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_compaction_warn_time">tserver.compaction.warn.time</h5>
<div class="paragraph">
<p>When a compaction has not made progress for this time period, a warning will be logged</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>10m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_default_blocksize">tserver.default.blocksize</h5>
<div class="paragraph">
<p>Specifies a default blocksize for the tserver caches</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1M</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_dir_memdump">tserver.dir.memdump</h5>
<div class="paragraph">
<p>A long running scan could possibly hold memory that has been minor compacted. To prevent this, the in memory map is dumped to a local file and the scan is switched to that local file. We can not switch to the minor compacted file because it may have been modified by iterators. The file dumped to the local dir is an exact copy of what was in memory.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PATH<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>/tmp</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_files_open_idle">tserver.files.open.idle</h5>
<div class="paragraph">
<p>Tablet servers leave previously used files open for future queries. This setting determines how much time an unused file should be kept open until it is closed.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_hold_time_max">tserver.hold.time.max</h5>
<div class="paragraph">
<p>The maximum time for a tablet server to be in the "memory full" state. If the tablet server cannot write out memory in this much time, it will assume there is some failure local to its node, and quit. A value of zero is equivalent to forever.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_memory_manager">tserver.memory.manager</h5>
<div class="paragraph">
<p>An implementation of MemoryManger that accumulo will use.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.tabletserver.LargestFirstMemoryManager</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_memory_maps_max">tserver.memory.maps.max</h5>
<div class="paragraph">
<p>Maximum amount of memory that can be used to buffer data written to a tablet server. There are two other properties that can effectively limit memory usage table.compaction.minor.logs.threshold and tserver.walog.max.size. Ensure that table.compaction.minor.logs.threshold * tserver.walog.max.size &gt;= this property.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1G</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_memory_maps_native_enabled">tserver.memory.maps.native.enabled</h5>
<div class="paragraph">
<p>An in-memory data store for accumulo implemented in c++ that increases the amount of data accumulo can hold in memory and avoids Java GC pauses.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes but requires restart of the tserver<br>
<em>Default Value:</em> <code>true</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_metadata_readahead_concurrent_max">tserver.metadata.readahead.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of concurrent metadata read ahead that will execute.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>8</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_migrations_concurrent_max">tserver.migrations.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of concurrent tablet migrations for a tablet server</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_monitor_fs">tserver.monitor.fs</h5>
<div class="paragraph">
<p>When enabled the tserver will monitor file systems and kill itself when one switches from rw to ro. This is usually and indication that Linux has detected a bad disk.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>true</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_mutation_queue_max">tserver.mutation.queue.max</h5>
<div class="paragraph">
<p>The amount of memory to use to store write-ahead-log mutations-per-session before flushing them. Since the buffer is per write session, consider the max number of concurrent writer when configuring. When using Hadoop 2, Accumulo will call hsync() on the WAL . For a small number of concurrent writers, increasing this buffer size decreases the frequncy of hsync calls. For a large number of concurrent writers a small buffers size is ok because of group commit.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1M</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_port_client">tserver.port.client</h5>
<div class="paragraph">
<p>The port used for handling client connections on the tablet servers</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> yes but requires restart of the tserver<br>
<em>Default Value:</em> <code>9997</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_port_search">tserver.port.search</h5>
<div class="paragraph">
<p>if the ports above are in use, search higher ports until one is available</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_readahead_concurrent_max">tserver.readahead.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of concurrent read ahead that will execute. This effectively limits the number of long running scans that can run concurrently per tserver.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>16</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_recovery_concurrent_max">tserver.recovery.concurrent.max</h5>
<div class="paragraph">
<p>The maximum number of threads to use to sort logs during recovery</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>2</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_scan_files_open_max">tserver.scan.files.open.max</h5>
<div class="paragraph">
<p>Maximum total files that all tablets in a tablet server can open for scans.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes but requires restart of the tserver<br>
<em>Default Value:</em> <code>100</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_server_message_size_max">tserver.server.message.size.max</h5>
<div class="paragraph">
<p>The maximum size of a message that can be sent to a tablet server.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1G</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_server_threadcheck_time">tserver.server.threadcheck.time</h5>
<div class="paragraph">
<p>The time between adjustments of the server thread pool.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_server_threads_minimum">tserver.server.threads.minimum</h5>
<div class="paragraph">
<p>The minimum number of threads to use to handle incoming requests.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>20</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_session_idle_max">tserver.session.idle.max</h5>
<div class="paragraph">
<p>maximum idle time for a session</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_sort_buffer_size">tserver.sort.buffer.size</h5>
<div class="paragraph">
<p>The amount of memory to use when sorting logs during recovery.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>200M</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_tablet_split_midpoint_files_max">tserver.tablet.split.midpoint.files.max</h5>
<div class="paragraph">
<p>To find a tablets split points, all index files are opened. This setting determines how many index files can be opened at once. When there are more index files than this setting multiple passes must be made, which is slower. However opening too many files at once can cause problems.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>30</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_wal_blocksize">tserver.wal.blocksize</h5>
<div class="paragraph">
<p>The size of the HDFS blocks used to write to the Write-Ahead log. If zero, it will be 110% of tserver.walog.max.size (that is, try to use just one block)</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>0</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_wal_replication">tserver.wal.replication</h5>
<div class="paragraph">
<p>The replication to use when writing the Write-Ahead log to HDFS. If zero, it will use the HDFS default replication setting.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>0</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_wal_sync">tserver.wal.sync</h5>
<div class="paragraph">
<p>Use the SYNC_BLOCK create flag to sync WAL writes to disk. Prevents problems recovering from sudden system resets.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>true</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_wal_sync_method">tserver.wal.sync.method</h5>
<div class="paragraph">
<p>The method to invoke when sync'ing WALs. HSync will provide resiliency in the face of unexpected power outages, at the cost of speed. If method is not available, the legacy 'sync' method will be used to ensure backwards compatibility with older Hadoop versions. A value of 'hflush' is the alternative to the default value of 'hsync' which will result in faster writes, but with less durability. This property was added in Accumulo 1.6.1.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>hsync</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_walog_max_size">tserver.walog.max.size</h5>
<div class="paragraph">
<p>The maximum size for each write-ahead log. See comment for property tserver.memory.maps.max</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1G</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_walog_max_age">tserver.walog.max.age</h5>
<div class="paragraph">
<p>The maximum age for each write-ahead log.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>24h</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_tserver_workq_threads">tserver.workq.threads</h5>
<div class="paragraph">
<p>The number of threads for the distributed work queue. These threads are used for copying failed bulk files.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>2</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="LOGGER_PREFIX">16.3.6. logger.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of the write-ahead logger servers</p>
</div>
<div class="sect4">
<h5 id="_logger_dir_walog">logger.dir.walog</h5>
<div class="paragraph">
<p>The property only needs to be set if upgrading from 1.4 which used to store write-ahead logs on the local filesystem. In 1.5 write-ahead logs are stored in DFS. When 1.5 is started for the first time it will copy any 1.4 write ahead logs into DFS. It is possible to specify a comma-separated list of directories.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PATH<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>walogs</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="GC_PREFIX">16.3.7. gc.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of the accumulo garbage collector.</p>
</div>
<div class="sect4">
<h5 id="_gc_cycle_delay">gc.cycle.delay</h5>
<div class="paragraph">
<p>Time between garbage collection cycles. In each cycle, old files no longer in use are removed from the filesystem.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_cycle_start">gc.cycle.start</h5>
<div class="paragraph">
<p>Time to wait before attempting to garbage collect any old files.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>30s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_port_client">gc.port.client</h5>
<div class="paragraph">
<p>The listening port for the garbage collector&#8217;s monitor service</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> yes but requires restart of the gc<br>
<em>Default Value:</em> <code>50091</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_threads_delete">gc.threads.delete</h5>
<div class="paragraph">
<p>The number of threads used to delete files</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>16</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_trash_ignore">gc.trash.ignore</h5>
<div class="paragraph">
<p>Do not use the Trash, even if it is configured</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_file_archive">gc.file.archive</h5>
<div class="paragraph">
<p>Archive any files/directories instead of moving to the HDFS trash or deleting</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_gc_wal_dead_server_wait">gc.wal.dead.server.wait</h5>
<div class="paragraph">
<p>Archive any files/directories instead of moving to the HDFS trash or deleting</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1h</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="MONITOR_PREFIX">16.3.8. monitor.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of the monitor web server.</p>
</div>
<div class="sect4">
<h5 id="_monitor_banner_background">monitor.banner.background</h5>
<div class="paragraph">
<p>The background color of the banner text displayed on the monitor page.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>#304065</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_monitor_banner_color">monitor.banner.color</h5>
<div class="paragraph">
<p>The color of the banner text displayed on the monitor page.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>#c4c4c4</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_monitor_banner_text">monitor.banner.text</h5>
<div class="paragraph">
<p>The banner text displayed on the monitor page.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_monitor_lock_check_interval">monitor.lock.check.interval</h5>
<div class="paragraph">
<p>The amount of time to sleep between checking for the Montior ZooKeeper lock</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>5s</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_monitor_port_client">monitor.port.client</h5>
<div class="paragraph">
<p>The listening port for the monitor&#8217;s http service</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>50095</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_monitor_port_log4j">monitor.port.log4j</h5>
<div class="paragraph">
<p>The listening port for the monitor&#8217;s log4j logging collection.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>4560</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="TRACE_PREFIX">16.3.9. trace.*</h4>
<div class="paragraph">
<p>Properties in this category affect the behavior of distributed tracing.</p>
</div>
<div class="sect4">
<h5 id="_trace_password">trace.password</h5>
<div class="paragraph">
<p>The password for the user used to store distributed traces</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>secret</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_trace_port_client">trace.port.client</h5>
<div class="paragraph">
<p>The listening port for the trace server</p>
</div>
<div class="paragraph">
<p><em>Type:</em> PORT<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>12234</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_trace_table">trace.table</h5>
<div class="paragraph">
<p>The name of the table to store distributed traces</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>trace</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_trace_token_type">trace.token.type</h5>
<div class="paragraph">
<p>An AuthenticationToken type supported by the authorizer</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>org.apache.accumulo.core.client.security.tokens.PasswordToken</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_trace_user">trace.user</h5>
<div class="paragraph">
<p>The name of the user to store distributed traces</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> no<br>
<em>Default Value:</em> <code>root</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="TRACE_TOKEN_PROPERTY_PREFIX">16.3.10. trace.token.property.*</h4>
<div class="paragraph">
<p>The prefix used to create a token for storing distributed traces. For each propetry required by trace.token.type, place this prefix in front of it.</p>
</div>
</div>
<div class="sect3">
<h4 id="TABLE_PREFIX">16.3.11. table.*</h4>
<div class="paragraph">
<p>Properties in this category affect tablet server treatment of tablets, but can be configured on a per-table basis. Setting these properties in the site file will override the default globally for all tables and not any specific table. However, both the default and the global setting can be overridden per table using the table operations API or in the shell, which sets the overridden value in zookeeper. Restarting accumulo tablet servers after setting these properties in the site file will cause the global setting to take effect. However, you must use the API or the shell to change properties in zookeeper that are set on a table.</p>
</div>
<div class="sect4">
<h5 id="_table_balancer">table.balancer</h5>
<div class="paragraph">
<p>This property can be set to allow the LoadBalanceByTable load balancer to change the called Load Balancer for this table</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.server.master.balancer.DefaultLoadBalancer</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_enabled">table.bloom.enabled</h5>
<div class="paragraph">
<p>Use bloom filters on this table.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_error_rate">table.bloom.error.rate</h5>
<div class="paragraph">
<p>Bloom filter error rate.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> FRACTION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>0.5%</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_hash_type">table.bloom.hash.type</h5>
<div class="paragraph">
<p>The bloom filter hash type</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>murmur</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_key_functor">table.bloom.key.functor</h5>
<div class="paragraph">
<p>A function that can transform the key prior to insertion and check of bloom filter. org.apache.accumulo.core.file.keyfunctor.RowFunctor,,org.apache.accumulo.core.file.keyfunctor.ColumnFamilyFunctor, and org.apache.accumulo.core.file.keyfunctor.ColumnQualifierFunctor are allowable values. One can extend any of the above mentioned classes to perform specialized parsing of the key.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.core.file.keyfunctor.RowFunctor</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_load_threshold">table.bloom.load.threshold</h5>
<div class="paragraph">
<p>This number of seeks that would actually use a bloom filter must occur before a file&#8217;s bloom filter is loaded. Set this to zero to initiate loading of bloom filters when a file is opened.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_bloom_size">table.bloom.size</h5>
<div class="paragraph">
<p>Bloom filter size, as number of keys.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1048576</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_cache_block_enable">table.cache.block.enable</h5>
<div class="paragraph">
<p>Determines whether file block cache is enabled.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_cache_index_enable">table.cache.index.enable</h5>
<div class="paragraph">
<p>Determines whether index cache is enabled.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>true</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_classpath_context">table.classpath.context</h5>
<div class="paragraph">
<p>Per table classpath context</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_compaction_major_everything_idle">table.compaction.major.everything.idle</h5>
<div class="paragraph">
<p>After a tablet has been idle (no mutations) for this time period it may have all of its files compacted into one. There is no guarantee an idle tablet will be compacted. Compactions of idle tablets are only started when regular compactions are not running. Idle compactions only take place for tablets that have one or more files.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1h</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_compaction_major_ratio">table.compaction.major.ratio</h5>
<div class="paragraph">
<p>minimum ratio of total input size to maximum input file size for running a major compactionWhen adjusting this property you may want to also adjust table.file.max. Want to avoid the situation where only merging minor compactions occur.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> FRACTION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>3</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_compaction_minor_idle">table.compaction.minor.idle</h5>
<div class="paragraph">
<p>After a tablet has been idle (no mutations) for this time period it may have its in-memory map flushed to disk in a minor compaction. There is no guarantee an idle tablet will be compacted.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> TIMEDURATION<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>5m</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_compaction_minor_logs_threshold">table.compaction.minor.logs.threshold</h5>
<div class="paragraph">
<p>When there are more than this many write-ahead logs against a tablet, it will be minor compacted. See comment for property tserver.memory.maps.max</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>3</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_failures_ignore">table.failures.ignore</h5>
<div class="paragraph">
<p>If you want queries for your table to hang or fail when data is missing from the system, then set this to false. When this set to true missing data will be reported but queries will still run possibly returning a subset of the data.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>false</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_blocksize">table.file.blocksize</h5>
<div class="paragraph">
<p>Overrides the hadoop dfs.block.size setting so that files have better query performance. The maximum value for this is 2147483647</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>0B</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_compress_blocksize">table.file.compress.blocksize</h5>
<div class="paragraph">
<p>Similar to the hadoop io.seqfile.compress.blocksize setting, so that files have better query performance. The maximum value for this is 2147483647. (This setting is the size threshold prior to compression, and applies even compression is disabled.)</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>100K</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_compress_blocksize_index">table.file.compress.blocksize.index</h5>
<div class="paragraph">
<p>Determines how large index blocks can be in files that support multilevel indexes. The maximum value for this is 2147483647. (This setting is the size threshold prior to compression, and applies even compression is disabled.)</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>128K</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_compress_type">table.file.compress.type</h5>
<div class="paragraph">
<p>One of gz,lzo,none</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>gz</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_max">table.file.max</h5>
<div class="paragraph">
<p>Determines the max # of files each tablet in a table can have. When adjusting this property you may want to consider adjusting table.compaction.major.ratio also. Setting this property to 0 will make it default to tserver.scan.files.open.max-1, this will prevent a tablet from having more files than can be opened. Setting this property low may throttle ingest and increase query performance.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>15</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_replication">table.file.replication</h5>
<div class="paragraph">
<p>Determines how many replicas to keep of a tables' files in HDFS. When this value is LTE 0, HDFS defaults are used.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> COUNT<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>0</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_file_type">table.file.type</h5>
<div class="paragraph">
<p>Change the type of file a table writes</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>rf</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_formatter">table.formatter</h5>
<div class="paragraph">
<p>The Formatter class to apply on results in the shell</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.core.util.format.DefaultFormatter</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_groups_enabled">table.groups.enabled</h5>
<div class="paragraph">
<p>A comma separated list of locality group names to enable for this table.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_interepreter">table.interepreter</h5>
<div class="paragraph">
<p>The ScanInterpreter class to apply on scan arguments in the shell</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.core.util.interpret.DefaultScanInterpreter</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_majc_compaction_strategy">table.majc.compaction.strategy</h5>
<div class="paragraph">
<p>A customizable major compaction strategy.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> CLASSNAME<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>org.apache.accumulo.tserver.compaction.DefaultCompactionStrategy</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_scan_max_memory">table.scan.max.memory</h5>
<div class="paragraph">
<p>The maximum amount of memory that will be used to cache results of a client query/scan. Once this limit is reached, the buffered data is sent to the client.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>512K</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_security_scan_visibility_default">table.security.scan.visibility.default</h5>
<div class="paragraph">
<p>The security label that will be assumed at scan time if an entry does not have a visibility set.
Note: An empty security label is displayed as []. The scan results will show an empty visibility even if the visibility from this setting is applied to the entry.
CAUTION: If a particular key has an empty security label AND its table&#8217;s default visibility is also empty, access will ALWAYS be granted for users with permission to that table. Additionally, if this field is changed, all existing data with an empty visibility label will be interpreted with the new label on the next scan.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> STRING<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <em>empty</em></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_split_threshold">table.split.threshold</h5>
<div class="paragraph">
<p>When combined size of files exceeds this amount a tablet is split.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> MEMORY<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>1G</code></p>
</div>
</div>
<div class="sect4">
<h5 id="_table_walog_enabled">table.walog.enabled</h5>
<div class="paragraph">
<p>Use the write-ahead log to prevent the loss of data.</p>
</div>
<div class="paragraph">
<p><em>Type:</em> BOOLEAN<br>
<em>Zookeeper Mutable:</em> yes<br>
<em>Default Value:</em> <code>true</code></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="TABLE_CONSTRAINT_PREFIX">16.3.12. table.constraint.*</h4>
<div class="paragraph">
<p>Properties in this category are per-table properties that add constraints to a table. These properties start with the category prefix, followed by a number, and their values correspond to a fully qualified Java class that implements the Constraint interface.
For example:
table.constraint.1 = org.apache.accumulo.core.constraints.MyCustomConstraint
and:
table.constraint.2 = my.package.constraints.MySecondConstraint</p>
</div>
</div>
<div class="sect3">
<h4 id="TABLE_ITERATOR_PREFIX">16.3.13. table.iterator.*</h4>
<div class="paragraph">
<p>Properties in this category specify iterators that are applied at various stages (scopes) of interaction with a table. These properties start with the category prefix, followed by a scope (minc, majc, scan, etc.), followed by a period, followed by a name, as in table.iterator.scan.vers, or table.iterator.scan.custom. The values for these properties are a number indicating the ordering in which it is applied, and a class name such as:
table.iterator.scan.vers = 10,org.apache.accumulo.core.iterators.VersioningIterator
These iterators can take options if additional properties are set that look like this property, but are suffixed with a period, followed by <em>opt</em> followed by another period, and a property name.
For example, table.iterator.minc.vers.opt.maxVersions = 3</p>
</div>
</div>
<div class="sect3">
<h4 id="TABLE_LOCALITY_GROUP_PREFIX">16.3.14. table.group.*</h4>
<div class="paragraph">
<p>Properties in this category are per-table properties that define locality groups in a table. These properties start with the category prefix, followed by a name, followed by a period, and followed by a property for that group.
For example table.group.group1=x,y,z sets the column families for a group called group1. Once configured, group1 can be enabled by adding it to the list of groups in the table.groups.enabled property.
Additional group options may be specified for a named group by setting table.group.&lt;name&gt;.opt.&lt;key&gt;=&lt;value&gt;.</p>
</div>
</div>
<div class="sect3">
<h4 id="TABLE_COMPACTION_STRATEGY_PREFIX">16.3.15. table.majc.compaction.strategy.opts.*</h4>
<div class="paragraph">
<p>Properties in this category are used to configure the compaction strategy.</p>
</div>
</div>
<div class="sect3">
<h4 id="VFS_CONTEXT_CLASSPATH_PROPERTY">16.3.16. general.vfs.context.classpath.*</h4>
<div class="paragraph">
<p>Properties in this category are define a classpath. These properties start with the category prefix, followed by a context name. The value is a comma seperated list of URIs. Supports full regex on filename alone. For example, general.vfs.context.classpath.cx1=hdfs://nn1:9902/mylibdir/*.jar. You can enable post delegation for a context, which will load classes from the context first instead of the parent first. Do this by setting general.vfs.context.classpath.&lt;name&gt;.delegation=post, where &lt;name&gt; is your context nameIf delegation is not specified, it defaults to loading from parent classloader first.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_property_types">16.4. Property Types</h3>
<div class="sect3">
<h4 id="_duration">16.4.1. duration</h4>
<div class="paragraph">
<p>A non-negative integer optionally followed by a unit of time (whitespace disallowed), as in 30s.
If no unit of time is specified, seconds are assumed. Valid units are <em>ms</em>, <em>s</em>, <em>m</em>, <em>h</em> for milliseconds, seconds, minutes, and hours.
Examples of valid durations are <em>600</em>, <em>30s</em>, <em>45m</em>, <em>30000ms</em>, <em>3d</em>, and <em>1h</em>.
Examples of invalid durations are <em>1w</em>, <em>1h30m</em>, <em>1s 200ms</em>, <em>ms</em>, <em>', and 'a</em>.
Unless otherwise stated, the max value for the duration represented in milliseconds is 9223372036854775807</p>
</div>
</div>
<div class="sect3">
<h4 id="_date_time">16.4.2. date/time</h4>
<div class="paragraph">
<p>A date/time string in the format: YYYYMMDDhhmmssTTT where TTT is the 3 character time zone</p>
</div>
</div>
<div class="sect3">
<h4 id="_memory">16.4.3. memory</h4>
<div class="paragraph">
<p>A positive integer optionally followed by a unit of memory (whitespace disallowed), as in 2G.
If no unit is specified, bytes are assumed. Valid units are <em>B</em>, <em>K</em>, <em>M</em>, <em>G</em>, for bytes, kilobytes, megabytes, and gigabytes.
Examples of valid memories are <em>1024</em>, <em>20B</em>, <em>100K</em>, <em>1500M</em>, <em>2G</em>.
Examples of invalid memories are <em>1M500K</em>, <em>1M 2K</em>, <em>1MB</em>, <em>1.5G</em>, <em>1,024K</em>, <em>', and 'a</em>.
Unless otherwise stated, the max value for the memory represented in bytes is 9223372036854775807</p>
</div>
</div>
<div class="sect3">
<h4 id="_host_list">16.4.4. host list</h4>
<div class="paragraph">
<p>A comma-separated list of hostnames or ip addresses, with optional port numbers.
Examples of valid host lists are <em>localhost:2000,www.example.com,10.10.1.1:500</em> and <em>localhost</em>.
Examples of invalid host lists are <em>', ':1000</em>, and <em>localhost:80000</em></p>
</div>
</div>
<div class="sect3">
<h4 id="_port">16.4.5. port</h4>
<div class="paragraph">
<p>An positive integer in the range 1024-65535, not already in use or specified elsewhere in the configuration</p>
</div>
</div>
<div class="sect3">
<h4 id="_count">16.4.6. count</h4>
<div class="paragraph">
<p>A non-negative integer in the range of 0-2147483647</p>
</div>
</div>
<div class="sect3">
<h4 id="_fraction_percentage">16.4.7. fraction/percentage</h4>
<div class="paragraph">
<p>A floating point number that represents either a fraction or, if suffixed with the <em>%</em> character, a percentage.
Examples of valid fractions/percentages are <em>10</em>, <em>1000%</em>, <em>0.05</em>, <em>5%</em>, <em>0.2%</em>, <em>0.0005</em>.
Examples of invalid fractions/percentages are <em>', '10 percent</em>, <em>Hulk Hogan</em></p>
</div>
</div>
<div class="sect3">
<h4 id="_path">16.4.8. path</h4>
<div class="paragraph">
<p>A string that represents a filesystem path, which can be either relative or absolute to some directory. The filesystem depends on the property. The following environment variables will be substituted: [ACCUMULO_HOME, ACCUMULO_CONF_DIR]</p>
</div>
</div>
<div class="sect3">
<h4 id="_absolute_path">16.4.9. absolute path</h4>
<div class="paragraph">
<p>An absolute filesystem path. The filesystem depends on the property. This is the same as path, but enforces that its root is explicitly specified.</p>
</div>
</div>
<div class="sect3">
<h4 id="_java_class">16.4.10. java class</h4>
<div class="paragraph">
<p>A fully qualified java class name representing a class on the classpath.
An example is <em>java.lang.String</em>, rather than <em>String</em></p>
</div>
</div>
<div class="sect3">
<h4 id="_string">16.4.11. string</h4>
<div class="paragraph">
<p>An arbitrary string of characters whose format is unspecified and interpreted based on the context of the property to which it applies.</p>
</div>
</div>
<div class="sect3">
<h4 id="_boolean">16.4.12. boolean</h4>
<div class="paragraph">
<p>Has a value of either <em>true</em> or <em>false</em></p>
</div>
</div>
<div class="sect3">
<h4 id="_uri">16.4.13. uri</h4>
<div class="paragraph">
<p>A valid URI</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2016-02-09 15:30:00 EST
</div>
</div>
</body>
</html>