Hadoop常见问题及解决办法

1:ShuffleError:ExceededMAX_FAILED_UNIQUE_FETCHES;bailing-out

Answer:

程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit-a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。

修改办法:

修改2个文件。

/etc/security/limits.conf

vi/etc/security/limits.conf

加上:

*softnofile102400

*hardnofile409600

$cd/etc/pam.d/

$sudovilogin

添加sessionrequired/lib/security/pam_limits.so

针对第一个问题我纠正下答案:

这是reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。。。通常框架内网络情况较好是不会出现此错误的。

2:Toomanyfetch-failures

Answer:

出现这个问题主要是结点间的连通不够全面。

1)检查、/etc/hosts

要求本机ip对应服务器名

要求要包含所有的服务器ip+服务器名

2)检查.ssh/authorized_keys

要求包含所有服务器(包括其自身)的publickey

3:处理速度特别的慢出现map很快但是reduce很慢而且反复出现reduce=0%

Answer:

结合第二点,然后

修改conf/hadoop-env.sh中的exportHADOOP_HEAPSIZE=4000

4:能够启动datanode,但无法访问,也无法结束的错误

在重新格式化一个新的分布式文件时,需要将你NameNode上所配置的dfs.name.dir这一namenode用来存放NameNode持久存储名字空间及事务日志的本地文件系统路径删除,同时将各DataNode上的dfs.data.dir的路径DataNode存放块数据的本地文件系统路径的目录也删除。如本此配置就是在NameNode上删除/home/hadoop/NameData,在DataNode上删除/home/hadoop/DataNode1和/home/hadoop/DataNode2。这是因为Hadoop在格式化一个新的分布式文件系统时,每个存储的名字空间都对应了建立时间的那个版本(可以查看/home/hadoop/NameData/current目录下的VERSION文件,上面记录了版本信息),在重新格式化新的分布式系统文件时,最好先删除NameData目录。必须删除各DataNode的dfs.data.dir。这样才可以使namedode和datanode记录的信息版本对应。

注意:删除是个很危险的动作,不能确认的情况下不能删除!!做好删除的文件等通通备份!!

5:java.io.IOException:Couldnotobtainblock:blk_194219614024901469_1100file=/user/hive/warehouse/src_20090724_log/src_20090724_log

出现这种情况大多是结点断了,没有连接上。

6:java.lang.OutOfMemoryError:Javaheapspace

出现这种异常,明显是jvm内存不够得原因,要修改所有的datanode的jvm内存大小。

Java-Xms1024m-Xmx4096m

一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。

本主题由admin于2009-11-2010:50置顶

顶,这样的贴子非常好,要置顶。附件是由Hadoop技术交流群中若冰的同学提供的相关资料:

(12.58KB)

Hadoop添加节点的方法

自己实际添加节点过程:

1.先在slave上配置好环境,包括ssh,jdk,相关config,lib,bin等的拷贝;

2.将新的datanode的host加到集群namenode及其他datanode中去;

3.将新的datanode的ip加到master的conf/slaves中;

4.重启cluster,在cluster中看到新的datanode节点;

5.运行bin/start-balancer.sh,这个会很耗时间

备注:

1.如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mr的工作效率;

2.也可调用bin/start-balancer.sh命令执行,也可加参数-threshold5

threshold是平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长。

3.balancer也可以在有mrjob的cluster上运行,默认dfs.balance.bandwidthPerSec很低,为1M/s。在没有mrjob时,可以提高该设置加快负载均衡时间。

其他备注:

1.必须确保slave的firewall已关闭;

2.确保新的slave的ip已经添加到master及其他slaves的/etc/hosts中,反之也要将master及其他slave的ip添加到新的slave的/etc/hosts中

mapper及reducer个数

url地址:http://wiki.apache.org/hadoop/HowManyMapsAndReduces

HowManyMapsAndReduces

Partitioningyourjobintomapsandreduces

PickingtheappropriatesizeforthetasksforyourjobcanradicallychangetheperformanceofHadoop.Increasingthenumberoftasksincreasestheframeworkoverhead,butincreasesloadbalancingandlowersthecostoffailures.Atoneextremeisthe1map/1reducecasewherenothingisdistributed.Theotherextremeistohave1,000,000maps/1,000,000reduceswheretheframeworkrunsoutofresourcesfortheoverhead.

