Hadoop出现元数据不能更新且SNN合并失效

问题表现: NameNode 保存edits文件 停留在5.3号凌晨。SNN执行合并文件报 空指针错误,导致无法正常合并元数据

原因:要弄清原因首先需要清楚SNN合并流程,NN写editslog流程等等。简单说来如下:

1 在5.3号 SNN合并文件后并成功将合并的数据put到NN。当NN在关闭临时edit文件edit.new,打开edits文件时报错:unable to open

2 正常情况下,打开edits文件后,会将edits输出流加入前面已经清空的edits输出流列表。在1 失败下,该操作未做,所以edits输出流列表为空表对象

3 打开失败下,会将失败的路径自动移除掉,以便后面的自动尝试恢复。同时自动尝试恢复是在SNN合并文件时出发。但是咱们的情况是2个edits路径全部失败,导致 路径集合为null。

4 新的SNN合并请求过来后会先得到存储路径集合,此时报Null退出 。

5 对于文件操作的日志,因为2操作没有执行,没有可用的edits输出流列表,所以直接往下执行其他操作,导致edits文件也不再更新。

解决思路:

1 因为NN不再更新edits文件,SNN也无法合并Img,所以以前NN保存的元数据无法使用。所以必须恢复元数据到最新。这可以通过hdfs提供的api导出hdfs目录元数据并保存。

这个操作必须在安全模式下执行。

2 从上面5点看,很多操作时由于打不开edit后导致的edits输出流列表为空表(不是Null)和NN的元数据存储路径为Null

3 恢复edits输出流列表,才能让NN正常写edits,这个操作可以调用hdfs提供的api实现。

4 恢复NN的元数据存储路径也可以调用hdfs提供的api重新设置。

解决方案:

1 让集群进入安全模式,使用导出元数据的jsp ,导出最新元数据,停止集群,,拷贝新的元数据替换旧的元数据后重启集群。

2 让集群进入安全模式,使用导出元数据的jsp ,导出最新元数据,拷贝新的元数据替换旧的元数据。恢复edits流列表,恢复NN的元数据存储路径列表,离开安全模式。(测试正常,但没在线上应用)

附件:

1 导出元数据的jsp:

 
  1. <%@ page  
  2.   contentType="text/html; charset=UTF-8"  
  3.   isThreadSafe="false"  
  4.   import="java.io.*"  
  5.   import="java.lang.reflect.*"  
  6.   import="org.apache.Hadoop.hdfs.*"  
  7.   import="org.apache.hadoop.hdfs.server.namenode.*"  
  8.   import="org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory"  
  9.   import="org.apache.hadoop.hdfs.server.common.Storage.StorageDirType"  
  10. %>  
  11. <%  
  12. String path = request.getParameter("dir");  
  13. if (path == null) {  
  14.   throw new IllegalArgumentException("specify dir parameter");  
  15. }  
  16. File dir = new File(path);  
  17. if (!dir.exists()) {  
  18.   dir.mkdir();  
  19. }  
  20.   
  21. NameNode nn = (NameNode)application.getAttribute("name.node");  
  22. if (!nn.isInSafeMode()) {  
  23.   throw new IllegalStateException("not in safe mode");  
  24. }  
  25.   
  26. // Use reflection to find saveCurrent()   
  27. FSImage image = nn.getFSImage();  
  28. Method m = FSImage.class.getDeclaredMethod("saveCurrent", StorageDirectory.class);  
  29. m.setAccessible(true);  
  30.   
  31. // Use reflection to find the IMAGE_AND_EDITS enum, since it's package-protected   
  32. Class c = Class.forName("org.apache.hadoop.hdfs.server.namenode.FSImage$NameNodeDirType");  
  33. StorageDirType[] constants = (StorageDirType[])c.getEnumConstants();  
  34.   
  35. StorageDirType t = null;  
  36. for (StorageDirType sdt : constants) {  
  37.   if (sdt.toString().equals("IMAGE_AND_EDITS")) {  
  38.     t = sdt;  
  39.   }  
  40. }  
  41. if (t == null) {  
  42.   throw new IllegalStateException("no type");  
  43. }  
  44.   
  45. // Actually save   
  46. StorageDirectory sd = image.new StorageDirectory(dir, t);  
  47. m.invoke(image, sd);  
  48. %>  
  49. Saved image to <%= sd.getCurrentDir() %>  

