hadoop笔记

发布时间:2014-10-30 09:56:14   来源:文档文库   
字号:

一. 操作过程中的总结

1. jps 查看启动的java进程

2. Reduce作业运行时错误:Too many fetch-failures

root@ubuntu:/usr/local/hadoop# bin/hadoop jar hadoop-*-examples.jar wordcount /test1 /test2
11/11/22 20:42:33 INFO input.FileInputFormat: Total input paths to process : 14
11/11/22 20:42:33 INFO mapred.JobClient: Running job: job_201111222034_0001
11/11/22 20:42:34 INFO mapred.JobClient:  map 0% reduce 0%
11/11/22 20:45:07 INFO mapred.JobClient:  map 14% reduce 0%
11/11/22 20:45:43 INFO mapred.JobClient:  map 14% reduce 4%
11/11/22 20:45:54 INFO mapred.JobClient:  map 28% reduce 4%
11/11/22 20:46:43 INFO mapred.JobClient:  map 57% reduce 4%
11/11/22 20:46:52 INFO mapred.JobClient:  map 85% reduce 4%
11/11/22 20:46:55 INFO mapred.JobClient:  map 92% reduce 4%
11/11/22 20:46:58 INFO mapred.JobClient:  map 100% reduce 4%
11/11/22 20:56:19 INFO mapred.JobClient: Task Id : attempt_201111222034_0001_m_000002_0, Status : FAILED
Too many fetch-failures
11/11/22 20:56:19 WARN mapred.JobClient: Error reading task outputConnection refused
11/11/22 20:56:19 WARN mapred.JobClient: Error reading task outputConnection refused

一、错误分析

Reduce task启动后第一个阶段是shuffle,即向mapfetch数据。每次fetch都可能因为connect超时,read超时,checksum错误等原因而失败。Reduce task为每个map设置了一个计数器,用以记录fetchmap输出时失败的次数。当失败次数达到一定阈值时,会通知JobTracker fetchmap输出操作失败次数太多了,并打印如下log

Failed to fetch map-output from attempt_201105261254_102769_m_001802_0 even after MAX_FETCH_RETRIES_PER_MAP retries... reporting to the JobTracker

其中阈值计算方式为:

max(MIN_FETCH_RETRIES_PER_MAP,

getClosestPowerOf2((this.maxBackoff * 1000 / BACKOFF_INIT) + 1));

默认情况下MIN_FETCH_RETRIES_PER_MAP=2 maxBackoff=300 BACKOFF_INIT=4000,因此默认阈值为6,可通过修改mapred.reduce.copy.backoff参数来调整。

当达到阈值后,Reduce task通过umbilical协议告诉TaskTrackerTaskTracker在下一次heartbeat时,通知JobTracker。当JobTracker发现超过50%Reduce汇报fetch某个map的输出多次失败后,JobTrackerfailed掉该map并重新调度,打印如下log

"Too many fetch-failures for output of task: attempt_201105261254_102769_m_001802_0 ... killing it"

二、出错原因及更正:

很可能是节点间的联通不够全面.  

1) 检查 /etc/hosts
   要求本机ip 对应 服务 器名
   要求要包含所有的服务器ip + 服务器名

本人使用的是虚拟机OS为:ubuntu11.04 ,重启系统后出现该错误,最后发现ubuntu系统在每次启动时,会在/etc/hosts文件最前端添加如下信息:

127.0.0.1 localhost     your_hostname

::1            localdata1   your_hostname

若将这两条信息注销掉,(或者把your_hostname删除掉)上述错误即可解决。
2) 检查 .ssh/authorized_keys
   要求包含所有服务器(包括其自身)的public key

  尽管我们在安装hadoop之前已经配置了各节点的SSH无密码通信,假如有3IP分别为192.168.128.131  192.168.128.132  192.168.133 ,对应的主机名为master slave1 slave2 。从每个节点第一次执行命令$ ssh  主机名(master slave1 slave2) 的时候,会出现一行关于密钥的yes or no ?的提示信息,Enter确认后再次连接就正常了。如果我们没有手动做这一步,如果恰好在hadoop/conf/core-site.xml mpred-site.xml中相应的IP 用主机名代替了,则很可能出现该异常。

3. ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceID

问题的产生:

今天遇到了一个问题

我执行了 ./hadoop namenode -format 之后

启动hadoop:   ./start-all.sh   的时候

运行jps发现 datanode没有起来 但是 TaskTracker是正常启动的

然后我去datanode的错误日志里面发现的下面的问题:

2012-11-23 14:31:14,319 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties

2012-11-23 14:31:14,334 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2012-11-23 14:31:14,335 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2012-11-23 14:31:14,335 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: DataNode metrics system started
2012-11-23 14:31:14,406 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2012-11-23 14:31:14,798 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /data/hdfs/data: namenode namespaceID = 971169702; datanode namespaceID = 1507918015
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:385)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.(DataNode.java:299)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1582)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1521)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1539)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1665)

        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1682)

/data/hdfs/data

这个目录是我   hdfs-site.xml 配置文件里面 dfs.data.dir 的值:

   
                dfs.data.dir  
                /data/hdfs/data
   

解决的办法:

1.进入每个datanode dfs.data.dir current目录,修改里面的文件VERSION

#Fri Nov 23 15:00:17 CST 2012
namespaceID=246015542
storageID=DS-2085496284-192.168.1.244-50010-1353654017403
cTime=0
storageType=DATA_NODE
layoutVersion=-32

里面有个 namespaceID 将其修改成为报错信息中的

namenode namespaceID = 971169702

相同的 namespaceID  .

然后重新启动 datanode全部都能正常启动了。

2.由于是测试环境,于是产生的第一个想法是 直接删除每个datanode 上面 dfs.data.dir目录下所有的文件

rm -rf *

删除之后

重新启动 也是可以正常的启动所有的datanode

进到dfs.data.dir目录下 所有的datanode又全部重新生成了。

4. ssh中“Host key verification failed.“的解决方案

所有的节点都要配置

我们使用ssh链接linux主机时,可能出现Host key verification failed.“的提示,ssh连接不成功。
可能的提示信息如下:

网上很多的解决方案是:vi ~/.ssh/known_hosts 删除与想要连接的主机相关的行;或者直接删除known_hosts这个文件。 当然这个方案也是可行的,但并非解决问题的根本办法,因为继续使用,今后还会出现这样的情况,还得再删除。
下面简单讲一下这个问题的原理和比较长久的解决方案。
OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。
SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来配置的。默认情况下,StrictHostKeyChecking=ask。简单所下它的三种配置值:
1.StrictHostKeyChecking=no  
#最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接serverkey在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
2.StrictHostKeyChecking=ask  #默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
3.StrictHostKeyChecking=yes  #最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

对于我来说,在内网的进行的一些测试,为了方便,选择最低的安全级别。在.ssh/config(或者/etc/ssh/ssh_config)中配置