NumberofMaps

ThenumberofmapsisusuallydrivenbythenumberofDFSblocksintheinputfiles.AlthoughthatcausespeopletoadjusttheirDFSblocksizetoadjustthenumberofmaps.Therightlevelofparallelismformapsseemstobearound10-100maps/node,althoughwehavetakenitupto300orsoforverycpu-lightmaptasks.Tasksetuptakesawhile,soitisbestifthemapstakeatleastaminutetoexecute.

Actuallycontrollingthenumberofmapsissubtle.Themapred.map.tasksparameterisjustahinttotheInputFormatforthenumberofmaps.ThedefaultInputFormatbehavioristosplitthetotalnumberofbytesintotherightnumberoffragments.However,inthedefaultcasetheDFSblocksizeoftheinputfilesistreatedasanupperboundforinputsplits.Alowerboundonthesplitsizecanbesetviamapred.min.split.size.Thus,ifyouexpect10TBofinputdataandhave128MBDFSblocks,you'llendupwith82kmaps,unlessyourmapred.map.tasksisevenlarger.Ultimatelythe[WWW]InputFormatdeterminesthenumberofmaps.

ThenumberofmaptaskscanalsobeincreasedmanuallyusingtheJobConf'sconf.setNumMapTasks(intnum).Thiscanbeusedtoincreasethenumberofmaptasks,butwillnotsetthenumberbelowthatwhichHadoopdeterminesviasplittingtheinputdata.

NumberofReduces

Therightnumberofreducesseemstobe0.95or1.75*(nodes*mapred.tasktracker.tasks.maximum).At0.95allofthereducescanlaunchimmediatelyandstarttransferingmapoutputsasthemapsfinish.At1.75thefasternodeswillfinishtheirfirstroundofreducesandlaunchasecondroundofreducesdoingamuchbetterjobofloadbalancing.

Currentlythenumberofreducesislimitedtoroughly1000bythebuffersizefortheoutputfiles(io.buffer.size*2*numReduces<<heapSize).Thiswillbefixedatsomepoint,butuntilitisitprovidesaprettyfirmupperbound.

Thenumberofreducesalsocontrolsthenumberofoutputfilesintheoutputdirectory,butusuallythatisnotimportantbecausethenextmap/reducestepwillsplitthemintoevensmallersplitsforthemaps.

Thenumberofreducetaskscanalsobeincreasedinthesamewayasthemaptasks,viaJobConf'sconf.setNumReduceTasks(intnum).

自己的理解:

mapper个数的设置:跟inputfile有关系,也跟filesplits有关系,filesplits的上线为dfs.block.size,下线可以通过mapred.min.split.size设置,最后还是由InputFormat决定。

较好的建议:

Therightnumberofreducesseemstobe0.95or1.75multipliedby(<no.ofnodes>*mapred.tasktracker.reduce.tasks.maximum).increasingthenumberofreducesincreasestheframeworkoverhead,butincreasesloadbalancingandlowersthecostoffailures.

<property>

<name>mapred.tasktracker.reduce.tasks.maximum</name>

<value>2</value>

<description>Themaximumnumberofreducetasksthatwillberun

simultaneouslybyatasktracker.

</description>

</property>

单个node新加硬盘

1.修改需要新加硬盘的node的dfs.data.dir,用逗号分隔新、旧文件目录

2.重启dfs

同步hadoop代码

hadoop-env.sh

#host:pathwherehadoopcodeshouldbersync'dfrom.Unsetbydefault.

#exportHADOOP_MASTER=master:/home/$USER/src/hadoop

用命令合并HDFS小文件

hadoopfs-getmerge<src><dest>

重启reducejob方法

IntroducedrecoveryofjobswhenJobTrackerrestarts.Thisfacilityisoffbydefault.

Introducedconfigparameters"mapred.jobtracker.restart.recover","mapred.jobtracker.job.history.block.size",and"mapred.jobtracker.job.history.buffer.size".

还未验证过。

IO写操作出现问题

