Category Archives: java
记hadoop故障一例:BlockAlreadyExistsException
hive版本:0.7.0 hadoop版本:0.20.2 在线上跑了一个季度了,基本上没什么问题,今天突然出了问题。 在hive执行时留下的蛛丝马迹: Failed with exception org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException: Not replicated yet:/tmp/hive-root/hive_2011-08-15_00-31-02_332_247809173824307798/-ext-10000/access_bucket-2011-08-14_00004 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1257) at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:422) at sun.reflect.GeneratedMethodAccessor2037.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Met
hive 0.7.0代码分析解读
入口: bin/hive脚本中,环境检查后执行ext中的cli.sh,进入主类:CliDriver.main。 CliDriver.main: 把分号隔开命令进cli.processLine,再进processCmd。 processCmd: 处理quit/exit,再处理source,处理!,处理list;else建立CommandProcessor(实现有Driver和各种Processor),set/dfs/add/delete命令有单独的Processor,剩下的走Driver。 如果是Driver类型的Processor: 把cmd发到这个driver的run,再进到compile,在compile中,用一个parseDriver去生成ASTNode(生成使用了antlr,主要过程:经过文法分析器切割,进解析器,出来一个TREE),这里有细节的compile的过程说明 http://fromheartgo.wordpress.com/2010/04/02/hive%E7%9A%84compile%E8%BF%87%E7%A8%8B%EF%BC%881%EF%BC%89/ ; 根据得到的ASTNode,开始语义分析,把结果设置到一个QueryPlan对象中,初始化一些task放在QueryPlan中; run里的test only代码读了test.serialize.qplan的设置,test状态会把这些查询记录写到文件里;权限检查。 退出complie,在Driver的run中分解执行MR后,退出来到了processCmd: 如果装填一切正常,通过getResul
spring配合easymock搞定不依赖环境的测试用例
在写java的test case的时候,往往有太多依赖环境的情况,WEB项目更甚,如果每次测试都要准备数据库或者其他环境,相当麻烦,换一个人就入手困难,在这种情况下,mock就是最好的选择。 Mock 对象能够模拟领域对象的部分行为,并且能够检验运行结果是否和预期的一致。领域类将通过与 Mock 对象的交互,来获得一个独立的测试环境。 入门 //准备一个mock IMocksControl mocksControl = EasyMock.createStrictControl(); //创建录像 aDAO = mocksControl.createMock(AnalyzeResultDAO.class); //录制 输入 期望输出 EasyMock.expect(aDAO.getARByLimit(type)).andReturn(ar); //重放 表示录制结束 EasyMock.replay(aDAO); //调用相关的类 验证结果是否正常 Assert.assertNotNull(analyzeResultBiz.getLastAR(type)); //验证是否使用了上面录制的DAO EasyMock.verify(aDAO); 提高 * 配合spring如何做? int type = 1; AnalyzeResult ar = new AnalyzeResult(); …
持续构建工具hudson使用手记
hudson是一个强大的持续性构建服务器。(现在开发者们分了一个分支,改叫Jenkins。)我(54chen)在使用过程中的手记如下: 下载 地址:http://hudson-ci.org/ wget http://java.net/projects/hudson/downloads/download/war/hudson-2.0.1.war 速度不咋的,60k/s. 先决条件 系统:centos 5.5 resin4下不work,换成了tomcat。 cp /opt/soft/hudson/hudson-2.0.1.war /opt/soft/apache-tomcat-7.0.16/webapps/ 遇到的问题 1)tomcat使用utf8环境。 vim tomcat/conf/server.xml 找到8080,加入一行 URIEncoding="UTF-8"。 2)maven不工作 hudson启动后,系统管理里面,设置maven的地址:MAVEN_HOME指到maven的主目录,不是bin目录。 3)svn不工作 报re_version错误,在你的svn地址的最后面加上@HEAD 4)hudson一切正常后,有svn bug FATAL: tried to access method hudson.scm.ChangeLogSet$Entry.setParent(Lhudson/scm/ChangeLogSet;)V from class hudson.scm.SubversionChangeLogSet 报上面的错误,我(54chen)在http://i
java log4j 日志分析工具分享
java线上项目往往有许多的exception出现了没来得及去看,通过下面的工具,可以在每天早晨上班的时候通过邮件发出头一天出现的异常次数,是提高生产力和提早发现问题的好办法。 配置: 1.解压到指定目录 /data/analyze 2.email发送配置 vim mail.pl 5行,6行,7行,14行 修改为自己的配置 3.server配置 ssh-keygen打通ssh cd server 项目名_server写服务器ip,多个机器一行一个 4.其他 可能会有不相同的log目录地址,看着修改一下shell就行。 *修改自烧饼的脚本,点击下载: http://ishare.iask.sina.com.cn/f/16530420.html
hive迁移hadoop namenode时遇到的问题
使用了一段时间的hive和hadoop,在迁移datanode时很容易,要迁移namenode,hive里就闹情绪了。更改namenode后,在hive中运行select 依旧指向之前的namenode地址。 要如何解决呢,具体操作如下: 1.复制打包老的namenode 2.复制打包老的namenode的hdfs目录 3.到新机器准备好:修改master的值 复制到各节点 修改hive的定义 4.hive这里使用了mysql来保存metadata 因为这些信息会被写死在hive的DBS和SBS表里,下面是关键的一步: 进入mysql,执行下面的sql, update DBS set DB_LOCATION_URI=REPLACE(DB_LOCATION_URI,'old host','new host'); update SDS set LOCATION=REPLACE(LOCATION,'old host','new host'); 启动,一切正常了!迁移hive namenode成功。
java实时日志大文件分析
日志分析时经常会遇到这个问题:一个正在增长中的大文件,要分析新增的每一行的固定内容进行统计并展示啥的。用java的RandomAccessFile盯住文件的末尾,是一个不错的选择,下面的实现,是一个高效的java tail工具,实现类似linux的tail工具的功能。用来做大日志文件的实时分析,是一个不错的选择。 public class LogFileTailer extends Thread { private Logger logger = LoggerFactory.getLogger(LogFileTailer.class); /** * How frequently to check for file changes; defaults to 5 seconds */ private long sampleInterval = 5000; /** * The log file to tail */ …
改写java TreeMap制造方便查询的ip内存库
国库流行的ip库记录数大约在6万条左右,数据格式大约都是如下: start,end,country... 要查询的时候都是放到mysql里去,然后select * from ip where start>=xx and end end <=xx来得到ip信息,我(54chen)在搞一个实时监控时,因为并发量非常大,全部查询IP库,需要好几万每秒的查询,特改了java的TreeMap的get方法,将所有数据放到内存里来操作,put的时候还是保持TreeMap的红黑树实现,以start作为key,而在get的时候有一个 compare的过程,在发现compare是大于0的时候进行如下修改: else if (cmp > 0) { int start = ((Data) p.value).getStart(); int end = ((Data) p.value).getEnd(); int intKey = Integer.parseInt(k.toString()); if (intKey >= start && intKey <= …
maven打jar包自动生成run脚本-appassembler插件的使用
关键配置: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.1.1</version> <configuration> <programs> <program> <mainClass>com.chen.logtailer.Tail</mainClass> <name>app</name> </program> </programs> </configuration> </plugin> #mvn package appassembler:assemble #sh target/appassembler/bin/app 优点: 不需要管理各种run的脚本,自动生成。
硬件为王,软件为帝--记突增的访问
五一归来两周,精力都放在了因为服务器压力突增而来的各种鸡飞狗跳的事情上,今天总结一下,算是对过去两周的总结,希望对各创业团队有所借鉴。 1.访问突增,连锁反应 最先开始出现问题的,是在小负载下没有出现的问题,在大压力时,只要DB一堵,表像就会是循环锁死。 解决之道: 服务要有清晰的架构,开发规范里一定要有明确的架构层次规范,最好还有代码的层次规范。 2.mysql设计不合理,压力指数增加 mysql中存在大量的更新操作,特别是大字段或者变长字段的频繁更新,导致磁盘io居高不下,慢查询越来越多。 硬解决之道: raid卡加电,开启raid写缓存:一般服务器的raid卡都没有开启,开启是有一定用处的,但有一个前提,不是待续的高写入,否则这个写缓存是没有意义的。电池充电时无法缓存,一般三个月充一次电。 转微博:FusionioChina 回复 @YauzZ:多一个故障点。多一份丢数据的可能。而且目前有Raid卡的内存做到1GB。丢不起呀。(5月11日 23:29) 从raid分到多个盘、盘柜,都是从硬件上用多硬盘分担的好方案。 软解决之道: 写方案建立mysql隔离层,在写入前预先处理,类似软件缓存方案,效果明显,修改复杂。 3.后续可做 灵活的中间层数据层切换逻辑,让负载可以随时转移、分隔,基本可以达到“人傻钱多,万事不愁”。
SEARCH
Update
- 54chen Twitter memo 2012-02-12
- 人肉解析riak_admin join
- go语言安装手记
- 54chen Twitter memo 2012-02-05
- Riak Core说明
- maven库nexus拖不到jar包小记
- 服务接入层小结
- 54chen Twitter memo 2012-01-15
- nginx防hashdos模块使用帮助
- 54chen Twitter memo 2012-01-08
- nginx防hashdos模块释出
- 54chen Twitter memo 2012-01-01
- 水煮鱼杯2011年度不得不总结的十件事
- 年终攻击hashDos-哈希表多碰撞实现拒绝服务-破解办法
- 54chen Twitter memo 2011-12-25