(注:这里为了简便,将knownhostfile设为/dev/null,就不保存在known_hosts中了

二. 配置hadoop

1. 分布式模式

新建用户和组

addgroup hadoop

adduser --ingroup hadoop hadoop

注销roothadoop用户登录

配置SSH

ssh-keygen -t rsa(密码为空,路径默认)

cp .ssh/id_rsa.pub .ssh/authorized_keys

准备HADOOP运行环境

wget https://archive.apache.org/dist/hadoop/core/hadoop-1.1.2/hadoop-1.1.2.tar.gz

tar -xzvf hadoop-1.1.2.tar.gz

/home/hadoop/.bashrc 中追加:

export PATH=/home/hadoop/hadoop-1.1.2/bin:$PATH

重新登录就生效

ssh localhost

which hadoop

配置HADOOP运行参数

vi conf/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_11

vi conf/core-site.xml

fs.default.name

hdfs://localhost:9000

hadoop.tmp.dir

/home/hadoop/tmp

vi conf/hdfs-site.xml

dfs.name.dir

/home/hadoop/dfs/filesystem/name

dfs.data.dir

/home/hadoop/dfs/filesystem/data

dfs.replication

1

vi conf/mapred-site.xml

mapred.job.tracker

localhost:9001

mapred.tasktracker.map.tasks.maximum

4

mapred.tasktracker.reduce.tasks.maximum

4

mapred.system.dir

/home/hadoop/mapreduce/system

mapred.local.dir

/home/hadoop/mapreduce/local

格式化名称节点并启动集群

hadoop namenode -format

启动集群并查看WEB管理界面

start-all.sh

访问 http://localhost:50030 可以查看 JobTracker 的运行状态

访问 http://localhost:50060 可以查看 TaskTracker 的运行状态

访问 http://localhost:50070 可以查看 NameNode 以及整个分布式文件系统的状态,浏览分布式文件系统中的文件以及 log

停止集群

stop-all.sh停止集群

2. 多机完全分布式模式

三台机器

namenode(NameNodeSecondaryNameNodeJobTrackerDataNodeTaskTracker)

data1(DataNodeTaskTracker)

data2(DataNodeTaskTracker)

vi /etc/hostname(分别给每一台主机指定主机名,主机名必须唯一,如三台机器的主机名分别为namenode,data1,data2

vi /etc/hosts(分别给每一台主机指定主机名到IP地址的映射)

新建用户和组

三台机器上面都要新建用户和组

addgroup hadoop

adduser --ingroup hadoop hadoop

gpasswd -a hadoop sudo

更改临时目录权限

chmod 777 /tmp

注销roothadoop用户登录

配置SSH

namenode上面执行

ssh-keygen -t rsa(密码为空,路径默认)

该命令会在用户主目录下创建 .ssh 目录,并在其中创建两个文件:id_rsa 私钥文件是基于 RSA 算法创建该私钥文件要妥善保管,不要泄漏。id_rsa.pub 公钥文件 id_rsa 文件是一对儿,该文件作为公钥文件,可以公开

把公钥追加到其他主机的authorized_keys 文件中

ssh-copy-id -i .ssh/id_rsa.pub hadoop@namenode

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data1

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data2

可以在namenode上面通过ssh无密码登陆data1data2

ssh namenode

ssh data1

ssh data2

同理在data1,data2,也执行相同的操作

准备HADOOP运行环境

wget https://archive.apache.org/dist/hadoop/core/hadoop-1.1.2/hadoop-1.1.2.tar.gz

tar -xzvf hadoop-1.1.2.tar.gz

/home/hadoop/.bashrc 中追加:

export PATH=/home/hadoop/hadoop-1.1.2/bin:$PATH

source .bashrc

ssh localhost

which hadoop

配置HADOOP运行参数

vi conf/masters

localhost替换为 namenode

vi conf/slaves

删除localhost,加入两行:

namenode

data1

data2

vi conf/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_11

vi conf/core-site.xml

fs.default.name

hdfs://namenode:9000

vi conf/hdfs-site.xml

dfs.name.dir

/home/hadoop/dfs/filesystem/name

dfs.data.dir

/home/hadoop/dfs/filesystem/data

dfs.replication

3

vi conf/mapred-site.xml

mapred.job.tracker

namenode:9001

mapred.tasktracker.map.tasks.maximum

4

mapred.tasktracker.reduce.tasks.maximum

4

mapred.system.dir

/home/hadoop/mapreduce/system

mapred.local.dir

/home/hadoop/mapreduce/local

复制HADOOP文件到其他节点

 scp -r /home/hadoop/hadoop-1.1.2 hadoop@data1:/home/hadoop/hadoop-1.1.2
 scp -r /home/hadoop/hadoop-1.1.2 hadoop@data2:/home/hadoop/hadoop-1.1.2

格式化名称节点并启动集群

hadoop namenode -format

启动集群并查看WEB管理界面

start-all.sh

访问 http://localhost:50030 可以查看 JobTracker 的运行状态

访问 http://localhost:50060 可以查看 TaskTracker 的运行状态

访问 http://localhost:50070 可以查看 NameNode 以及整个分布式文件系统的状态,浏览分布式文件系统中的文件以及 log

停止集群

stop-all.sh停止集群

a. hadoop的第一个示例 wordcount

运行步

2.1 进入bin

cd /home/hadoop/software/hadoop/hadoop-1.2.1/bin

2.2 新建输入文件内

在当前目录新建一个文件夹叫input,在文件夹里新建三个文件f1.txt,f2.txt,f3.txt,并分别写入一些内容

sudo mkdir input

sudo sh -c 'echo "hello hadoop" > input/f1.txt'

sudo sh -c 'echo "hello java" > input/f2.txt'

sudo sh -c 'echo "hello world" > input/f3.txt'

2.3 在运行的hadoop中创建文件

注意在操作之前,一定要保证这个时候hadoop已经正常运行,datanodejodtrackernamenode等必要信息均显示正常

使用如下的命令创建文件

hadoop dfs -mkdir /home/hadoop/input

/*注意相对路径,这里的/home/hadoop是我当前用户的目录,可根据自己具体情况进行改动*/

然后查看我们在hadoop中是否已经成功创建了该文件夹

hadoop dfs -ls /home/hadoop

如果我们能看到类似drwr-xr-x ....../home/hadoop/input字样那表明我们这一步已经成功了

2.4 把文件复制到hadoop

hadoop dfs -put input/* /home/hadoop/input

/*记住此时用户所在的还是之前的bin文件夹,上面一行的/*表示文件夹所有文件,并非注释*/

然后查看文件是否在hadoop中,并查看文件内容是否和输入的一致

hadoop dfs -ls /home/hadoop/input

hadoop dfs -cat /home/hadoop/input/f1.txt

注:我们可以通过10.1.151.16850070/dfshealth.jsp来从浏览器中查看整个hdfs文件系统的目录,打开namenode的链接,点击其中的Browse the filesystem超级链接,就可以看到相应的目录结构了

2.5 运行example

我们要运行的例子在hadoop的安装目录下,名称叫做hadoop-examples-1.2.1.jar。到了这一步,无疑是出错率最高的时候,运行命令如下

./hadoop jar ../hadoop-examples-1.2.1.jar wordcount /home/hadoop/input /home/hadoop/output

/*请记住上述命令中三个比较重要的参数,请务必改成自己电脑中相应的examples所在路径、inputoutput所在路径*/

其中,output是输出文件夹,必须不存在,它由程序自动创建,如果预先存在output文件夹,则会报错

在操作之前,请务必多次检查如下内容

1. 自己的input目录是否已经存入输入内容

2. output文件夹是否存在

3. 运行的hadoopjps查看一下是否所有应该运行的进程都存在

4. 如果之前开过hadoop运行,这不是第一次开的话。可以试试先./stop-all.sh,然后把core-site.xml中的hadoop.tmp.dirvalue所在路径,即/home/hadoop/tmp/hadoop_tmp删除,然后重新建立一遍,如果你是新建的hadoop用户,最好用chown指令再把文件的所属更改一下。如上一样的操作对hdfs-site.xml中的dfs.data.dirvalue路径做一遍。最好对所有datanodenamenode也做一遍,保险起见。因为,我就是这些小细节上出了问题,由于之前运行导致这些本应该空的文件夹中存在文件,而频繁报错

5. 如果之前运行过wordcount报错记住还要用命令hadoop dfs -rmr output/*output为你的输出文件夹路径*/output文件夹删除。报错内容如下

Exception inthread "main" org.apache.hadoop.mapred.FileAlreadyExistsException:Output directory output already exists atorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:134) atorg.apache.hadoop.mapred.JobClient$2.run(JobClient.java:830) atorg.apache.hadoop.mapred.JobClient$2.run(JobClient.java:791) atjava.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) atorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) atorg.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:791) atorg.apache.hadoop.mapreduce.Job.submit(Job.java:465) atorg.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:494) atorg.apache.hadoop.examples.WordCount.main(WordCount.java:67) atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:601) at org.apache.hadoop.util.RunJar.main(RunJar.java:156)