0-1246359584298,infoPort=50075,ipcPort=50020):Gotexceptionwhileservingblk_-5911099437886836280_1292to/172.16.100.165:

java.net.SocketTimeoutException:480000millistimeoutwhilewaitingforchanneltobereadyforwrite.ch:java.nio.channels.SocketChannel[connectedlocal=/

172.16.100.165:50010remote=/172.16.100.165:50930]

atorg.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185)

atorg.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159)

atorg.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:198)

atorg.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:293)

atorg.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:387)

atorg.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:179)

atorg.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:94)

atjava.lang.Thread.run(Thread.java:619)

Itseemstherearemanyreasonsthatitcantimeout,theexamplegivenin

HADOOP-3831isaslowreadingclient.

解决办法:在hadoop-site.xml中设置dfs.datanode.socket.write.timeout=0试试;

MyunderstandingisthatthisissueshouldbefixedinHadoop0.19.1sothat

weshouldleavethestandardtimeout.Howeveruntilthenthiscanhelp

resolveissuesliketheoneyou'reseeing.

HDFS退服节点的方法

目前版本的dfsadmin的帮助信息是没写清楚的,已经file了一个bug了,正确的方法如下:

1.将dfs.hosts置为当前的slaves,文件名用完整路径,注意,列表中的节点主机名要用大名,即uname-n可以得到的那个。

2.将slaves中要被退服的节点的全名列表放在另一个文件里,如slaves.ex,使用dfs.host.exclude参数指向这个文件的完整路径

3.运行命令bin/hadoopdfsadmin-refreshNodes

4.web界面或bin/hadoopdfsadmin-report可以看到退服节点的状态是Decomissioninprogress,直到需要复制的数据复制完成为止

5.完成之后,从slaves里(指dfs.hosts指向的文件)去掉已经退服的节点

附带说一下-refreshNodes命令的另外三种用途:

2.添加允许的节点到列表中(添加主机名到dfs.hosts里来)

3.直接去掉节点,不做数据副本备份(在dfs.hosts里去掉主机名)

4.退服的逆操作——停止exclude里面和dfs.hosts里面都有的,正在进行decomission的节点的退服,也就是把Decomissioninprogress的节点重新变为Normal(在web界面叫inservice)

hadoop学习借鉴

1.解决hadoopOutOfMemoryError问题:

<property>

<name>mapred.child.java.opts</name>

<value>-Xmx800M-server</value>

</property>

WiththerightJVMsizeinyourhadoop-site.xml,youwillhavetocopythis

toallmaprednodesandrestartthecluster.

或者:hadoopjarjarfile[mainclass]-Dmapred.child.java.opts=-Xmx800M

2.Hadoopjava.io.IOException:Jobfailed!atorg.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1232)whileindexing.

wheniusenutch1.0,getthiserror:

Hadoopjava.io.IOException:Jobfailed!atorg.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1232)whileindexing.

这个也很好解决:

可以删除conf/log4j.properties,然后可以看到详细的错误报告

我这儿出现的是outofmemory

解决办法是在给运行主类org.apache.nutch.crawl.Crawl加上参数:-Xms64m-Xmx512m

你的或许不是这个问题,但是能看到详细的错误报告问题就好解决了

distributecache使用

类似一个全局变量,但是由于这个变量较大,所以不能设置在config文件中,转而使用distributecache

具体使用方法:(详见《thedefinitiveguide》,P240)

