hadoop笔记Word文档格式.docx
《hadoop笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《hadoop笔记Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
map92%reduce4%
58INFOmapred.JobClient:
map100%reduce4%
56:
19INFOmapred.JobClient:
TaskId:
attempt_201111222034_0001_m_000002_0,Status:
FAILED
19WARNmapred.JobClient:
ErrorreadingtaskoutputConnectionrefused
一、错误分析
Reducetask启动后第一个阶段是shuffle,即向map端fetch数据。
每次fetch都可能因为connect超时,read超时,checksum错误等原因而失败。
Reducetask为每个map设置了一个计数器,用以记录fetch该map输出时失败的次数。
当失败次数达到一定阈值时,会通知JobTrackerfetch该map输出操作失败次数太多了,并打印如下log:
Failedtofetchmap-outputfromattempt_201105261254_102769_m_001802_0evenafterMAX_FETCH_RETRIES_PER_MAPretries...reportingtotheJobTracker
其中阈值计算方式为:
max(MIN_FETCH_RETRIES_PER_MAP,
getClosestPowerOf2((this.maxBackoff*1000/BACKOFF_INIT)+1));
默认情况下MIN_FETCH_RETRIES_PER_MAP=2maxBackoff=300BACKOFF_INIT=4000,因此默认阈值为6,可通过修改mapred.reduce.copy.backoff参数来调整。
当达到阈值后,Reducetask通过umbilical协议告诉TaskTracker,TaskTracker在下一次heartbeat时,通知JobTracker。
当JobTracker发现超过50%的Reduce汇报fetch某个map的输出多次失败后,JobTracker会failed掉该map并重新调度,打印如下log:
"
Toomanyfetch-failuresforoutputoftask:
attempt_201105261254_102769_m_001802_0...killingit"
二、出错原因及更正:
很可能是节点间的联通不够全面.
1)检查、/etc/hosts
要求本机ip对应
服务
器名
要求要包含所有的服务器ip+服务器名
本人使用的是虚拟机OS为:
ubuntu11.04,重启系统后出现该错误,最后发现ubuntu系统在每次启动时,会在/etc/hosts文件最前端添加如下信息:
127.0.0.1localhost
your_hostname
:
1
localdata1
若将这两条信息注销掉,(或者把your_hostname删除掉)上述错误即可解决。
2)检查.ssh/authorized_keys
要求包含所有服务器(包括其自身)的publickey
尽管我们在安装hadoop之前已经配置了各节点的SSH无密码通信,假如有3个IP分别为192.168.128.131
192.168.128.132
192.168.133,对应的主机名为master、slave1、slave2。
从每个节点第一次执行命令$ssh
主机名(master、slave1、slave2)的时候,会出现一行关于密钥的yesorno?
的提示信息,Enter确认后再次连接就正常了。
如果我们没有手动做这一步,如果恰好在hadoop/conf/core-site.xml及mpred-site.xml中相应的IP用主机名代替了,则很可能出现该异常。
3.ERRORorg.apache.hadoop.hdfs.server.datanode.DataNode:
java.io.IOException:
IncompatiblenamespaceID
问题的产生:
今天遇到了一个问题
我执行了./hadoopnamenode-format之后
启动hadoop:
./start-all.sh
的时候
运行jps发现datanode没有起来但是TaskTracker是正常启动的
然后我去datanode的错误日志里面发现的下面的问题:
2012-11-2314:
31:
14,319INFOorg.apache.hadoop.metrics2.impl.MetricsConfig:
loadedpropertiesfromhadoop-metrics2.properties
14,334INFOorg.apache.hadoop.metrics2.impl.MetricsSourceAdapter:
MBeanforsourceMetricsSystem,sub=Statsregistered.
14,335INFOorg.apache.hadoop.metrics2.impl.MetricsSystemImpl:
Scheduledsnapshotperiodat10second(s).
DataNodemetricssystemstarted
14,406INFOorg.apache.hadoop.metrics2.impl.MetricsSourceAdapter:
MBeanforsourceugiregistered.
14,798ERRORorg.apache.hadoop.hdfs.server.datanode.DataNode:
IncompatiblenamespaceIDsin/data/hdfs/data:
namenodenamespaceID=971169702;
datanodenamespaceID=1507918015
atorg.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:
232)
atorg.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:
147)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:
385)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.<
init>
(DataNode.java:
299)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:
1582)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:
1521)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:
1539)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:
1665)
atorg.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:
1682)
/data/hdfs/data
这个目录是我
hdfs-site.xml配置文件里面dfs.data.dir的值:
<
property>
<
name>
dfs.data.dir<
/name>
value>
/data/hdfs/data<
/value>
/property>
解决的办法:
1.进入每个datanode的dfs.data.dir的current目录,修改里面的文件VERSION
#FriNov2315:
00:
17CST2012
namespaceID=246015542
storageID=DS-2085496284-192.168.1.244-50010-135********03
cTime=0
storageType=DATA_NODE
layoutVersion=-32
里面有个namespaceID将其修改成为报错信息中的
namenodenamespaceID=971169702
相同的namespaceID
.
然后重新启动datanode全部都能正常启动了。
2.由于是测试环境,于是产生的第一个想法是直接删除每个datanode上面dfs.data.dir目录下所有的文件
rm-rf*
删除之后
重新启动也是可以正常的启动所有的datanode
进到dfs.data.dir目录下所有的datanode又全部重新生成了。
4.ssh中“Hostkeyverificationfailed.“的解决方案
所有的节点都要配置
我们使用ssh链接linux主机时,可能出现“Hostkeyverificationfailed.“的提示,ssh连接不成功。
可能的提示信息如下:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@WARNING:
REMOTEHOSTIDENTIFICATIONHASCHANGED!
@
ITISPOSSIBLETHATSOMEONEISDOINGSOMETHINGNASTY!
Someonecouldbeeavesdroppingonyourightnow(man-in-the-middleattack)!
ItisalsopossiblethattheRSAhostkeyhasjustbeenchanged.
ThefingerprintfortheRSAkeysentbytheremotehostis
23:
20:
83:
de:
02:
95:
f1:
e3:
34:
be:
57:
3f:
cf:
2c:
e7.
Pleasecontactyoursystemadministrator.
Addcorrecthostkeyin/home/xahria/.ssh/known_hoststogetridofthismessage.
Offendingkeyin/home/xahria/.ssh/known_hosts:
8
RSAhostkeyforlocalhosthaschangedandyouhaverequestedstrictchecking.
Hostkeyverificationfailed.
网上很多的解决方案是:
vi~/.ssh/known_hosts删除与想要连接的主机相关的行;
或者直接删除known_hosts这个文件。
当然这个方案也是可行的,但并非解决问题的根本办法,因为继续使用,今后还会出现这样的情况,还得再删除。
下面简单讲一下这个问题的原理和比较长久的解决方案。
用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(publickey)都记录在~/.ssh/known_hosts。
当下次访问相同计算机时,OpenSSH会核对公钥。
如果公钥不同,OpenSSH会发出警告,避免你受到DNSHijack之类的攻击。
SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来配置的。
默认情况下,StrictHostKeyChecking=ask。
简单所下它的三种配置值:
1.StrictHostKeyChecking=no
#最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。
如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
2.StrictHostKeyChecking=ask
#默认的级别,就是出现刚才的提示了。
如果连接和key不匹配,给出提示,并拒绝登录。
3.StrictHostKeyChecking=yes
#最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
对于我来说,在内网的进行的一些测试,为了方便,选择最低的安全级别。
在.ssh/config(或者/etc/ssh/ssh_config)中配置:
StrictHostKeyCheckingno
UserKnownHostsFile/dev/null
(注:
这里为了简便,将knownhostfile设为/dev/null,就不保存在known_hosts中了)
二.配置hadoop
1.伪分布式模式
新建用户和组
addgrouphadoop
adduser--ingrouphadoophadoop
注销root以hadoop用户登录
配置SSH
ssh-keygen-trsa(密码为空,路径默认)
cp.ssh/id_rsa.pub.ssh/authorized_keys
准备HADOOP运行环境
wgethttps:
//archive.apache.org/dist/hadoop/core/hadoop-1.1.2/hadoop-1.1.2.tar.gz
tar-xzvfhadoop-1.1.2.tar.gz
在/home/hadoop/.bashrc中追加:
exportPATH=/home/hadoop/hadoop-1.1.2/bin:
$PATH
重新登录就生效
sshlocalhost
whichhadoop
配置HADOOP运行参数
viconf/hadoop-env.sh
exportJAVA_HOME=/usr/lib/jvm/jdk1.8.0_11
viconf/core-site.xml
fs.default.name<
hdfs:
//localhost:
9000<
hadoop.tmp.dir<
/home/hadoop/tmp<
viconf/hdfs-site.xml
dfs.name.dir<
/home/hadoop/dfs/filesystem/name<
/home/hadoop/dfs/filesystem/data<
dfs.replication<
1<
viconf/mapred-site.xml
mapred.job.tracker<
localhost:
9001<
mapred.tasktracker.map.tasks.maximum<
4<
mapred.tasktracker.reduce.tasks.maximum<
mapred.system.dir<
/home/hadoop/mapreduce/system<
mapred.local.dir<
/home/hadoop/mapreduce/local<
格式化名称节点并启动集群
hadoopnamenode-format
启动集群并查看WEB管理界面
start-all.sh
访问http:
50030可以查看JobTracker的运行状态
50060可以查看TaskTracker的运行状态
50070可以查看NameNode以及整个分布式文件系统的状态,浏览分布式文件系统中的文件以及log等
停止集群
stop-all.sh停止集群
2.多机完全分布式模式
三台机器
namenode(NameNode、SecondaryNameNode、JobTracker、DataNode、TaskTracker)
data1(DataNode、TaskTracker)
data2(DataNode、TaskTracker)
vi/etc/hostname(分别给每一台主机指定主机名,主机名必须唯一,如三台机器的主机名分别为namenode,data1,data2)
vi/etc/hosts(分别给每一台主机指定主机名到IP地址的映射)
三台机器上面都要新建用户和组
adduser--ingrouphadoophadoop
gpasswd-ahadoopsudo
更改临时目录权限
chmod777/tmp
在namenode上面执行
ssh-keygen-trsa(密码为空,路径默认)
该命令会在用户主目录下创建.ssh目录,并在其中创建两个文件:
id_rsa私钥文件,是基于RSA算法创建,该私钥文件要妥善保管,不要泄漏。
id_rsa.pub公钥文件,和id_rsa文件是一对儿,该文件作为公钥文件,可以公开
把公钥追加到其他主机的authorized_keys文件中
ssh-copy-id-i.ssh/id_rsa.pubhadoop@namenode
ssh-copy-id-i.ssh/id_rsa.pubhadoop@data1
ssh-copy-id-i.ssh/id_rsa.pubhadoop@data2
可以在namenode上面通过ssh无密码登陆data1和data2
sshnamenode
sshdata1
sshdata2
同理在data1,data2,也执行相同的操作
source.bashrc
viconf/masters
把localhost替换为:
namenode
vi