Accumulo依赖Zookeeper:需首先安装Zookeeper
Ps:对Accumulo应用开发感兴趣的小伙伴请加wx:lovebyz99
简介
Accumulo是一款开源分布式NoSQL数据库,基于谷歌的BigTable构建而成。其能够非常高效地对超大规模数据集(通常即指大数据)执行CRUD(即创建、读取、更新与删除)操作。相较于其它类似的分布式数据库选项(例如HBase或者CouchDB),Accumulo的优势在于能够立足单元级访问控制层面提供细粒度安全性控制。
Accumulo构建于其它Apache软件的基础之上。Accumulo以键-值对形式表现其数据,并将这些数据作为文件存储在HDFS上。其同时利用 ZooKeeper对不同进程之间的设置进行同步。
- 在Accumulo启动之前HDFS与ZooKeeper必须已经处于活动状态
Accumulo 的工作原理
基于 JDK 通过 Zookeeper 进行集群调度,并将自己的数据保存到 HDFS 中,就像普通的数据库数据保存在文件系统中,Accumulo 将数据保存到 HDFS 中,这样就实现了分布式数据库。
单机环境部署
安装Accumulo
-
tar xzf /path/to/accumulo-1.9.2-bin.tar.gz
-
raini@biyuzhe:~/app$ ln -s app_root/accumulo-1.9.2/ ./accumulo
-
cd accumulo
-
获取配置文件conf/
Accumulo有一些可选的本机代码,可以提高其性能和稳定性。在配置Accumulo之前尝试使用以下命令构建:
./bin/build_native_library.sh
如果命令失败,则可以继续进行设置并稍后解决问题。
获取配置文件填充到conf/下:
$ ./bin/bootstrap_config.sh
该脚本将提示内存使用情况。请注意,该脚本仅适用于Accumulo系统进程,因此应为其他进程留出足够的空间,例如hadoop,zookeeper和accumulo客户端代码等。如果Accumulo工作进程被换出并且没有响应,它们可能会被杀死。
为方便起见,添加accumulo/bin/到path路径中:
# ACCUMULO
export ACCUMULO_HOME=/home/raini/app/accumulo
export PATH=$ACCUMULO_HOME/bin:$PATH
配置Accumulo
Accumulo依赖Zookeeper和HDFS实例运行,这些实例应在配置Accumulo之前设置好。
Accumulo的主要配置文件accumulo-site.xml,accumulo-env.sh,位于conf/目录中。hadoop的配置hdfs-site.xml
(可选)默认情况下,Accumulo master配置垃圾收集器使用512MB和monitor配置为使用256MB。可以在`JAVA_OPTS`部分更改这些设置。
Accumulo为服务器提供多种示例配置方案,其内存容量设置分别为512 MB、1 GB、2 GB与3 GB。在这里我们使用1G内存配置。如果大家的服务器资源比较充裕,也可以选择其它配置方案
-
accumulo-site.xml (accumulo.properties)
配置Accumulo服务器进程(主从服务器,监视器等)。
一些说明:instance.volumes 指定了 HDFS 节点,使得 Accumulo 能够正常访问 HDFS;instance.zookeeper.host 指定了 zookeeper 集群的路径,使得 zookeeper 能够管理 accumulo;general.classpaths 指定了 Accumulo 工作的 jar 包。
请按照以下步骤进行设置:
- 构建本机代码,请通过将tserver.memory.maps.native.enabled设置为true(默认),则Accumulo将使用本机库。在JVM Maps上使用原生地图可以明显改善摄取率; 但是,在增加本机映射的大小时,某些配置变量对于修改很重要。
//512M大小的可以是false,内存大的可以配成true(内存需要分配给maps.native一部分)
,运行时内存不足都会导致仅群崩溃,所以确保机器有剩余空间>配置的大小
<property>
<name>tserver.memory.maps.native.enabled</name>
<value>true</value>
</property>
Ps: 默认情况下,Accumulo tserver配置为使用1GB内存(768MB分配给JVM,256MB分配给naitve映射)。为本地映射分配的内存等于tserver JVM堆的33%。如果您想更改accumulo-env.sh JAVA_OPTS部分中的服务器内存使用情况,可以参考下表:
- 将instance.volumes设置为Accumulo将存储数据的HDFS位置。如果您的namenode运行在192.168.1.9:8020并且您想要将数据存储/accumulo在HDFS中,则将instance.volumes设置 为hdfs://192.168.1.9:8020/accumulo
<property>
<name>instance.volumes</name>
<value>hdfs://biyuzhe:9000/accumulo</value> <------(使用localhost连接不上hdfs
</property>
- 将instance.zookeeper.host设置为Zookeepers的位置(单机zoo,集群请添加多个ip:2181,以逗号分割)
<property>
<name>instance.zookeeper.host</name>
<value>localhost:2181</value>
</property>
- (可选)更改instance.secret默认值:DEFAULT。此值应在所有服务器上匹配。Accumulo的各工作程序进程利用该密钥进行相互通信。我们需要将其替换为一条安全字符串。
<property>
<name>instance.secret</name>
<value>www.thutmose.cn</value>
</property>
- (可选)更改这个密码在accumulo初始化的时候会使用
<property>
<name>trace.token.property.password</name>
<!-- 默认[secret],修改为自己想要的密码。这个密码在accumulo初始化的时候会使用.change this to the root user's password, and/or change the user below -->
<value>2599</value>
</property>
(2)accumulo-env.sh
该文件设置由Accumulo需要的环境变量:
- Setting
ZOOKEEPER_HOME
andHADOOP_PREFIX
inconf/accumulo-env.sh
。Accumulo将使用这些位置查找Hadoop和Zookeeper jar并将它们添加到您的CLASSPATH变量中。如果您运行的是特定于供应商的Hadoop或Zookeeper版本,则可能需要CLASSPATH在accumulo-env.sh中修改变量的构建 方式。如果Accumulo在启动时加载类有问题,请运行 accumulo classpath以打印Accumulo的类路径。
# 在前面添加
export ACCUMULO_HOME=/home/raini/app/accumulo
export JAVA_HOME=/home/raini/app/jdk
export ZOOKEEPER_HOME=/home/raini/app/zookeeper
export HADOOP_PREFIX=/home/raini/app/hadoop
export HADOOP_HOME=/home/raini/app/hadoop
export HADOOP_CONF_DIR=/home/raini/app/hadoop/etc/hadoop
- 在默认情况下,Accumulo的HTTP监视器只绑定至本地网络接口。为了能够通过互联网进行访问,我们需要将ACCUMULO_MONITOR_BIND_ALL的值设置为true。找到以export ACCUMULO_MONITOR_BIND_ALL开头一行并取消其注释。具体内容如:
export ACCUMULO_MONITOR_BIND_ALL="true"
- 可在accumulo-env.sh JAVA_OPTS中查看 Accumulo master, garbage collector, and monitor的内存设置。
(3)hadoop hdfs-size.xml
增加:
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>dfs.data.synconclose</name>
<value>true</value>
</property>
(4)accumulo/proxy/proxy.properties
useMockInstance=false
useMiniAccumulo=false
protocolFactory=org.apache.thrift.protocol.TCompactProtocol$Factory
tokenClass=org.apache.accumulo.core.client.security.tokens.PasswordToken
port=42424
maxFrameSize=16M
instance=accumuloInstance
zookeepers=localhost:2181
(5)accumulo/conf/client.conf
连接accumulo的配置, 比如 accumulo shell 、远程客户代码端
instance.zookeeper.host=localhost:2181
instance.rpc.ssl.enabled=false
instance.rcp.sasl.enabled=false
rpc.sasl.qop=auth
(6)初始化Accumulo
Accumulo需要初始化它在Zookeeper和HDFS中存储数据的位置。以下命令将执行此操作。
accumulo init
初始化命令将提示输入以下信息:
- Instance name:Accumulo实例的名称,Accumulo clients需要知道它才能连接。
- Root password:初始化设置初始的Accumulo root用户并提示输入密码。稍后连接到Accumulo需要此信息。
我的设置:
- Instance name : accumuloInstance
- Root password : ****
过程如下:
instance.dfs.dir of |/accumulo|
instance.volumes of |hdfs://biyuzhe:9000/accumulo|
启动Accumulo
关闭accumulo :./bin/stop-all.sh
Ps:看到几条与当前系统参数相关的提醒,建议我们将各项数值调高一些。由于我们在这里只需要创建一个小型实例,因此直接忽略即可。
重启完成后,大家即可以通过:http://<your-server-ip>:50095在浏览器中访问Accumulo的Web界面了。
简单使用
(注意配置zookeeper集群在conf/client.conf)
raini@biyuzhe:~/app/accumulo$ accumulo shell -u root
2019-05-31 14:55:06,219 [client.ClientConfiguration] INFO : Loaded client configuration file /home/raini/app/accumulo/conf/client.conf
root@accumuloInstance> createtable test
root@accumuloInstance test> insert row1 cf cq value
root@accumuloInstance test> insert row2 cf cq value2
root@accumuloInstance test> insert row3 cf cq value3
root@accumuloInstance test> scan
row1 cf:cq [] value
row2 cf:cq [] value2
row3 cf:cq [] value3
网页监控
通过shell访问accumulo
raini@biyuzhe:~/app/accumulo$ ./bin/accumulo shell -u root
2019-05-28 11:20:30,475 [client.ClientConfiguration] INFO : Loaded client configuration file /home/raini/app/accumulo/conf/client.conf
2019-05-28 11:20:30,502 [client.ClientConfiguration] INFO : Loaded client configuration file /home/raini/app/accumulo/conf/client.conf
2019-05-28 11:20:31,118 [client.ClientConfiguration] INFO : Loaded client configuration file /home/raini/app/accumulo/conf/client.conf
Password: ****
2019-05-28 11:20:33,122 [trace.DistributedTrace] INFO : SpanReceiver org.apache.accumulo.tracer.ZooTraceClient was loaded successfully.
Shell - Apache Accumulo Interactive Shell
-
- version: 1.9.3
- instance name: accumuloInstance
- instance id: f594f673-3bf1-45de-aa9c-9f15ee7f730f
-
- type 'help' for a list of available commands
-
root@accumuloInstance>
:密码是accumulo-site.xml中配的<name>trace.token.property.password</name>,即初始化密码。
问题汇总-优先考虑集群规范
(1) There are no tablet servers: check that zookeeper and accumulo are running.
./bin/accumulo shell -u root
Password: ******
2015-02-14 15:18:28,503 [impl.ServerClient] WARN : There are no tablet servers: check that zookeeper and accumulo are running.
2015-02-14 13:58:52,878 [tserver.NativeMap] ERROR: Tried and failed to load native map library from /home/hduser/hadoop/lib/native::/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
java.lang.UnsatisfiedLinkError: no accumulo in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at org.apache.accumulo.tserver.NativeMap.<clinit>(NativeMap.java:80)
at org.apache.accumulo.tserver.TabletServerResourceManager.<init>(TabletServerResourceManager.java:155)
at org.apache.accumulo.tserver.TabletServer.config(TabletServer.java:3560)
at org.apache.accumulo.tserver.TabletServer.main(TabletServer.java:3671)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.accumulo.start.Main$1.run(Main.java:141)
at java.lang.Thread.run(Thread.java:745)
2015-02-14 13:58:52,915 [tserver.TabletServer] ERROR: Uncaught exception in TabletServer.main, exiting
java.lang.IllegalArgumentException: Maximum tablet server map memory 83,886,080 and block cache sizes 28,311,552 is too large for this JVM configuration 48,693,248
at org.apache.accumulo.tserver.TabletServerResourceManager.<init>(TabletServerResourceManager.java:166)
at org.apache.accumulo.tserver.TabletServer.config(TabletServer.java:3560)
at org.apache.accumulo.tserver.TabletServer.main(TabletServer.java:3671)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.accumulo.start.Main$1.run(Main.java:141)
at java.lang.Thread.run(Thread.java:745)
问题:
Accumulo无法找到用于堆积内存映射以进行实时编辑的本机库。
解决:
1、手动解压缩$ ACCUMULO_HOME/lib目录中的accumulo-native.tar.gz。
2、cd ./
accumulo-native
3、 make
4、
将生成的“libaccumulo.so”复制到$ACCUMULO_HOME/lib/native/map中(新建这个目录)
(2)[tserver.TabletServer] ERROR: Uncaught exception in TabletServer.main, exiting
2019-01-18 14:15:02,328 [tserver.TabletServer] ERROR: Uncaught exception in TabletServer.main, exiting
java.lang.IllegalArgumentException: Maximum tablet server map memory 83,886,080 block cache sizes 24,117,248 and mutation queue size 52,428,800 is too large for this JVM configuration 129,761,280
at org.apache.accumulo.tserver.TabletServerResourceManager.<init>(TabletServerResourceManager.java:186)
at org.apache.accumulo.tserver.TabletServer.<init>(TabletServer.java:408)
at org.apache.accumulo.tserver.TabletServer.main(TabletServer.java:3206)
at org.apache.accumulo.tserver.TServerExecutable.execute(TServerExecutable.java:33)
at org.apache.accumulo.start.Main$1.run(Main.java:130)
at java.lang.Thread.run(Thread.java:748)
2019-01-18 14:15:02,342 [watcher.MonitorLog4jWatcher] INFO : Changing monitor log4j address to biyuzhe:4560
2019-01-18 14:15:02,342 [watcher.MonitorLog4jWatcher] INFO : Enabled log-forwarding
说明:
该问题是由错误的内存配置引起的。Accumulo依赖单个配置参数来调整内存内存映射和java内存映射的内存使用。本机实现的内存在JVM堆之外分配,并且可能很大(在1-16GB范围内,具体取决于目标工作负载)。在使用Java实现运行时,相同的配置值会占用最大堆大小的空间。
根据您的日志输出,您已为平板电脑服务器配置了大约46MB的最大堆总数。您已为块缓存分配了27MB,为内存映射分配了80MB。您看到的错误是因为这两个值会导致OOM。
解决:
可以在accumulo-env.sh中增加总Java堆:
# Probably looks like this
# change this part to give it more memory --^^^^^^
修改:
test -z "$ACCUMULO_TSERVER_OPTS" && export ACCUMULO_TSERVER_OPTS="${POLICY} -Xmx128m -Xms128m"
成:
test -z "$ACCUMULO_TSERVER_OPTS" && export ACCUMULO_TSERVER_OPTS="${POLICY} -Xmx48m -Xms48m"
或者可以在accumulo-site.xml中增大为本机映射、块缓存和索引缓存使用的内存空间(都增加些)
<!-- Amount of space to hold incoming random writes -->
<property>
<name>tserver.memory.maps.max</name>
<value>180M</value> <----原本80M,增加100M(可以启动master和tracer)
</property>
<!-- Amount of space for holding blocks of data read out of HDFS -->
<property>
<name>tserver.cache.data.size</name>
<value>7M</value>
</property>
<!-- Amount of space for holding indexes read out of HDFS -->
<property>
<name>tserver.cache.index.size</name>
<value>20M</value>
</property>
(3)还不能解决上述问题时。。。就要考虑。。。集群规范
在作为Accumulo Master 的机器上:
-
将Accumulo Master的IP地址或域名写入
$ACCUMULO_HOME/conf/masters
文件。 -
写入将成为TabletServer的计算机的IP地址或域名
$ACCUMULO_HOME/conf/slaves
,每行一个。
请注意,如果使用域名而不是IP地址,则必须为参与群集的所有计算机正确配置DNS。DNS可能是一个令人困惑的错误来源。
(单机部署情况下,将配置文件:masters、gc、monitor、slaves、tracers都改成ip 172.0.0.1)
问题解决(之前经常监控不到这些服务)
$accumulo shell 也能使用了:
(4)Accumulo-1.8.x初始化报错:
缺少jar依赖:
- commons-io
- commons-logging
- commons-configuration
- commons-lang
- htrace-core
- commons-codc
可从我的网盘下载如上jar包:链接 提取码: tuu2
总结
如上我们了解了如何设置Apache Accumulo及其运行所必需的其它组件。我们还利用HDFS以伪分布模式创建出一套能够运行在单一小型服务器上的简单实例。当然,出于性能优化的考虑,大家应该在生产场景下确保HDFS以完全分布式模式运行。
在生产场景下,这里还强烈建议大家将各进程部署在至少拥有8 GB内存且处理器计算核心数量不少于4个的服务器之上,这意味着每个进程能够拥有2 GB内存与1个独立计算核心。另外,大家也可以将各个组件分别部署在不同的服务器上。
Apache Accumulo示例:https://accumulo.apache.org/1.9/examples/
博主w~x:lovebyz99
(交流请备注,对创业有想法欢迎联系)