1.在命令行调用时:调用-files,引入需要查询的文件(可以是localfile,HDFSfile(使用hdfs://xxx?)),或者-archives(JAR,ZIP,tar等)

%hadoopjarjob.jarMaxTemperatureByStationNameUsingDistributedCacheFile/

-filesinput/ncdc/metadata/stations-fixed-width.txtinput/ncdc/alloutput

2.程序中调用:

publicvoidconfigure(JobConfconf){

metadata=newNcdcStationMetadata();

try{

metadata.initialize(newFile("stations-fixed-width.txt"));

}catch(IOExceptione){

thrownewRuntimeException(e);

}

}

另外一种间接的使用方法:在hadoop-0.19.0中好像没有

调用addCacheFile()或者addCacheArchive()添加文件,

使用getLocalCacheFiles()或getLocalCacheArchives()获得文件

hadoop的job显示web

Thereareweb-basedinterfacestoboththeJobTracker(MapReducemaster)andNameNode(HDFSmaster)whichdisplaystatuspagesaboutthestateoftheentiresystem.Bydefault,thesearelocatedat[WWW]http://job.tracker.addr:50030/and[WWW]http://name.node.addr:50070/.

hadoop监控

OnlyXP(52388483)131702

用nagios作告警,ganglia作监控图表即可

statusof255error

错误类型:

java.io.IOException:Taskprocessexitwithnonzerostatusof255.

atorg.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:424)

错误原因:

Setmapred.jobtracker.retirejob.intervalandmapred.userlog.retain.hourstohighervalue.Bydefault,theirvaluesare24hours.Thesemightbethereasonforfailure,thoughI'mnotsure

splitsize

FileInputFormatinputsplits:(详见《thedefinitiveguide》P190)

mapred.min.split.size:default=1,thesmallestvalidesizeinbytesforafilesplit.

mapred.max.split.size:default=Long.MAX_VALUE,thelargestvalidsize.

dfs.block.size:default=64M,系统中设置为128M。

如果设置minimumsplitsize>blocksize,会增加块的数量。(猜想从其他节点拿去数据的时候,会合并block,导致block数量增多)

如果设置maximumsplitsize<blocksize,会进一步拆分block。

splitsize=max(minimumSize,min(maximumSize,blockSize));

其中minimumSize<blockSize<maximumSize.

sortbyvalue

hadoop不提供直接的sortbyvalue方法,因为这样会降低mapreduce性能。

但可以用组合的办法来实现,具体实现方法见《thedefinitiveguide》,P250

基本思想:

1.组合key/value作为新的key;

2.重载partitioner,根据oldkey来分割;

conf.setPartitionerClass(FirstPartitioner.class);

3.自定义keyComparator:先根据oldkey排序,再根据oldvalue排序;

conf.setOutputKeyComparatorClass(KeyComparator.class);

4.重载GroupComparator,也根据oldkey来组合;conf.setOutputValueGroupingComparator(GroupComparator.class);

smallinputfiles的处理

对于一系列的smallfiles作为inputfile,会降低hadoop效率。

有3种方法可以将smallfile合并处理:

1.将一系列的smallfiles合并成一个sequneceFile,加快mapreduce速度。

详见WholeFileInputFormat及SmallFilesToSequenceFileConverter,《thedefinitiveguide》,P194

2.使用CombineFileInputFormat集成FileinputFormat,但是未实现过;

3.使用hadooparchives(类似打包),减少小文件在namenode中的metadata内存消耗。(这个方法不一定可行,所以不建议使用)

方法:

将/my/files目录及其子目录归档成files.har,然后放在/my目录下

bin/hadooparchive-archiveNamefiles.har/my/files/my

查看filesinthearchive:

bin/hadoopfs-lsrhar://my/files.har

skipbadrecords

JobConfconf=newJobConf(ProductMR.class);

conf.setJobName("ProductMR");

conf.setOutputKeyClass(Text.class);

conf.setOutputValueClass(Product.class);

conf.setMapperClass(Map.class);

conf.setReducerClass(Reduce.class);

conf.setMapOutputCompressorClass(DefaultCodec.class);

conf.setInputFormat(SequenceFileInputFormat.class);

conf.setOutputFormat(SequenceFileOutputFormat.class);

Stringobjpath="abc1";

SequenceFileInputFormat.addInputPath(conf,newPath(objpath));

SkipBadRecords.setMapperMaxSkipRecords(conf,Long.MAX_VALUE);

SkipBadRecords.setAttemptsToStartSkipping(conf,0);

SkipBadRecords.setSkipOutputPath(conf,newPath("data/product/skip/"));

Stringoutput="abc";

SequenceFileOutputFormat.setOutputPath(conf,newPath(output));

JobClient.runJob(conf);

Forskippingfailedtaskstry:mapred.max.map.failures.percent

restart单个datanode

如果一个datanode出现问题,解决之后需要重新加入cluster而不重启cluster,方法如下:

bin/hadoop-daemon.shstartdatanode

bin/hadoop-daemon.shstartjobtracker

reduceexceed100%

"ReduceTaskProgressshows>100%whenthetotalsizeofmapoutputs(fora

singlereducer)ishigh"