2.6 查看运行结

我们可以查看output文件夹的内容来检查程序是否成功创建文件夹,通过查看output文件里面的part-r-00000文件的内容来检查程序执行结果

./hadoop dfs -cat /home/hadoop/output/part-r-00000

正常显示结果会像如下样式一样

hadoop 1

hello 3

jave 1

world 1

我们可以看到hadoop出现一次,hello出现3次,java出现一次,world出现一次,这跟预期是一样的,说明执行成功

2.7 关闭hadoop

如果我们要关闭hadoop集群,则只需要运行stop-all.sh

cd /data/software/hadoop/hadoop-1.2.1/bin ./stop-all.sh

再次运行jps时,只有一个jps进程在运行,其它hadoop的进程都已经关闭了

错误笔

1. 启动时发现莫名其妙的datanode没有启动

logs日志中看到Incompatible namespaceIDs in /home/hadoop/tmp/hadoop_tmp,想起来这个文件夹是自己新建的,是不是伪分布式时在里面产生了垃圾?于是sudo rm -rf然后sudo mkdir重来了一次,想想不安全我再把其他的之前新建的文件夹全部重新按照这个方法操作了一次;最后-format然后./start-all.sh,搞定啦。DatanodeJobTrackerSecondaryNameNodeJpsTaskTrackerNameNode全部启动

