1,一开始都是调用HttpMethod的getResponseBody()和getResponseBodyAsString,但这样总会出现下图中的警告信息
这是由于没有使用缓存的缘故,如果字符串数据过多,会出警告,应该改用流和缓存来读取数据:
InputStream resStream = null;
String response = null;
BufferedReader resBufferReader = null;
try {
httpClient.executeMethod(httpMethod);
resStream = httpMethod.getResponseBodyAsStream();
resBufferReader = new BufferedReader(new InputStreamReader(resStream));
StringBuffer resBuffer = new StringBuffer();
String resTemp = "";
while((resTemp = resBufferReader.readLine()) != null){
resBuffer.append(resTemp);
}
response = resBuffer.toString();
} catch (Exception e) {
}
2, 连接Zookeeper的方法如下:
public static Configuration hBaseConfiguration = null;
public static HBaseAdmin hBaseAdmin = null;
public static void init() {
hBaseConfiguration = HBaseConfiguration.create();
try {
hBaseAdmin = new HBaseAdmin(hBaseConfiguration);
} catch (Exception e) {
throw new HbaseRuntimeException(e);
}
}
这里其实是将两个默认的配置文件加进来了,对于相同的配置项,后者会覆盖前者
conf.addResource("hbase-default.xml");
conf.addResource("hbase-site.xml");
可是总是报下面的错:
An error is preventing HBase from connecting to ZooKeeper
Caused by: java.io.IOException: Unable to determine ZooKeeper ensemble
断点跟踪到Zookeeper的源码发现是ZKUtil类的connect方法抛出的异常,
public static ZooKeeper connect(Configuration conf, String ensemble,
Watcher watcher, final String descriptor)
throws IOException {
if(ensemble == null) {
throw new IOException("Unable to determine ZooKeeper ensemble");
}
int timeout = conf.getInt("zookeeper.session.timeout", 180 * 1000);
LOG.debug(descriptor + " opening connection to ZooKeeper with ensemble (" +
ensemble + ")");
return new ZooKeeper(ensemble, timeout, watcher);
}
上述代码表明是没有读取到Zookeeper集群的地址,这个地址是在ZooKeeperWatcher的构造函数中读取的:
this.quorum = ZKConfig.getZKQuorumServersString(conf);
继续跟下去,发现配置信息是makeZKProps方法读取出来的,
// First check if there is a zoo.cfg in the CLASSPATH. If so, simply read
// it and grab its configuration properties.
ClassLoader cl = HQuorumPeer.class.getClassLoader();
final InputStream inputStream =
cl.getResourceAsStream(HConstants.ZOOKEEPER_CONFIG_NAME);
if (inputStream != null) {
try {
return parseZooCfg(conf, inputStream);
} catch (IOException e) {
LOG.warn("Cannot read " + HConstants.ZOOKEEPER_CONFIG_NAME +
", loading from XML files", e);
}
}
看到这里才恍然大悟,它会首先去检查CLASSPATH下是否有zoo.cfg文件,如果有,则将其中的配置项读取出来作为Zookeeper的配置项,而此时就会完全不顾 hbase-default.xml和hbase-site.xml这两个配置文件了!
3, Zookeeper有两个异常需要特别认真地去考虑,
1)第一种情况是连接丢失,在丢失的这段时间,你的操作是不生效的,也就意味着你所做的delete,setData,makePath这些操作都是无效的,这就是第一个要特别去处理的异常信息
KeeperException.ConnectionLossException,处理的方法很简单,就是引入重试机制,指定好最大重试次数,重试间隔时间即可。
public <T> T retryOperation(ZkOperation operation) throws KeeperException, InterruptedException {
KeeperException exception = null;
for (int i = 0; i < retryCount; i++) {
try {
return (T) operation.execute();
} catch (KeeperException.ConnectionLossException e) {
if (exception == null) {
exception = e;
}
if (Thread.currentThread().isInterrupted()) {
Thread.currentThread().interrupt();
throw new InterruptedException();
}
retryDelay(i);
}
}
throw exception;
}
2)第二种情况是Session的超时。当你第一次连接Zookeeper时,是可以注册一个Watcher的,这个Watcher的作用就是应对Zookeeper连接成功和会话超时的,
当后者发生时,你必须进行尝试重新连接Zookeeper服务器的动作,一旦重新连接成功,你就可以做一些应用层的初始化动作,这里是通过onReconnect.command()来实现的,OnReconnect接口是一个钩子,用于重连完成时,回调进行一些初始化动作的。
public synchronized void process(WatchedEvent event) {
if (log.isInfoEnabled()) {
log.info("Watcher " + this + " name:" + name + " got event " + event + " path:" + event.getPath() + " type:" + event.getType());
}
state = event.getState();
if (state == KeeperState.SyncConnected) {
connected = true;
clientConnected.countDown();
} else if (state == KeeperState.Expired) {
connected = false;
log.info("Attempting to reconnect to recover relationship with ZooKeeper...");
//尝试重新连接zk服务器
try {
connectionStrategy.reconnect(zkServerAddress, zkClientTimeout, this,
new ZkClientConnectionStrategy.ZkUpdate() {
@Override
public void update(SolrZooKeeper keeper) throws InterruptedException, TimeoutException, IOException {
synchronized (connectionStrategy) {
waitForConnected(SolrZkClient.DEFAULT_CLIENT_CONNECT_TIMEOUT);
client.updateKeeper(keeper);
if (onReconnect != null) {
onReconnect.command();
}
synchronized (ConnectionManager.this) {
ConnectionManager.this.connected = true;
}
}
}
});
} catch (Exception e) {
SolrException.log(log, "", e);
}
log.info("Connected:" + connected);
} else if (state == KeeperState.Disconnected) {
connected = false;
} else {
connected = false;
}
notifyAll();
}
4,今天在做solr的master/slave切换时遇到一个让人困扰的问题
场景描述:
3个solr节点的集群,1个master节点,名为m1,2个slave节点,分别为s1,s2,每个solr节点都在Zookeeper集群中同一个Znode下注册为EPHEMERAL_SEQUENTIAL节点,分别可以得到一个序号,采取“序号最小者为master”的策略来进行master选举。若m1节点挂掉,则下一个序号最小的slave节点自动接替成为新的master,假定此slave是s1,则此时有3件事要完成:
1) s1节点上的solr核的solrConfig.xml配置文件中有关replication的片段,必须从slave的配置改成master的配置,并且reload其对应的solr核
2)其他slave节点(这里是s2)必须修改其配置文件中有关replication的片段,将原先指向m1的masterUrl改为指向s1,并且reload其对应的solr核
3)若原先挂掉的m1节点重新回到集群中来,则它会在上面提到的那个Znode下重新一个EPHEMERAL_SEQUENTIAL节点,并且序号肯定会比s1,s2的大,则m1会发现已经有新的master节点s1存在,自动识别出自己的身份是slave,其上的solr核也会采用有关slave的配置片段,并且指向s1所在的新的masterUrl
问题:
我现在碰到的情况是,s1将其配置文件从slave改为master,然后reload的结果是,索引目录文件由index变成了index.时间戳,导致s2这个slave节点在从s1复制索引时却是默认从index这个目录去复制的,从而无法找到索引文件,s1上的indexversion返回是0.
目前卡在这个地方,明天来好好研究下真实原因。。。
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
- 大小: 33.2 KB
分享到:
相关推荐
每日学习笔记11111111111111
JavaScript,简称JS,是一种广泛应用于Web开发的轻量级脚本语言,它主要负责网页的动态交互。在网页中,JS可以通过三种方式引入:内嵌、外链和行内。...外链则是通过链接外部的.js文件来引入;行内JS则是将代码放在事件...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
每日更新机器学习笔记、代码及其它内容。.zip
SEO,全称Search Engine Optimization,即搜索引擎优化,是互联网营销中的关键...通过学习这份笔记,你可以系统地提升你的SEO技能,从而帮助网站获得更高的搜索引擎可见性,吸引更多的 organic traffic(自然流量)。
尽管给定文件信息并没有提供足够的具体内容来深入分析,但根据标题“2021最新手账系列-甜甜向上の学习笔记(横版)”和描述“2021最新手账系列-甜甜向上の学习笔记(横版)”,我们可以推断出这是一份关于手账使用...
Spark大数据处理学习笔记 本资源 Spark 大数据处理学习笔记对 Spark 大数据处理进行了系统的学习笔记,涵盖了 Spark Standalone 集群的搭建、RDD 的创建和算子、RDD 的分区、RDD 典型案例等多个方面的知识点。 一...
"Calpuff 模型学习笔记" 本资源摘要信息涵盖了 Calpuff 模型的学习笔记,包括 Calpuff 模型的介绍、Calmet 模型、Calpuff 模型、Calpost 模块的详细介绍,以及 Calpuff 模型与 Aermod 模型的区别。 首先,Calpuff ...
《SEO每日一贴笔记》是一本专注于搜索...《SEO每日一贴笔记》完整版.pdf包含了上述所有内容的详细讲解,适合SEO初学者及有一定经验的从业者阅读,通过每日学习,逐步掌握SEO的全面知识,提升网站在搜索引擎中的竞争力。
每日站会中,团队成员分享昨天完成的工作、今天计划完成的任务以及遇到的问题,以保持团队间的同步。评审会议则是向利益相关者展示已实现的功能,获取反馈,并可能调整后续迭代的计划。回顾会议则用于团队内部总结...
2. 学习规划:利用手账来制定学习计划,包括短期和长期的学习目标,以及每日学习任务的安排。 3. 目标设定:通过手账来明确个人学习和生活的具体目标,包括短期目标和长期愿景。 4. 任务追踪:记录下每天完成的任务...
Study Notes日常学习笔记记录推荐使用打开Markdown简单Markdown语法整理初版日期:2021-3-28Allegro creat Gerber filesCreated date:2021-4-4GitCreated date:2021-4-4
综上所述,这份名为“每日练习笔记”的压缩包文件包含了作者在学习Python编程过程中的心得和经验。内容可能涵盖Python的基础知识到高级特性,对于想要学习或巩固Python技能的读者来说,这是一份非常实用的学习资料。...
spring学习笔记 很详细的学习笔记分享给大家,大家可以看看,绝对物有所值
### Windows脚本学习笔记 #### 一、Shell与命令行基础 Windows 脚本的基础是了解Shell(命令行环境)及其内置命令。Shell作为操作系统的一部分,提供了执行各种任务的能力,比如文件操作、进程控制等。 - **常用...
《SEO每日一贴笔记》完整版.pdf 是一份深入讲解SEO(搜索引擎优化)的教程,它包含了一系列关于如何提升网站在搜索引擎结果中排名的实用技巧和策略。这份资料旨在帮助读者理解并掌握SEO的核心概念,从而有效地提高...