造成原因:

在reduce的merge过程中,checkprogress有误差,导致status>100%,在统计过程中就会出现以下错误:java.lang.ArrayIndexOutOfBoundsException:3

atorg.apache.hadoop.mapred.StatusHttpServer$TaskGraphServlet.getReduceAvarageProgresses(StatusHttpServer.java:228)

atorg.apache.hadoop.mapred.StatusHttpServer$TaskGraphServlet.doGet(StatusHttpServer.java:159)

atjavax.servlet.http.HttpServlet.service(HttpServlet.java:689)

atjavax.servlet.http.HttpServlet.service(HttpServlet.java:802)

atorg.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:427)

atorg.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:475)

atorg.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:567)

atorg.mortbay.http.HttpContext.handle(HttpContext.java:1565)

atorg.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:635)

atorg.mortbay.http.HttpContext.handle(HttpContext.java:1517)

atorg.mortbay.http.HttpServer.service(HttpServer.java:954)

jira地址:

counters

3中counters:

1.built-incounters:Mapinputbytes,Mapoutputrecords...

2.enumcounters

调用方式:

enumTemperature{

MISSING,

MALFORMED

}

reporter.incrCounter(Temperature.MISSING,1)

结果显示:

09/04/2006:33:36INFOmapred.JobClient:AirTemperatureRecor

09/04/2006:33:36INFOmapred.JobClient:Malformed=3

09/04/2006:33:36INFOmapred.JobClient:Missing=66136856

3.dynamiccountes:

调用方式:

reporter.incrCounter("TemperatureQuality",parser.getQuality(),1);

结果显示:

09/04/2006:33:36INFOmapred.JobClient:TemperatureQuality

09/04/2006:33:36INFOmapred.JobClient:2=1246032

09/04/2006:33:36INFOmapred.JobClient:1=973422173

09/04/2006:33:36INFOmapred.JobClient:0=1

7:Namenodeinsafemode

解决方法

bin/hadoopdfsadmin-safemodeleave

8:java.net.NoRouteToHostException:Noroutetohost

j解决方法:

sudo/etc/init.d/iptablesstop

9:更改namenode后,在hive中运行select依旧指向之前的namenode地址

