Accumulo提供了一个简单的shell,可以用来检查表的内容和配置设置,插入/更新/删除值,更改配置设置。
外壳可以开始下面的命令:
$ACCUMULO_HOME/bin/accumulo shell -u [username]
shell会提示输入相应的密码到指定的用户名,然后显示以下提示:
Shell - Apache Accumulo Interactive Shell
-
- version 1.5
- instance name: myinstance
- instance id: 00000000-0000-0000-0000-000000000000
-
- type 'help' for a list of available commands
-
3.1。基本管理
Accumulo shell可以用来创建和删除表,以及配置表和实例的具体选项。
root@myinstance> tables
!METADATA
root@myinstance> createtable mytable
root@myinstance mytable>
root@myinstance mytable> tables
!METADATA
mytable
root@myinstance mytable> createtable testtable
root@myinstance testtable>
root@myinstance testtable> deletetable testtable
壳牌也可以用来插入更新和扫描表。这是非常有用的检查表。
root@myinstance mytable> scan
root@myinstance mytable> insert row1 colf colq value1
insert successful
root@myinstance mytable> scan
row1 colf:colq [] value1
括号内的数值“[]”的知名度标签。由于没有被使用,这是该行空。您可以使用“-ST”扫描到细胞内,也看到时间戳选项。
3.2。表维护
compact命令指示Accumulo安排巩固和删除哪些文件项被删除的表压实。
root@myinstance mytable> compact -t mytable
07 16:13:53,201 [shell.Shell] INFO : Compaction of table mytable
scheduled for 20100707161353EDT
该flush命令指示Accumulo写当前内存中的所有条目,对于一个给定的表到磁盘。
root@myinstance mytable> flush -t mytable
07 16:14:19,351 [shell.Shell] INFO : Flush of table mytable
initiated...
3.3。用户管理
shell可用于添加,删除,并授予用户特权。
root@myinstance mytable> createuser bob
Enter new password for 'bob': *********
Please confirm new password for 'bob': *********
root@myinstance mytable> authenticate bob
Enter current password for 'bob': *********
Valid
root@myinstance mytable> grant System.CREATE_TABLE -s -u bob
root@myinstance mytable> user bob
Enter current password for 'bob': *********
bob@myinstance mytable> userpermissions
System permissions: System.CREATE_TABLE
Table permissions (!METADATA): Table.READ
Table permissions (mytable): NONE
bob@myinstance mytable> createtable bobstable
bob@myinstance bobstable>
bob@myinstance bobstable> user root
Enter current password for 'root': *********
root@myinstance bobstable> revoke System.CREATE_TABLE -s -u bob
4。写作Accumulo客户端
4.1。运行客户端代码
有多种方式运行的Java代码使用Accumulo的。下面列出的不同的方式来执行客户端代码。
使用Java可执行文件
使用accumulo脚本
使用该工具的脚本
为了运行客户端代码编写对Accumulo运行,您将需要包括罐子Accumulo取决于你的classpath。Accumulo客户端的代码依赖于Hadoop和饲养员。对于Hadoop的Hadoop的核心罐子,在Hadoop的lib目录下的所有的罐子,conf目录到classpath中。饲养员3.3,你只需要添加饲养员罐,也不是什么在饲养员的lib目录。您可以运行下面的命令上的配置Accumulo系统,看看有什么使用它的类路径。
$ACCUMULO_HOME/bin/accumulo classpath
运行你的代码的另一种选择是把一个jar文件 $ ACCUMULO_HOME / lib / ext目录。这样做后,你可以使用accumulo的脚本来执行你的代码。例如,如果你创建一个jar含有类com.foo.Client,放置在lib / ext目录,那么你可以使用命令 $ ACCUMULO_HOME / bin中/ accumulo com.foo.Client的执行代码。
如果你正在写的地图减少,访问Accumulo,那么你可以使用的bin / tool.sh的脚本来运行这些作业的工作。查看地图减少的例子。
4.2。连
所有客户端必须先识别Accumulo例如,他们将进行通信。做到这一点的代码如下:
String instanceName = "myinstance";
String zooServers = "zooserver-one,zooserver-two"
Instance inst = new ZooKeeperInstance(instanceName, zooServers);
Connector conn = inst.getConnector("user", "passwd");
4.3。写入数据
通过创建对象代表所有更改的列单排突变数据写入到Accumulo的。这些变化是由原子在TabletServer。客户端,然后将它提交给适当的TabletServers到BatchWriter突变。
突变可以创建这样的:
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);
4.3.1。BatchWriter
高度优化的BatchWriter送突变的多个TabletServers和自动批次突变摊销网络开销相同TabletServer注定。必须小心避免的任何传递给BatchWriter对象改变的内容,因为它保持内存中的对象,而配料。
添加到BatchWriter突变是这样的:
long memBuf = 1000000L; // bytes to store before sending a batch
long timeout = 1000L; // milliseconds to wait before sending
int numThreads = 10;
BatchWriter writer =
conn.createBatchWriter("table", memBuf, timeout, numThreads)
writer.add(mutation);
writer.close();
一个例子可以发现在使用批处理写 accumulo/docs/examples/README.batch
4.4。读取数据
Accumulo优化,快速检索与给定键关联的值,并有效返回连续键及其关联值范围。
4.4.1。扫描器
检索数据,客户端使用扫描仪,它的作用像一个迭代器键和值。扫描仪可以被配置在特定的键来启动和停止,并返回可用的列的一个子集。
// 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.fetchFamily("attributes");
for(Entry<Key,Value> entry : scan) {
String row = entry.getKey().getRow();
Value value = entry.getValue();
}
4.4.2。隔离式扫描仪
Accumulo支持能力提出了一个孤立的观点的行扫描时。有三种可能的方式,行可能会改变accumulo:
一个突变应用于一个表
或大或小的压实的一部分执行的迭代器
批量导入新文件
隔离担保,所有这些操作的行上所做的更改或无被看见。使用IsolatedScanner孤立的观点的一个accumulo表取得。当使用常规的扫描仪,它是可以看到一排的非孤立的观点。例如,如果一个突变修改分三路,它可能是你只会看到两个修改。对于隔离扫描仪要么全部三个的变化被视为或无。
该IsolatedScanner缓冲行客户端上的,所以不会大排平板服务器崩溃。默认情况下,行缓存在内存中,但用户可以方便地提供自己的缓冲区,如果他们想缓冲到磁盘时行大。
举一个例子,看看
examples/simple/src/main/java/org/apache/accumulo/examples/simple/isolation/InterferenceTest.java
4.4.3。BatchScanner
对于某些类型的访问,它是更有效的同时检索几个范围。出现这种情况,当访问一组不连续的行,其ID已检索,例如从二级索引。
类似该BatchScanner配置到扫描器,它可以被配置为检索可用的列的一个子集,但是,而不是通过一个单一的范围,BatchScanners接受一组范围。重要的是要注意,键由BatchScanner返回键以排序的顺序,因为流式传输是从多个TabletServers平行。
ArrayList<Range> ranges = new ArrayList<Range>();
// populate list of ranges ...
BatchScanner bscan =
conn.createBatchScanner("table", auths, 10);
bscan.setRanges(ranges);
bscan.fetchFamily("attributes");
for(Entry<Key,Value> entry : scan)
System.out.println(entry.getValue());
一个例子可以发现在accumulo/docs/examples/README.batch
4.5。代理
代理API允许Java以外的语言与Accumulo互动。在代码库中提供代理服务器和一个客户端可以进一步产生。
4.5.1。Prequisites
代理服务器可以住在任何节点上的基本客户端API将工作。这意味着它必须是能够沟通的法师,饲养员,NameNode的数据节点。代理客户端只需要与代理服务器进行通信的能力。
4.5.2。组态
代理服务器的配置选项里面住的属性文件。最起码,你需要提供以下属性:
protocolFactory=org.apache.thrift.protocol.TCompactProtocol$Factory
tokenClass=org.apache.accumulo.core.client.security.tokens.PasswordToken
port=42424
instance=test
zookeepers=localhost:2181
在你的发行版,你可以找到一个示例配置文件:
$ACCUMULO_HOME/proxy/proxy.properties
这个配置文件示例演示备份代理服务器由MockAccumulo或MiniAccumuloCluster的的abilty。
4.5.3。运行代理服务器
控股配置属性文件创建后,代理服务器就可以开始在Accumulo分布(假设你的属性文件被命名为config.properties中)使用以下命令:
$ACCUMULO_HOME/bin/accumulo proxy -p config.properties
4.5.4。创建一个代理客户端
除了安装旧货编译的,你还需要生成客户端代码,语言旧货安装特定语言的库。通常情况下,您的操作系统的软件包管理器就能自动安装这些你在预期的位置,如目录/ usr / lib中/蟒蛇/节��的site-packages /。
你可以找到节俭文件生成客户端:
$ACCUMULO_HOME/proxy/proxy.thrift
生成客户端后,在上述的配置属性指定的端口将被用来连接到服务器。
4.5.5。使用代理客户端
下面的例子已经写在Java和方法签名可能旧货编译器生成客户端时指定的语言不同而略有差别。在初始化一个连接到代理服务器(Apache旧货的文件连接到旧货服务的例子),代理客户机上的方法将可用。要做的第一件事就是登录:
Map password = new HashMap<String,String>();
password.put("password", "secret");
ByteBuffer token = client.login("root", password);
登录后,返回的令牌将被使用到客户端的后续调用。让我们创建一个表,添加一些数据,表扫描,并删除它。
首先,创建一个表。
client.createTable(token, "myTable", true, TimeType.MILLIS);
接下来,添加一些数据:
// first, create a writer on the server
String writer = client.createWriter(token, "myTable", new WriterOptions());
// build column updates
Map<ByteBuffer, List<ColumnUpdate> cells> cellsToUpdate = //...
// send updates to the server
client.updateAndFlush(writer, "myTable", cellsToUpdate);
client.closeWriter(writer);
扫描数据和批处理的服务器上返回的结果:
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);