2. 遇到sudo重定向权限不够的问题

众所周知,使用 echo 并配合命令重定向是实现向文件中写入信息的快捷方式。比如要向 test.asc 文件中随便写入点内容,可以

echo "信息" > test.asc echo "信息" >> test.asc /*以上两种写法都可以*/

下面,如果将 test.asc 权限设置为只有 root 用户才有权限进行写操作,则

sudo chown root.root test.asc

然后,我们使用 sudo 并配合 echo 命令再次向修改权限之后的 test.asc 文件中写入信息

sudo echo "又一行信息" >> test.asc -bash: test.asc: Permission denied

这时,可以看到 bash 拒绝这么做,说是权限不够。这是因为重定向符号 “>” “>>” 也是 bash 的命令。我们使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” “>>” 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像 test.asc 文件写入信息的权限

解决办法如下

sudo sh -c 'echo "又一行信息" >> test.asc' echo "第三条信息" | sudo tee -a test.asc /*以上两行任选一行即可实现*/

3. snappy native library not loaded

出现这种情况可能是你core-site.xml中文件路径写的不一致造成的,比如我的hadoop一致路径是/tmp/hadoop_tmp,但是在里面错写成了/temp,修改保存,重新格式化重启即可解决

4. org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException

报错样式类似如下

2014-02-18 23:36:22,717 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hadoop cause:java.io.IOException: File /usr/hadoop_dir/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 2014-02-18 23:36:22,718 INFO org.apache.hadoop.ipc.Server: IPC Server handler 4 on 49000, call addBlock(/usr/hadoop_dir/tmp/mapred/system/jobtracker.info, DFSClient_NONMAPREDUCE_1570390041_1, null) from 10.1.151.168:56700: error: java.io.IOException: File /usr/hadoop_dir/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1

从网上搜了一下这个问题,解决方案可以试试如下几个

mastersslaves中的主机配置为IP地址

网上也有说防火墙没有关,也请检查一下

重新格式化namenode hadoop namenode -format,并检查version文件中的ID

检查core-stite.xml mapred-site.xml 文件地址换成IP

检查相关日志,查看错误信

注意datanode目录权限一定是 755

也有可能是javabug引起

5. 其他N多错

我在运行中也出现过其他很多方面的错误,最有效且最快找到出错的方法就是查看log文件了,哪个地方没有正常开启,就去对应进程的.log文件查看。比较烦人的是.log文件内容是按照日期递增顺序进行写入内容的,意思就是你每次要查看最新的运行信息必须要往下翻翻翻。