这是因为:Whenyoucreateatable,hiveactuallystoresthelocationofthetable(e.g.

hdfs://ip:port/user/root/...)intheSDSandDBStablesinthemetastore.SowhenIbringupanewclusterthemasterhasanewIP,buthive'smetastoreisstillpointingtothelocationswithintheold

cluster.IcouldmodifythemetastoretoupdatewiththenewIPeverytimeIbringupacluster.ButtheeasierandsimplersolutionwastojustuseanelasticIPforthemaster

所以要将metastore中的之前出现的namenode地址全部更换为现有的namenode地址

10:YourDataNodeisstartedandyoucancreatedirectorieswithbin/hadoopdfs-mkdir,butyougetanerrormessagewhenyoutrytoputfilesintotheHDFS(e.g.,whenyourunacommandlikebin/hadoopdfs-put).

解决方法:

GototheHDFSinfowebpage(openyourwebbrowserandgotohttp://namenode:dfs_info_portwherenamenodeisthehostnameofyourNameNodeanddfs_info_portistheportyouchosedfs.info.port;iffollowedtheQuickStartonyourpersonalcomputerthenthisURLwillbehttp://localhost:50070).OnceatthatpageclickonthenumberwhereittellsyouhowmanyDataNodesyouhavetolookatalistoftheDataNodesinyourcluster.

Ifitsaysyouhaveused100%ofyourspace,thenyouneedtofreeuproomonlocaldisk(s)oftheDataNode(s).

IfyouareonWindowsthenthisnumberwillnotbeaccurate(thereissomekindofbugeitherinCygwin'sdf.exeorinWindows).Justfreeupsomemorespaceandyoushouldbeokay.OnoneWindowsmachinewetriedthediskhad1GBfreebutHadoopreportedthatitwas100%full.Thenwefreedupanother1GBandthenitsaidthatthediskwas99.15%fullandstartedwritingdataintotheHDFSagain.WeencounteredthisbugonWindowsXPSP2.

11:YourDataNodeswon'tstart,andyouseesomethinglikethisinlogs/*datanode*:

IncompatiblenamespaceIDsin/tmp/hadoop-ross/dfs/data

原因:

YourHadoopnamespaceIDbecamecorrupted.UnfortunatelytheeasiestthingtodoreformattheHDFS.

解决方法:

Youneedtodosomethinglikethis:

bin/stop-all.sh

rm-Rf/tmp/hadoop-your-username/*

bin/hadoopnamenode-format

12:YoucanrunHadoopjobswritteninJava(likethegrepexample),butyourHadoopStreamingjobs(suchasthePythonexamplethatfetcheswebpagetitles)won'twork.

原因:

Youmighthavegivenonlyarelativepathtothemapperandreducerprograms.Thetutorialoriginallyjustspecifiedrelativepaths,butabsolutepathsarerequiredifyouarerunninginarealcluster.

解决方法:

Useabsolutepathslikethisfromthetutorial:

bin/hadoopjarcontrib/hadoop-0.15.2-streaming.jar/

-mapper$HOME/proj/hadoop/multifetch.py/

-reducer$HOME/proj/hadoop/reducer.py/

-inputurls/*/

-outputtitles

13:2009-01-0810:02:40,709ERRORmetadata.Hive(Hive.java:getPartitions(499))-javax.jdo.JDODataStoreException:Requiredtablemissing:""PARTITIONS""inCatalog""Schema"".JPOXrequiresthistabletoperformitspersistenceoperations.EitheryourMetaDataisincorrect,oryouneedtoenable"org.jpox.autoCreateTables"

原因:就是因为在hive-default.xml里把org.jpox.fixedDatastore设置成true了

startingnamenode,loggingto/home/hadoop/HadoopInstall/hadoop/bin/../logs/hadoop-hadoop-namenode-hadoop.out

localhost:startingdatanode,loggingto/home/hadoop/HadoopInstall/hadoop/bin/../logs/hadoop-hadoop-datanode-hadoop.out

localhost:startingsecondarynamenode,loggingto/home/hadoop/HadoopInstall/hadoop/bin/../logs/hadoop-hadoop-secondarynamenode-hadoop.out

localhost:Exceptioninthread"main"java.lang.NullPointerException

localhost:atorg.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:130)

localhost:atorg.apache.hadoop.dfs.NameNode.getAddress(NameNode.java:116)

localhost:atorg.apache.hadoop.dfs.NameNode.getAddress(NameNode.java:120)

localhost:atorg.apache.hadoop.dfs.SecondaryNameNode.initialize(SecondaryNameNode.java:124)

localhost:atorg.apache.hadoop.dfs.SecondaryNameNode.<init>(SecondaryNameNode.java:108)

localhost:atorg.apache.hadoop.dfs.SecondaryNameNode.main(SecondaryNameNode.java:460)

14:09/08/3118:25:45INFOhdfs.DFSClient:ExceptionincreateBlockOutputStreamjava.io.IOException:BadconnectackwithfirstBadLink192.168.1.11:50010

>09/08/3118:25:45INFOhdfs.DFSClient:Abandoningblockblk_-8575812198227241296_1001

>09/08/3118:25:51INFOhdfs.DFSClient:ExceptionincreateBlockOutputStreamjava.io.IOException:

BadconnectackwithfirstBadLink192.168.1.16:50010

>09/08/3118:25:51INFOhdfs.DFSClient:Abandoningblockblk_-2932256218448902464_1001

>09/08/3118:25:57INFOhdfs.DFSClient:ExceptionincreateBlockOutputStreamjava.io.IOException:

BadconnectackwithfirstBadLink192.168.1.11:50010

>09/08/3118:25:57INFOhdfs.DFSClient:Abandoningblockblk_-1014449966480421244_1001

>09/08/3118:26:03INFOhdfs.DFSClient:ExceptionincreateBlockOutputStreamjava.io.IOException:

BadconnectackwithfirstBadLink192.168.1.16:50010

>09/08/3118:26:03INFOhdfs.DFSClient:Abandoningblockblk_7193173823538206978_1001

>09/08/3118:26:09WARNhdfs.DFSClient:DataStreamerException:java.io.IOException:Unable

tocreatenewblock.

>atorg.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2731)

>atorg.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:1996)

