was包发布之后 系统日志出现mq 发布 空指针异常 是什么原因

之前将eclipse下编好的mapreduce代码放到集群上面跑,发现速度很慢,namenode节点的cpu和内存使用率很低,datanode节点基本上处于没有运行的状态,然后通过查看hadoop-etc-hadoop下面的配置文件,发现mapreduce-site.xml文件下面的mapreduce.framework.name名字中framework少了一个字母e,导致集群一直运行在伪分布模式下面,同时也导致web控制网页没有datanode的信息,打开master:8088网站显示no available datanode in the table,曾经这个问题困扰了我很久很久,因为如果网站打不开的话就没有办法查看运行的日志,没有办法通过日志来查看运行出错信息。在hadoop2.1以后就通过mapreduce-site.xml配置文件里面的mapreduce.jobhistory.webapp.address下面的value值master:19888网站来查看各个节点的运行状态了,开启jobhistory的命令是mr-jobhistory-sh start historyserver。
运行jar包的时候提示空指针异常 java.lang.NullPointerException分析说明
这个问题也困扰了我相当长的时间,直到后来通过日志log发现原来是程序没有读我的文件(文件格式是xml格式),后来把文件复制到各个节点下面相同的路径里面,然后在代码中输入路径(不可以只放在namenode节点上,不然datanonde读不到文件便会报空指针异常)。
mapreduce框架中全局变量的设置
在我的工程中需要在map函数里面调用一个类的方法,如果在每个map函数里面都新建类的话会导致运行时间很长,内存溢出。这里我想在代码运行之前新建这个类,在map方法里面直接调用这个类的方法,这个过程也困扰了我很长的时间,直到另一个需求的出现,在处理很多文件的时候我希望输出为多个文件,而不是只有一个输出文件。
对于输出多个文件的分析
在程序中加入以下代码
private MultipleO
protected void setup(Context context) throws IOException, InterruptedException {
mos=new MultipleOutputs(context);//初始化mos
protected void cleanup( Context context) throws IOException, InterruptedException {
mos.close();//释放资源
public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException,NullPointerException{
mos.write(new Text(key),new Text(value),filename);
实现以filename文件作为输入文件输出map的结果。
这里我就发现了一个地方,在setup方法中新建了一个对象mos,然后在map函数中直接调用mos的方法,而网上说setup方法只运行一次,可以重载自己的功能,然后回到上一个问题,我把需要初始化的对象直接放到setup方法里面,然后在map函数里面执行对象的方法,结果空指针异常消失了,而且不会再每执行一次map函数就新建一个对象,这样减少了内存的消耗。
运行时候出现Error: GC overhead limit exceeded
在hadoop2.x中默认Container的yarn child jvm堆大小为200M,通过参数mapred.child.java.opts指定,可以在job提交的时候给定,是一个客户端生效的参数,配置在mapred-site.xml文件中,通过将该参数修改为-Xms200m -Xmx4096000m来更改jvm堆大小,异常解决。
然后我继续运行jar包工程,运行时出现
这个错误和物理内存无关,是虚拟内存超了。
解决方法:
在etc/hadoop/yarn-site.xml文件中,修改检查虚拟内存的属性为false,如下:
&property&
&name&yarn.nodemanager.vmem-check-enabled&/name&
&value&false&/value&
&/property&
参考资料:http://blog.csdn.net/ma0903/article/details/
阅读(...) 评论()http://blog.csdn.net/luansxx/article/details/
1276人阅读
网络上有很多讨论C++ 的“引用”与“指针“的区别的文章,谈到区别,其中有一条:“引用不能为空(NULL),引用必须与合法的存储单元关联,指针则可以是NULL)”,但在实际应用中,有时候为了保持一致性,我们会抛开这个规则,人为创造出一个“空引用”。
很多情况下,“空引用”确实可以工作,以致于“引用不能为空”的忠告,被嘲笑为形式主义,仅仅是标准制定者的耸人听闻。一个“空引用”的例子是:
int&*&a&=&NULL;&&int&&&b&=&*a;&&
于是当访问b的时候,程序异常出现了:
void&f(int&&&p)&&{&&&&&&p&=&0;&&}&&f(b);&&
当然,可以增加点判断,修正这个问题:
void&f(int&&&p)&&{&&&&&&if&(&p)&p&=&0;&&}&&
怎么样,是不是有点别扭?但是如果换成成指针,你要输入的字符数是一模一样的:
void&f(int&*&p)&&{&&&&&&if&(p)&*p&=&0;&&}&&&
&于是,到底是使用“引用”还是“指针”,好像就是智者见智仁者见仁的事情了。
然而,然而。。。。。。
这真的一样吗?
我们来看看复杂一点的例子:
&&&&#include&&iostream&&&&&class&A&&{&&&&&&int&a;&&};&&&&class&B&&{&&&&&&int&b;&&};&&&&class&C&&&&&&:&public&A,&public&B&&{&&&&&&int&c;&&};&&&&void&fb(B&&&b)&&{&&&&&&std::cout&&&&&b&&&&std::&&}&&&&void&fb(B&*&b)&&{&&&&&&std::cout&&&&b&&&&std::&&}&&&&int&main(int&argc,&char*&argv[])&&{&&&&&&C&*&c&=&NULL;&&&&&&&&fb(c);&&&&&&&&fb(*c);&&&&&&&&return&0;&&}&&
编译运行一下看看:
$&./test&&0&&0x4&&
咦,怎么&b不是0,也就是不是“空引用”了,这时候,即使加上判断,if (&b),也无济于事了。
大家也许注意到了,上面是linux环境运行,那么windows环境呢:
&test.exe&&&&&&
这时候,“空引用”保持了他的“空”属性,仅在windows平台做C++的开发者,可以松口气了。
这是怎么回事呢,是你的眼睛欺骗了你?也许是,但是CPU不会欺骗我们,从汇编代码可以看出本质。下面是linux平台编译的代码:
Dump&of&assembler&code&for&function&main:&&&&&0x0804870a&&+0&:&&&&&push&&&%ebp&&&&&0x0804870b&&+1&:&&&&&mov&&&&%esp,%ebp&&&&&0x0804870d&&+3&:&&&&&and&&&&$0xfffffff0,%esp&&&&&0x&&+6&:&&&&&sub&&&&$0x20,%esp&&&&&0x&&+9&:&&&&&movl&&&$0x0,0x1c(%esp)&&&&&0x0804871b&&+17&:&&&&cmpl&&&$0x0,0x1c(%esp)&&&&&0x&&+22&:&&&&je&&&&&0x804872b&&main+33&&&&&&0x&&+24&:&&&&mov&&&&0x1c(%esp),%eax&&&&&0x&&+28&:&&&&add&&&&$0x4,%eax&&&&&0x&&+31&:&&&&jmp&&&&0x8048730&&main+38&&&&&&0x0804872b&&+33&:&&&&mov&&&&$0x0,%eax&&&&&0x&&+38&:&&&&mov&&&&%eax,(%esp)&&&&&0x&&+41&:&&&&call&&&0x80486df&&fb(B*)&&&&&&0x&&+46&:&&&&mov&&&&0x1c(%esp),%eax&&&&&0x0804873c&&+50&:&&&&add&&&&$0x4,%eax&&&&&0x0804873f&&+53&:&&&&mov&&&&%eax,(%esp)&&&&&0x&&+56&:&&&&call&&&0x80486b4&&fb(B&)&&&&&&0x&&+61&:&&&&mov&&&&$0x0,%eax&&&&&0x0804874c&&+66&:&&&&leave&&&&&&&0x0804874d&&+67&:&&&&ret&&&&&&
这是windows平台的:
wmain:&&&&push&&&&&&&&ebp&&&&&&mov&&&&&&&&&ebp,esp&&&&&sub&&&&&&&&&esp,0DCh&&&&&push&&&&&&&&ebx&&&&004114DA&&push&&&&&&&&esi&&&&004114DB&&push&&&&&&&&edi&&&&004114DC&&lea&&&&&&&&&edi,[ebp-0DCh]&&&&&mov&&&&&&&&&ecx,37h&&&&&mov&&&&&&&&&eax,0CCCCCCCCh&&&004114EC&&rep&stos&&&&dword&ptr&es:[edi]&&&004114EE&&mov&&&&&&&&&dword&ptr&[c],0&&&&&mov&&&&&&&&&eax,dword&ptr&[c]&&&&&mov&&&&&&&&&dword&ptr&[rc],eax&&&004114FB&&cmp&&&&&&&&&dword&ptr&[c],0&&&004114FF&&je&&&&&&&&&&wmain+3Fh&(41150Fh)&&&&&mov&&&&&&&&&eax,dword&ptr&[c]&&&&&add&&&&&&&&&eax,4&&&&&mov&&&&&&&&&dword&ptr&[ebp-0DCh],eax&&&0041150D&&jmp&&&&&&&&&wmain+49h&(411519h)&&&0041150F&&mov&&&&&&&&&dword&ptr&[ebp-0DCh],0&&&&&mov&&&&&&&&&ecx,dword&ptr&[ebp-0DCh]&&&0041151F&&push&&&&&&&&ecx&&&&&&call&&&&&&&&fb&(411118h)&&&&&add&&&&&&&&&esp,4&&&&&cmp&&&&&&&&&dword&ptr&[rc],0&&&0041152C&&je&&&&&&&&&&wmain+6Ch&(41153Ch)&&&0041152E&&mov&&&&&&&&&eax,dword&ptr&[rc]&&&&&add&&&&&&&&&eax,4&&&&&mov&&&&&&&&&dword&ptr&[ebp-0DCh],eax&&&0041153A&&jmp&&&&&&&&&wmain+76h&(411546h)&&&0041153C&&mov&&&&&&&&&dword&ptr&[ebp-0DCh],0&&&&&mov&&&&&&&&&ecx,dword&ptr&[ebp-0DCh]&&&0041154C&&push&&&&&&&&ecx&&&&0041154D&&call&&&&&&&&fb&(41108Ch)&&&&&add&&&&&&&&&esp,4&&&&&xor&&&&&&&&&eax,eax&&&&&pop&&&&&&&&&edi&&&&&&pop&&&&&&&&&esi&&&&&&pop&&&&&&&&&ebx&&&&0041155A&&add&&&&&&&&&esp,0DCh&&&&&cmp&&&&&&&&&ebp,esp&&&&&call&&&&&&&&@ILT+345(__RTC_CheckEsp)&(41115Eh)&&&&&mov&&&&&&&&&esp,ebp&&&&&pop&&&&&&&&&ebp&&&&0041156A&&ret&&&&&&&&&&&&&&&&
汇编代码有兴趣自己研究,不细说了。
回过头想想,两个平台的编译器的两种处理方式,都有他的合理性,windows平台增加了容错性,而linux平台在处理引用时减少判断,增加性能。这隐隐体现出windows与linux开发理念的不同。
最后,请大家记住,引用不能为空,如果可能存在空对象时,请使用指针。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(65)(61)(38)(126)(99)(97)(200)(71)(159)(64)(5)(3)(3)(1)(67)(23)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
本文转载自xyz64happy
阅读(420)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'【引用】空指针',
blogAbstract:'
指针为C语言编程提供了强大的支持——如果你能正确而灵活地利用指针,你就可以直接切入问题的核心,或者将程序分割成一个个片断。一个很好地利用了指针的程序会非常高效、简洁和精致。
利用指针你可以将数据写入内存中的任意位置,但是,一旦你的程序中有一个野指针(\"wild”pointer),即指向一个错误位置的指针,你的数据就危险了——存放在堆中的数据可能会被破坏,用来管理堆的数据结构也可能会被破坏,甚至操作系统的数据也可能会被修改,有时,上述三种破坏情况会同时发生。 ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 日志发布系统报告 的文章

 

随机推荐