3. Hadoop的运行时的进程解析

a. Namenode

作用:

o HDFS的守护进程

o 记录文件是如何分割成数据块的, 以及这些数据块被存储到那些节点上

o 对内存和I/O进行集中管理

o 是个单点, 发生故障时集群将崩溃

b. Secondary Namenode

作用:

o 监视HDFS状态的辅助后台进程

o 每个集群都有一个

o Namenode进行通讯,定期保存HDFS元数据快照

o Namenode发生故障时Secondary Namenode可以作为Namenode使用

c. DataNode

作用:

o 每台从服务器都运行一个

o 负责把HDFS数据块读写到本地文件系统

d. JobTracker

作用:

o 用于处理作业(用户提交代码)的后台程序

o 决定哪些文件参与处理, 然后切割task 并分配节点

o 监视task ,重启失败的task (于不同的节点)

o 每个节点只有唯一的一个JobTracker位于master节点

e. TaskTracker

作用:

o 位于slave节点上, datanode结合(代码与数据一起原则)

o 管理各自节点上的task(jobtracker分配)

o 每个节点上只有一个tasktracker, 但一个tasktracker可以启动多个jvm,用于并行执行map或者reduce任务

o jobtracker交换

4. MasterSlave

master包括 Namenode, Secendory namenode, Jobtracker

slave 包括Tasktractor, Datanode

master不是唯一的

5. Hadoop的配置文件解析

a. conf/masters

该文件中指定SecondaryNameNode所在的主机

b. conf/hdfs-site.xml, conf/mapred-site.xml , conf/core-site.xml

详见同目录下的hadoop 三个配置文件详解.docx

三. Hadoop操作示例

1. 改变负载

三台机器,改变负载

namenode(NameNodeDataNodeTaskTracker)

data1(SecondaryNameNodeDataNodeTaskTracker)

data2(JobTracker DataNodeTaskTracker)

指定SecondaryNameNodedata1

vi conf/masters指定data1

scp conf/masters data1:/home/hadoop/hadoop-1.1.2/conf/masters

scp conf/masters data2:/home/hadoop/hadoop-1.1.2/conf/masters

vi conf/hdfs-site.xml

   
     dfs.http.address
     namenode:50070
   

   

dfs.secondary.http.address

data1:50090

   

scp conf/hdfs-site.xml data1:/home/hadoop/hadoop-1.1.2/conf/hdfs-site.xml

scp conf/hdfs-site.xml data2:/home/hadoop/hadoop-1.1.2/conf/hdfs-site.xml

指定JobTrackerdata2

vi conf/mapred-site.xml

mapred.job.tracker

data2:9001

scp conf/mapred-site.xml data1:/home/hadoop/hadoop-1.1.2/conf/mapred-site.xml

scp conf/mapred-site.xml data2:/home/hadoop/hadoop-1.1.2/conf/mapred-site.xml

vi conf/core-site.xml

fs.checkpoint.dir

/home/hadoop/dfs/filesystem/namesecondary

scp conf/core-site.xml data1:/home/hadoop/hadoop-1.1.2/conf/core-site.xml

scp conf/core-site.xml data2:/home/hadoop/hadoop-1.1.2/conf/core-site.xml

配置data2

data2上的脚本start-mapred.sh会启动namenodedata1上面的TaskTracker,所以需要对data2执行:

ssh-keygen -t rsa(密码为空,路径默认)

ssh-copy-id -i .ssh/id_rsa.pub hadoop@namenode

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data1

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data2

可以在data2上面通过ssh无密码登陆namenodedata1

ssh namenode

ssh data1

ssh data2

/home/hadoop/.bashrc 中追加:

export PATH=/home/hadoop/hadoop-1.1.2/bin:$PATH

namenode: 执行start-dfs.sh

data2: 执行start-mapred.sh

2. 启用回收站

Hadoop默认情况下没有开启回收站, 这样删除的文件就不能找回, 开启回收站后,删除的文件在一定的时间内保存,超过了时间久删除.