>atorg.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2182)

>

>09/08/3118:26:09WARNhdfs.DFSClient:ErrorRecoveryforblockblk_7193173823538206978_1001

baddatanode[2]nodes==null

>09/08/3118:26:09WARNhdfs.DFSClient:Couldnotgetblocklocations.Sourcefile"/user/umer/8GB_input"

-Aborting...

>put:BadconnectackwithfirstBadLink192.168.1.16:50010

解决方法:

Ihaveresolvedtheissue:

Whatidid:

1)'/etc/init.d/iptablesstop'-->stoppedfirewall

2)SELINUX=disabledin'/etc/selinux/config'file.-->disabledselinux

Iworkedformeafterthesetwochanges

解决jline.ConsoleReader.readLine在Windows上不生效问题方法

在CliDriver.java的main()函数中,有一条语句reader.readLine,用来读取标准输入,但在Windows平台上该语句总是返回null,这个reader是一个实例jline.ConsoleReader实例,给WindowsEclipse调试带来不便。

我们可以通过使用java.util.Scanner.Scanner来替代它,将原来的

while((line=reader.readLine(curPrompt+">"))!=null)

复制代码

替换为:

Scannersc=newScanner(System.in);

while((line=sc.nextLine())!=null)

复制代码

重新编译发布,即可正常从标准输入读取输入的SQL语句了。

Windowseclispe调试hive报doesnothaveascheme错误可能原因

1、Hive配置文件中的“hive.metastore.local”配置项值为false,需要将它修改为true,因为是单机版

2、没有设置HIVE_HOME环境变量,或设置错误

3、“doesnothaveascheme”很可能是因为找不到“hive-default.xml”。使用Eclipse调试Hive时,遇到找不到hive-default.xml的解决方法:http://bbs.hadoopor.com/thread-292-1-1.html

1、中文问题

从url中解析出中文,但hadoop中打印出来仍是乱码?我们曾经以为hadoop是不支持中文的,后来经过查看源代码,发现hadoop仅仅是不支持以gbk格式输出中文而己。

这是TextOutputFormat.class中的代码,hadoop默认的输出都是继承自FileOutputFormat来的,FileOutputFormat的两个子类一个是基于二进制流的输出,一个就是基于文本的输出TextOutputFormat。