2 查看 edit流列表及存储路径集合及其他对象jsp:

 
  1. <%@ page  
  2.   contentType="text/html; charset=UTF-8"  
  3.   isThreadSafe="false"  
  4.   import="java.io.*"  
  5.   import="java.util.*"  
  6.   import="java.lang.reflect.*"  
  7.   import="org.apache.hadoop.hdfs.*"  
  8.   import="org.apache.hadoop.hdfs.server.namenode.*"  
  9.   import="org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory"  
  10.   import="org.apache.hadoop.hdfs.server.common.Storage.StorageDirType"  
  11. %>  
  12.   
  13. <%  
  14.    NameNode nn = (NameNode)application.getAttribute("name.node");  
  15.      
  16.    out.println("namenode="+nn.toString());  
  17.    final FSImage nnImage = (FSImage)application.getAttribute("name.system.image");  
  18.    out.println("storagedirs="+nnImage.listStorageDirectories());  
  19.   Method m = FSImage.class.getDeclaredMethod("getFsImageName"null);  
  20.   m.setAccessible(true);  
  21.   out.println("nnImage.getFsImageName()="+m.invoke(nnImage,null));  
  22.    
  23.    out.println("httpserver name.system.image="+nnImage.toString());  
  24.    out.println("getFsImage from nn="+nn.getFSImage());  
  25.   out.println("<br/>");  
  26.    File eFile=new File("/data0/hadoop/hdfs/name/current/edits");  
  27.    RandomAccessFile rp = new RandomAccessFile(eFile, "rw");  
  28.    FileOutputStream  fp = new FileOutputStream(rp.getFD());  
  29.   // FSEditLog.EditLogOutputStream eStream = new FSEditLog.EditLogFileOutputStream(eFile);   
  30.    out.println("fileoutputstream="+fp.toString());     
  31.   
  32.    out.println("<br/>");  
  33.   m = FSImage.class.getDeclaredMethod("getRemovedStorageDirs"null);  
  34.   m.setAccessible(true);  
  35.  List<StorageDirectory> list=(List<StorageDirectory>)m.invoke(nnImage,null);  
  36.   out.println("removedStorageDirs.size="+list.size());  
  37.   for(StorageDirectory dir:list)  
  38.    out.println("removeddir="+dir.getRoot().getPath().toString());  
  39.   
  40. out.println("<br/>");  
  41. FSNamesystem fsNamesystem=nn.getNamesystem();  
  42. Method mm = FSNamesystem.class.getDeclaredMethod("getEditLog"null);  
  43. mm.setAccessible(true);  
  44. FSEditLog editlog=(FSEditLog)mm.invoke(fsNamesystem,null);  
  45. out.println("nn's editlog="+editlog.toString());  
  46.   
  47.   
  48. Method mm1 = FSEditLog.class.getDeclaredMethod("getNumEditStreams"null);  
  49. mm1.setAccessible(true);  
  50. out.println("getNumEditStreams="+mm1.invoke(editlog,null));  
  51. %>  

2019-03-28 13:47

知识点

相关教程

更多

Hadoop Namenode HA 合并到主干

Hadoop 的 Namenode 单点问题一直广受诟病,而这个问题最近将会得到解决,对Namenode 的HA方案已经完成实施并合并到主干,经过严格的测试后将会在后续版本中发布。 HA方案中,主要进行了如下的一些工作:     Configuration changes for HA  Notion of active and standby states were added to the N

Hadoop中的排序器/组合器/合并器

目前,海量数据处理主要存在二个问题:大规模计算(cpu+mem)、海量数据存储(disk),而Hadoop被专门设计用来针对海量数据的处理,它通过分布式文件系统解决海量数据的存储问题,组织成千上万个计算节点来共同完成一个任务解决了大规模计算问题。Hadoop的核心是MapReduce,而不是分布式文件系统HDFS,这是因为MapRduce所依赖的存储系统并不依赖于任何一个文件系统,甚至是分布式文件

《Lucene、webservice、(svn_ant_maven)、DWR、Freemarker、POI视频教程》更新了Spring、JAXWs的整合并且完成了一个小项目[压缩包]

中文名: Lucene、webservice、(svn_ant_maven)、DWR、Freemarker、POI视频教程    资源格式: 压缩包    版本: 更新了Spring、JAXWs的整合并且完成了一个小项目    发行日期: 2012年02月20日    地区: 大陆    对白语言: 普通话    文字语言: 简体中文    简介:        内容简介:    本视频是应培训班

Memcached set 添加或更新数据命令


                            

jsp、struts1和hibernate如何实现批量更新数据

如题,比如说从一个表里查出来十行数据,每行数据都做了更改,如何一起提交到后台,后台如何接收并更新,大家工作中正用到的方法。  谢谢!     问题补充:请问有具体的实例吗?谢谢!     jkxydp 写道      这个用ajax最好不过了,把进行更改过的十几条数据构造成json格式的数据发送给后台,后台接收到数据之后放入一个链表最好是Vector里面,然后调用service存入数据库,最好放到

