- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在 Hadoop 上运行的 Storm 拓扑配置为伪分布式模式。拓扑包含一个 bolt ,它必须将数据写入 Hbase。
我用于测试目的的第一种方法是创建(并关闭)连接并在我的 bolt execute
中写入数据。方法。然而,我的本地机器上似乎没有太多资源来处理所有传入 HBase 的请求。在成功处理了大约 30 个请求后,我在 Storm 工作人员的日志中看到了以下内容:
o.a.z.ClientCnxn [INFO] Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
o.a.z.ClientCnxn [INFO] Socket connection established to localhost/127.0.0.1:2181, initiating session
o.a.z.ClientCnxn [INFO] Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
o.a.h.h.z.RecoverableZooKeeper [WARN] Possibly transient ZooKeeper, quorum=localhost:2181, exception=org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid
prepare
中打开连接方法并在
cleanup
关闭它.但是根据文档
cleanup
不保证在分布式模式下被调用。
最佳答案
哦,男孩,我发光的时候了!我不得不从 Storm 对 HBase 进行大量优化写入,所以希望这会对您有所帮助。
如果您刚刚开始 storm-hbase是开始将数据流式传输到 hbase 的好方法。您可以克隆项目,进行 maven 安装,然后在拓扑中引用它。
但是,如果您开始获得更复杂的逻辑,那么创建您自己的类来与 HBase 对话可能是要走的路。这就是我将在此处的答案中展示的内容。
项目设置
我假设您正在使用 maven 和 maven-shade 插件。您需要引用 hbase-client:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
hbase-site.xml
在您的拓扑 jar 中。您可以从集群下载此文件并将其放入
src/main/resources
.我还有一个用于在开发中测试的名为
hbase-site.dev.xml
.然后只需使用 shade 插件将其移动到 jar 的根目录。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4</version>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
<artifactSet>
<excludes>
<exclude>classworlds:classworlds</exclude>
<exclude>junit:junit</exclude>
<exclude>jmock:*</exclude>
<exclude>*:xml-apis</exclude>
<exclude>org.apache.maven:lib:tests</exclude>
<exclude>log4j:log4j:jar:</exclude>
<exclude>org.testng:testng</exclude>
</excludes>
</artifactSet>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>core-site.xml</resource>
<file>src/main/resources/core-site.xml</file>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>hbase-site.xml</resource>
<file>src/main/resources/hbase-site.xml</file>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>hdfs-site.xml</resource>
<file>src/main/resources/hdfs-site.xml</file>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>junit/*</exclude>
<exclude>webapps/</exclude>
<exclude>testng*</exclude>
<exclude>*.js</exclude>
<exclude>*.png</exclude>
<exclude>*.css</exclude>
<exclude>*.json</exclude>
<exclude>*.csv</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
prepare
方法,然后
重用该连接 在 bolt 的整个生命周期内!
Configuration config = HBaseConfiguration.create();
connection = HConnectionManager.createConnection(config);
// single put method
private HConnection connection;
@SuppressWarnings("rawtypes")
@Override
public void prepare(java.util.Map stormConf, backtype.storm.task.TopologyContext context) {
Configuration config = HBaseConfiguration.create();
connection = HConnectionManager.createConnection(config);
}
@Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
try {
// do stuff
// call putFruit
} catch (Exception e) {
LOG.error("bolt error", e);
collector.reportError(e);
}
}
// example put method you'd call from within execute somewhere
private void putFruit(String key, FruitResult data) throws IOException {
HTableInterface table = connection.getTable(Constants.TABLE_FRUIT);
try {
Put p = new Put(key.getBytes());
long ts = data.getTimestamp();
p.add(Constants.FRUIT_FAMILY, Constants.COLOR, ts, data.getColor().getBytes());
p.add(Constants.FRUIT_FAMILY, Constants.SIZE, ts, data.getSize().getBytes());
p.add(Constants.FRUIT_FAMILY, Constants.WEIGHT, ts, Bytes.toBytes(data.getWeight()));
table.put(p);
} finally {
try {
table.close();
} finally {
// nothing
}
}
}
// batch put method
private static boolean AUTO_FLUSH = false;
private static boolean CLEAR_BUFFER_ON_FAIL = false;
private HConnection connection;
private HTableInterface fruitTable;
@SuppressWarnings("rawtypes")
@Override
public void prepare(java.util.Map stormConf, backtype.storm.task.TopologyContext context) {
Configuration config = HBaseConfiguration.create();
connection = HConnectionManager.createConnection(config);
fruitTable = connection.getTable(Constants.TABLE_FRUIT);
fruitTable.setAutoFlush(AUTO_FLUSH, CLEAR_BUFFER_ON_FAIL);
}
@Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
try {
// do stuff
// call putFruit
} catch (Exception e) {
LOG.error("bolt error", e);
collector.reportError(e);
}
}
// example put method you'd call from within execute somewhere
private void putFruit(String key, FruitResult data) throws IOException {
Put p = new Put(key.getBytes());
long ts = data.getTimestamp();
p.add(Constants.FRUIT_FAMILY, Constants.COLOR, ts, data.getColor().getBytes());
p.add(Constants.FRUIT_FAMILY, Constants.SIZE, ts, data.getSize().getBytes());
p.add(Constants.FRUIT_FAMILY, Constants.WEIGHT, ts, Bytes.toBytes(data.getWeight()));
fruitTable.put(p);
}
cleanup
中关闭 HBase 连接。 .请注意,在您的 worker 被杀之前,它可能不会被调用。
new Delete(key);
而不是放置。 关于hbase - 从 Apache Storm bolt 在 HBase 中插入和删除值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128158/
平台:Mac OSX Maverics Web 服务器:内置 apache,支持 mod-rewrite,启用 php5_module 重现步骤: cd/Users/用户名/站点/ mkdir bol
如何在 Bolt 中列出分类法中的所有术语?不是应用于记录的术语而是所有现有术语(如标签云或类别列表侧边菜单)? 最佳答案 直接在模板中,可以这样做: {% for category in app.c
我有两个可序列化的类A和B。并且有两种spout A_spout和B_spout。每个spout向bolt C发出并行类。但是方法execute中的元组没有区别,所以我如何区分它们? 最佳答案 每个输
我有一个拓扑,例如由 1 个喷嘴和 4 个 bolt 组成 spout 1 -> bolt A -> bolt B -> bolt C -> bolt D 如果 bolt A 中的某些条件不满足,我们
我正在从 spout 中获取数据。每个 bolt 都会将映射字段插入到我数据库中的不同表中。但是我的数据库表有约束。在我的测试表中,我有两个名为 user-details 和 my-details 的
在我的 Storm 拓扑中,我将一个大的程序逻辑保存在单个 Bolt 中。现在我把大的程序逻辑分成线性排列的小 bolt 。它的性能有什么不同吗? 最佳答案 根据您评论中的描述: In my topo
我正在使用 Bolt.cm 并且在编辑页面或条目时,右侧有一个称为“堆栈”的部分。在 Bolt 网站上,它说 Our Stack functionality contains your latest
我正在使用 Apache Storm,我想知道是否可以像这样用另一个 bolt 组合一个 bolt : public class MyNewBolt extends BaseRichBolt {
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
将 BoltA 和 BoltB 的输出发送到 BoltC 的最简单方法是什么。我必须使用 Joins 还是有任何更简单的解决方案。 A 和 B 具有相同的字段(ts、metric_name、metri
注意: Bolt1 包含前三个质数(2,3,5)的列表。 Bolt2 包含后三组质数(7,11,13)的列表。 在 Bolt3 中,它只是检查数字是否为素数。 从第一个 bolt 开始,我可以从 sp
bolt 是否可以从不同的 spout/bolt 接收多个输入元组?例如,Bolt C 接收来自 Spout A 的输入元组和来自 Bolt B 的输入元组以进行处理。我应该如何实现它?我的意思是为
得到这个错误 framework not found Bolts for architecture x86_64 逐字逐句地遵循 Facebook 的指南,但我唯一能想到的链接错误发生在框架搜索路径的
我正在尝试整合 Amazon Web SDK适用于 iOS。我手动安装了它(不使用 CocoPods)并且在文档中它说如果你安装了 facebook SDK 不包括 Bolts.framework 因
我正在尝试使用 Facebook/Parse Bolts 框架在 Android 上并行运行多个任务。 documentation for running tasks in parallel似乎表明
Error:(39, 13) Failed to resolve: com.parse.bolts:bolts-android:1.+ 这是我的build.gradle dependencies {
我想创建一个内容类型,其中包含诸如“年月”和“产品类型”之类的选择字段,并根据这两个字段的值自动生成标题字段。 这是因为两个选择字段值的描述性足够,我想减少 CMS 的最终用户为使标题显示在管理界面中
操作系统:Windows 10 专业版 Node :6.1.0 NPM:3.8.6 Gulp:CLI 版本 3.9.1 因此,firebase-bolt 已使用 npm install -g fire
我是 phone gap 的新手。在我的项目中集成了 facebook 插件。运行后显示错误 `Error:A problem occurred configuring root project 'a
我正在尝试构建我的项目。由于此错误,构建失败。 Users/company/Desktop/app/DemoApp/Pods/Bolts/Bolts/iOS/BFAppLink.m:11:9:找不到“
我是一名优秀的程序员,十分优秀!