publicclassTextOutputFormat<K,V>extendsFileOutputFormat<K,V>{

protectedstaticclassLineRecordWriter<K,V>

implementsRecordWriter<K,V>{

privatestaticfinalStringutf8=“UTF-8″;//这里被写死成了utf-8

privatestaticfinalbyte[]newline;

static{

try{

newline=“/n”.getBytes(utf8);

}catch(UnsupportedEncodingExceptionuee){

thrownewIllegalArgumentException(”can’tfind”+utf8+”encoding”);

}

}

publicLineRecordWriter(DataOutputStreamout,StringkeyValueSeparator){

this.out=out;

try{

this.keyValueSeparator=keyValueSeparator.getBytes(utf8);

}catch(UnsupportedEncodingExceptionuee){

thrownewIllegalArgumentException(”can’tfind”+utf8+”encoding”);

}

}

privatevoidwriteObject(Objecto)throwsIOException{

if(oinstanceofText){

Textto=(Text)o;

out.write(to.getBytes(),0,to.getLength());//这里也需要修改

}else{

out.write(o.toString().getBytes(utf8));

}

}

}

可以看出hadoop默认的输出写死为utf-8,因此如果decode中文正确,那么将Linux客户端的character设为utf-8是可以看到中文的。因为hadoop用utf-8的格式输出了中文。

因为大多数数据库是用gbk来定义字段的,如果想让hadoop用gbk格式输出中文以兼容数据库怎么办?

我们可以定义一个新的类:

publicclassGbkOutputFormat<K,V>extendsFileOutputFormat<K,V>{

protectedstaticclassLineRecordWriter<K,V>

implementsRecordWriter<K,V>{

//写成gbk即可

privatestaticfinalStringgbk=“gbk”;

privatestaticfinalbyte[]newline;

static{

try{

newline=“/n”.getBytes(gbk);

}catch(UnsupportedEncodingExceptionuee){

thrownewIllegalArgumentException(”can’tfind”+gbk+”encoding”);

}

}

publicLineRecordWriter(DataOutputStreamout,StringkeyValueSeparator){

this.out=out;

try{

this.keyValueSeparator=keyValueSeparator.getBytes(gbk);

}catch(UnsupportedEncodingExceptionuee){

thrownewIllegalArgumentException(”can’tfind”+gbk+”encoding”);

}

}

privatevoidwriteObject(Objecto)throwsIOException{

if(oinstanceofText){

//Textto=(Text)o;

//out.write(to.getBytes(),0,to.getLength());

//}else{

out.write(o.toString().getBytes(gbk));

}

}

}

然后在mapreduce代码中加入conf1.setOutputFormat(GbkOutputFormat.class)

即可以gbk格式输出中文。

2、某次正常运行mapreduce实例时,抛出错误

java.io.IOException:Alldatanodesxxx.xxx.xxx.xxx:xxxarebad.Aborting…

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

java.io.IOException:Couldnotgetblocklocations.Aborting…

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2143)

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

经查明,问题原因是linux机器打开了过多的文件导致。用命令ulimit-n可以发现linux默认的文件打开数目为1024,修改/ect/security/limit.conf,增加hadoopsoft65535

再重新运行程序(最好所有的datanode都修改),问题解决

3、运行一段时间后hadoop不能stop-all.sh的问题,显示报错

notasktrackertostop,nodatanodetostop

问题的原因是hadoop在stop的时候依据的是datanode上的mapred和dfs进程号。而默认的进程号保存在/tmp下,linux默认会每隔一段时间(一般是一个月或者7天左右)去删除这个目录下的文件。因此删掉hadoop-hadoop-jobtracker.pid和hadoop-hadoop-namenode.pid两个文件后,namenode自然就找不到datanode上的这两个进程了。

在配置文件中的exportHADOOP_PID_DIR可以解决这个问题

问题:

IncompatiblenamespaceIDsin/usr/local/hadoop/dfs/data:namenodenamespaceID=405233244966;datanodenamespaceID=33333244

原因:

在每次执行hadoopnamenode-format时,都会为NameNode生成namespaceID,,但是在hadoop.tmp.dir目录下的DataNode还是保留上次的namespaceID,因为namespaceID的不一致,而导致DataNode无法启动,所以只要在每次执行hadoopnamenode-format之前,先删除hadoop.tmp.dir目录就可以启动成功。请注意是删除hadoop.tmp.dir对应的本地目录,而不是HDFS目录。

Problem:Storagedirectorynotexist

2010-02-0921:37:53,203INFOorg.apache.hadoop.hdfs.server.common.Storage:StoragedirectoryD:/hadoop/run/dfs_name_dirdoesnotexist.

2010-02-0921:37:53,203ERRORorg.apache.hadoop.hdfs.server.namenode.FSNamesystem:FSNamesysteminitializationfailed.

org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:DirectoryD:/hadoop/run/dfs_name_dirisinaninconsistentstate:storagedirectorydoesnotexistorisnotaccessible.

solution:是因为存储目录D:/hadoop/run/dfs_name_dir不存在,所以只需要手动创建好这个目录即可。

Problem:NameNodeisnotformatted

solution:是因为HDFS还没有格式化,只需要运行hadoopnamenode-format一下,然后再启动即可

bin/hadoopjps后报如下异常:

Exceptioninthread"main"java.lang.NullPointerException

atsun.jvmstat.perfdata.monitor.protocol.local.LocalVmManager.activeVms(LocalVmManager.java:127)

atsun.jvmstat.perfdata.monitor.protocol.local.MonitoredHostProvider.activeVms(MonitoredHostProvider.java:133)

atsun.tools.jps.Jps.main(Jps.java:45)

原因为:

系统根目录/tmp文件夹被删除了。重新建立/tmp文件夹即可。

bin/hive中出现unabletocreatelogdirectory/tmp/...也可能是这个原因