vi conf/core-site.xml

fs.trash.interval

10080

10080是分钟数

3. SecondaryNameNode的启动与停止

ssh data1

停止secondarynamenode

hadoop-1.1.2/bin/hadoop-daemon.sh stop secondarynamenode

强制合并fsimageeidts

hadoop-1.1.2/bin/hadoop secondarynamenode -checkpoint force

启动secondarynamenode

hadoop-1.1.2/bin/hadoop-daemon.sh start secondarynamenode

4. 动态增加DataNode节点和TaskTracker节点

data3为例

data3上执行:

指定主机名

vi /etc/hostname

指定主机名到IP地址的映射

vi /etc/hosts

增加用户和组

addgroup hadoop

adduser --ingroup hadoop hadoop

更改临时目录权限

chmod 777 /tmp

namenode上执行:

vi conf/slaves

增加data3

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data3

scp -r /home/hadoop/hadoop-1.1.2 hadoop@data3:/home/hadoop/hadoop-1.1.2

host8上执行:

vi conf/slaves

增加data3

ssh-copy-id -i .ssh/id_rsa.pub hadoop@data3

data3上面执行:

hadoop-daemon.sh start datanode

hadoop-daemon.sh start tasktracker

/etc/hosts的配置文件中,localhostip地址的映射要放到ipv4的最后面

5. 限制hadoop节点连接

NameNode:

首先转到主机namenode(启动hdfs的主机)

vi conf/hdfs-site.xml

dfs.hosts

/home/hadoop/hadoop-1.1.2/conf/include

dfs.hosts.exclude

/home/hadoop/hadoop-1.1.2/conf/exclude

注意路径是绝对路径, 路径不能有多余的空格,否则系统无法定位文件

加入集群节点

vi /home/hadoop/hadoop-1.1.2/conf/include

添加

namenode

data1

data2

data3

JobTracker:

首先转到主机data2(启动mapreduce的主机)

vi conf/mapred-site.xml

mapred.hosts

/home/hadoop/hadoop-1.1.2/conf/include

mapred.hosts.exclude

/home/hadoop/hadoop-1.1.2/conf/exclude

加入集群节点

vi /home/hadoop/hadoop-1.1.2/conf/include

添加

namenode

data1

data2

data3

重启集群

6. 动态删除DataNode节点和TaskTracker节点

删除namenode

首先转到主机namenode(启动hdfs的主机)

vi conf/hdfs-site.xml

dfs.hosts.exclude

/home/hadoop/hadoop-1.1.2/conf/exclude

vi /home/hadoop/hadoop-1.1.2/conf/exclude

增加待删除的节点data3

NameNode上面执行:

hadoop dfsadmin -refreshNodes

使用hadoop dfsadmin -report可以查看状态

vi hadoop-1.1.2/conf/slaves (去掉data3

vi hadoop-1.1.2/conf/include (去掉data3

rm hadoop-1.1.2/conf/exclude

hadoop dfsadmin -refreshNodes(使include的更改生效)

exclude主要是使一个datanode节点安全退役

首先转到主机data2(启动mapreduce的主机)

删除tasktracker

vi conf/mapred-site.xml

mapred.hosts.exclude

/home/hadoop/hadoop-1.1.2/conf/exclude

vi /home/hadoop/hadoop-1.1.2/conf/exclude

增加待删除的节点data3

JobTracker上面执行:

hadoop mradmin -refreshNodes

vi hadoop-1.1.2/conf/slaves (去掉data3

vi hadoop-1.1.2/conf/include (去掉data3

rm hadoop-1.1.2/conf/exclude

hadoop mradmin -refreshNodes(使include的更改生效)

7. 运行基准测试

hadoop jar hadoop-test-1.1.2.jar

hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -write -nrFiles 12 -fileSize 1024 -resFile test

hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -read -nrFiles 12 -fileSize 1024 -resFile test

hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -clear

本文来源:https://www.2haoxitong.net/k/doc/b9c3af1827284b73f3425055.html

《hadoop笔记.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式