使用 Apache Lucene 和 Solr 进行位置感知搜索——通过合并非结构化文本和空间数据改进搜索应用程序

简介: 不管是通过支持 GPS 的智能手机查找最近的咖啡馆,还是通过社交站点查找附近的朋友,或是查看特定城市中运输某种商品的所有货车,越来越多的人和企业都使用位置感知的搜索服务。创建位置感知搜索服务通常属于昂贵的专用解决方案的一部分,并且一般由地理空间专家完成。不过,很流行的开源搜索库 Apache Lucene 和强大的 Lucene 搜索服务器 Apache Solr 最近添加了空间位置功能。

多进程更新数据库情况下,还能使用hibernate吗?

如题,在多进程访问数据库的情况下,比如:web端持久化使用的是hibernate3,用的是oracle数据库,oracle数据库上有定义的job,不断的在更新数据。同时,又有其他子系统,定时向此oracle数据库中不断的插入数据。在这样的场景下,使用hibernate做持久化,会造成hibernate中一级或二级缓存中的数据与数据库中的数据不一致,有什么办法处理这样的问题呢?  问题补充:  有没

SAP发布软件更新包 集成HANA与Hadoop

  日前,SAP发布新的程序更新包,并将在Hadoop中集成分析和数据库技术,包括倍受追捧的HANA内存数据库平台和Sybase IQ(列式数据库)。   另外,SAP还宣称该程序包将与Hadoop、SAP Data Integrator和SAP BusinessObjects BI套件进行集成。   新的程序包由SAP和Cloudera、Hitachi Data Systems、Hortonwo

Hadoop数据迁入到Hive

由于很多数据在Hadoop平台,当从hadoop平台的数据迁移到hive目录下时,由于hive默认的分隔符是\,为了平滑迁移,需要在创建表格时指定数据的分割符号,语法如下: create table test(uid string,name string)row format delimited fields terminated by '\t'; 通过这种方式,完成分隔符的指定。 然后通过had

freebsd solr 索引更新数据报错解决一例

测试的时候是两个环境linux,freebsd。在线下用linux测试solr更新一直都可以,拿到线上freebsd一直都不行,开始以为是jdbc的问题,换了版本还是不行,最后一行一行的看tomcat日志发现有一行报:java.lang.OutOfMemoryError: Java heap space 感觉的JVM不够,百度了一下果然是。加了通用的那句话测试了下索引到2000条数据的时候还是不行

Hadoop处理数据的轨迹

在使用Hadoop的时候,可能遇到各种各样的问题,然而由于hadoop的运行机制比较复杂,因而出现了问题的时候比较难于发现问题。 本文欲通过某种方式跟踪Hadoop的运行痕迹,方便出现问题的时候可以通过这些痕迹来解决问题。 一、环境的搭建    为了能够跟踪这些运行的痕迹,我们需要搭建一个特殊的环境,从而可以一步步的查看上一节提到的一些关键步骤所引起的变化。 我们首先搭建一个拥有一个NameNod

jsp页面表单和数据库之间的动态更新

if(rs1.next())  {  lo = rs1.getString("lo");  la = rs1.getString("la");  %>  <tr>  <td width="200" height="29" align="center" ><%=rs

关于netbeans使用GWT框架失效或点击不显示的问题,最后导致生成失败

关于netbeans使用GWT框架失效或点击不显示的问题,最后导致生成失败  我是往WAR项目中加载了GWT 2.0.4框架...但是右击属性后打不开GWT是什么原因呢  而且最WAR清理并生成后失败  如附件中的图的问题....

Hadoop——Microsoft大数据战略的核心

如今,Microsoft已经将Hadoop作为自身大数据战略的核心。Microsoft此举的理由就是看中了Hadoop的潜力,在大数据领域Hadoop已经成为分布式数据处理的标准。通过集成Hadoop技术,Microsoft允许客户访问快速增长的Hadoop生态系统。同时随着越来越多善于在Hadoop平台进行开发的人才涌出,这对Hadoop发展极其有利。 Microsoft的目标不仅仅是将Hado

保障 Hadoop 数据安全的十大措施

Dataguise最近发布了Hadoop十大数据安全措施,内容涵盖隐私风险、数据管理和信息安全等,可以帮助专业人士降低大数据应用的潜在数据泄漏和政策违规等风险,对于那些考虑部署Hadoop的企业来说非常值得参考。 Dataguise为多家财富200强企业提供Hadoop安全服务,总结出了一套适合大规模多样化环境的大数据安全实践和流程。 大数据分析向来伴随着隐私话题和争议,在大数据分析中的海量数据里

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案