概述
hadoop0.20.1安装部署
软件环境:
Linux系统: Fedora 6
hadoop版本:hadoop-0.18.3(最新版本为0.19,与之前版本相比有较大改动)
JDK版本:1.60(要求1.5以上版本)
硬件环境:
①3台机器IP配置如下:
hadoop:202.115.5.139
hadoop1:202.115.5.140
hadoop2:202.115.5.141
②修改/etc/hosts文件,以确保每台机器的主机名和IP地址之间能正确解析。
Namenode机器:需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名。Datanode机器:只需在hosts文件中加上本机IP地址和Namenode
机器的IP地址。
本例中以hadoop作为Namenode,hadoop1和hadoop2为Datanode。
hadoop中的/etc/hosts文件修改如下:
127.0.0.0 localhost localhost
202.115.5.139 hadoop hadoop
202.115.5.157 hadoop1 hadoop1
202.115.5.231 hadoop2 hadoop2
hadoop1中的/etc/hosts文件修改如下:
127.0.0.0 localhost localhost
202.115.5.139 hadoop hadoop
202.115.5.157 hadoop1 hadoop1
hadoop2中的/etc/hosts文件修改如下:
127.0.0.0 localhost localhost
202.115.5.139 hadoop hadoop
202.115.5.231 hadoop2 hadoop2
测试:3台机器互相ping主机名,看是否可以ping通。
目录结构:
Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户。
3台机器用户名均为hadoop,主目录是/home/hadoop。
Hadoop部署的目录结构如下:/home/hadoop/hadoop-0.18.3
SSH设置:
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要
输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
以本文中的三台机器为例,现在hadoop是主节点,它需要主动发起SSH连接到hadoop1和hadoop2,对于SSH服务来说,hadoop就是SSH客户端,而
hadoop1、hadoop2则是SSH服务端,因此在hadoop1,hadoop2上需要确定sshd服务已经启动。简单的说,在hadoop上需要生成一个密钥对,即一个私钥
,一个公钥。将公钥拷贝到hadoop1,hadoop2上,这样,比如当hadoop向hadoop1发起ssh连接的时候,hadoop1上就会生成一个随机数并用hadoop的公
钥对这个随机数进行加密,并发送给hadoop;hadoop收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop1,hadoop1确认解密的数
无误后就允许hadoop进行连接了。这就完成了一次公钥认证过程。
对于本文中的三台机器,首先在hadoop上生成密钥对:
代码清单1
[hadoop@hadoop:~]$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
2e:57:e2:bf:fd:d4:45:5c:a7:51:3d:f1:51:3c:69:68 hadoop@hadoop
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接
回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下。然后将id_rsa.pub的内容复制到每个机
器(也包括本机)的/home/hadoop/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的
内容,如果没有authorized_keys这个文件,直接cp或者scp就好了,下面的操作假设各个机器上都没有authorized_keys文件。
对于hadoop
[hadoop@hadoop:.ssh]$cp id_rsa.pub authorized_keys
对于hadoop1(hadoop2同hadoop1的方法)
[hadoop@hadoop1:~]$mkdir .ssh
[hadoop@hadoop:.ssh]$scp authorized_keys hadoop1:/home/hadoop/.ssh/
此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即hadoop1机器上hadoop帐户的密码,当然,你也可以用其他方法将
authorized_keys文件拷贝到其他机器上.
[hadoop@hadoop:.ssh]$chmod 644 authorized_keys
这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
[hadoop@hadoop:.ssh]ls -la
drwx------ 2 hadoop hadoop .
drwx------ 3 hadoop hadoop ..
-rw-r--r-- 1 hadoop hadoop authorized_keys
注意每个机器上的.ssh目录的ls -la都应该和上面是一样的。
接着,在三台机器上都需要对sshd服务进行配置,在三台机器上修改文件/etc/ssh/sshd_config
#去除密码认证
PasswordAuthentication no
AuthorizedKeyFile /home/hadoop/.ssh/authorized_keys
至此各个机器上的SSH配置已经完成,可以测试一下了,比如hadoop向hadoop1发起ssh连接:
[hadoop@hadoop:~]$ssh hadoop1
如果ssh配置好了,就会出现以下提示信息:
The authenticity of host [hadoop] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH告诉你它不知道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别标记”加到
“~/.ssh/know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。
然后你会发现不需要输入密码就可以建立ssh连接了。
不过,别忘了测试本机ssh hadoop
Hadoop配置文件修改
需要修改/home/hadoop/hadoop-0.18.3/conf目录下的三个配置文件:hadoop-env.sh,hadoop-site.xml和masters 、slaves文件。
1. 修改hadoop_env.sh,设置 Hadoop环境变量:
export HADOOP_HOME=/home/hadoop/hadoop-0.18.3
export JAVA_HOME=/usr/java/jdk1.6.0_10
2. 修改core-site.xml文件:
代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-0.20.1/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop-0.20.1/name</value>
<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited
list of directories then the name table is replicated in all of the directories, for redundancy. </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop-0.20.1/data</value>
<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list
of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist
are ignored.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>Default block replication. The actual number of replications can be specified when the file is created. The default
isused if replication is not specified in create time.</description>
</property>
</configuration>
3. 修改hdfs-site.xml文件:
代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>
</configuration>
4. 修改mapred-site.xml文件:
代码清单2
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and
reduce task.</description>
</property>
</configuration>
5. 设定主从节点
修改masters 文件,将其中的 localhost 改为hadoop,修改slaves 文件, 删掉其中的 localhost, 将我们的另两台机器hadoop1, hadoop2加入, 注意
每个机器一行。
6.将 Hadoop 部署到其它机器上去
代码清单3:
[hadoop@ hadoop:~]$scp -r /home/ hadoop /hadoop-0.18.3
hadoop1: /home/hadoop/hadoop-0.18.3
[hadoop@hadoop:~]$scp -r /home/ hadoop /hadoop-0.18.3
hadoop2:/home/ hadoop /hadoop-0.18.3
7.在hadoop上格式化一个新的分布式文件系统
代码清单4:
[hadoop@ hadoop:~]$cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop:hadoop-0.18.3]$bin/hadoop namenode –format
8. 在 hadoop上启动 hadoop进程
如代码清单5所示:
[hadoop@ hadoop:~]$ cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop hadoop-0.18.3]$bin/start-all.sh
启动完成之后,运行ps -ef 命令应该可以看到hadoop上启动了3 个新的 java 进程 (namenode, secondary namenode, jobtracker), 同时,我们可
以到 hadoop1, hadoop2 两台机器上用 ps –ef 查看,这两台机器上应该已经自动启动了 2 个新的 java 进程 (datanode, tasktracker).
9. 运行Hadoop程序
至此,整个 Hadoop 分布式环境已经部署完毕,并已启动相关后台进程。现在我们可以尝试运行一下下载的Hadoop Core包中的wordcount 程序,如代
码清单 6 所示:
代码清单 6
[hadoop@ hadoop:~] $ cd /home/ hadoop /hadoop-0.18.3
[hadoop@ hadoop:hadoop-0.18.3] $mkdir test-in
[hadoop@ hadoop:hadoop-0.18.3] $cd test-in
#在 test-in 目录下创建两个文本文件, WordCount 程序将统计其中各个单词出现次数
[hadoop@ hadoop test-in] $echo "hello world bye world" >file1.txt
[hadoop@ hadoop test-in] $echo "hello hadoop goodbye hadoop" >file2.txt
$ cd ..
[hadoop@ hadoop:hadoop-0.18.3] $ bin/hadoop dfs –put test-in input
# 将本地文件系统上的test-in 目录拷到 HDFS 的根目录上,目录名改为 input
[hadoop@ hadoop:hadoop-0.18.3] $ bin/hadoop jar hadoop-0.18.3-examples.jar wordcount input output
#查看执行结果:
# 将文件从 HDFS 拷到本地文件系统中再查看:
$ bin/hadoop dfs -get output output
$ cat output/*
# 也可以直接查看
$ bin/hadoop dfs -cat output/*
程序运行成功的结果如下:
09/04/13 16:13:00 INFO mapred.FileInputFormat: Total input paths to process : 2
09/04/13 16:13:00 INFO mapred.FileInputFormat: Total input paths to process : 2
09/04/13 16:13:01 INFO mapred.JobClient: Running job: job_200904131555_0003
09/04/13 16:13:02 INFO mapred.JobClient: map 0% reduce 0%
09/04/13 16:13:27 INFO mapred.JobClient: map 66% reduce 0%
09/04/13 16:13:33 INFO mapred.JobClient: map 100% reduce 0%
09/04/13 16:13:40 INFO mapred.JobClient: map 100% reduce 22%
09/04/13 16:13:45 INFO mapred.JobClient: Job complete: job_200904131555_0003
09/04/13 16:13:45 INFO mapred.JobClient: Counters: 16
09/04/13 16:13:45 INFO mapred.JobClient: File Systems
09/04/13 16:13:45 INFO mapred.JobClient: HDFS bytes read=54
09/04/13 16:13:45 INFO mapred.JobClient: HDFS bytes written=41
09/04/13 16:13:45 INFO mapred.JobClient: Local bytes read=75
09/04/13 16:13:45 INFO mapred.JobClient: Local bytes written=298
09/04/13 16:13:45 INFO mapred.JobClient: Job Counters
09/04/13 16:13:45 INFO mapred.JobClient: Launched reduce tasks=1
09/04/13 16:13:45 INFO mapred.JobClient: Launched map tasks=3
09/04/13 16:13:45 INFO mapred.JobClient: Data-local map tasks=3
09/04/13 16:13:45 INFO mapred.JobClient: Map-Reduce Framework
09/04/13 16:13:45 INFO mapred.JobClient: Reduce input groups=5
09/04/13 16:13:45 INFO mapred.JobClient: Combine output records=11
09/04/13 16:13:45 INFO mapred.JobClient: Map input records=2
09/04/13 16:13:45 INFO mapred.JobClient: Reduce output records=5
09/04/13 16:13:45 INFO mapred.JobClient: Map output bytes=82
09/04/13 16:13:45 INFO mapred.JobClient: Map input bytes=50
09/04/13 16:13:45 INFO mapred.JobClient: Combine input records=14
09/04/13 16:13:45 INFO mapred.JobClient: Map output records=8
09/04/13 16:13:45 INFO mapred.JobClient: Reduce input records=5
10. 常见问题
1。之前的分析服务器上传文件报错,通过修改conf/hadoop-env.sh下的
export HADOOP_HEAPSIZE=4000
得到解决,也就是每台节点给Hadoop守护进程的JVM是4G。
2。另外,在生产环境中,需要在conf/mapred-site.xml下加个参数
mapred.userlog.limit.kb
参数表示mapreduce日志的最大值,用kb为单位,例如设成10G的话就是10000000
如果不改的话,Hadoop累计日志量还是很惊人的,我看现在分析服务器已经有2G了,这会造成磁盘空间不够需要手动清理
3.在使用start-all.sh启动hadoop的时候,会出现如下信息:
INFO ipc.Client:Retrying connect to server : nossana01/10.87.25.111:9000. Already tried 0 time(s).
该问题是由于在start-all.sh脚本中存在如下 命令:
./bin/hadoop dfsadmin –safemode leave
将该命令注释即可。
4.当磁盘空间已满的时候,分析服务器主节点会自动停机,导致分析无法继续,重启hadoop也不起作用。
需要将主节点的name,tmp删除,子节点的date,tmp,删除,重新在主节点运行命令:bin/hadoop namenode –format
5 java.io.IOException: Could not obtain block: blk_2712839034423478795_4327 file=/user/hadoop/pagecontents/part-m-00180
at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.chooseDataNode(DFSClient.java:1787)
at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.blockSeekTo(DFSClient.java:1615)
at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.read(DFSClient.java:1742)
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readFully(Unknown Source)
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1450)
at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1428)
at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1417)
at org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1412)
at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:50)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:418)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:582)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
at org.apache.hadoop.mapred.Child.main(Child.java:170)
6 java.io.IOException: xceiverCount 257 exceeds the limit of concurrent xcievers 256
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:88)
at java.lang.Thread.run(Unknown Source)
2010-09-13 04:28:02,705 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(10.87.25.113:50010,
storageID=DS-1545289813-127.0.0.1-50010-1284281872905, infoPort=50075, ipcPort=500
20):DataXceiver
5. org.apache.hadoop.ipc.RemoteException: java.io.IOException: blk_-7921840443736065669_4455 is already commited, storedBlock ==
null.
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.nextGenerationStampForBlock(FSNamesystem.java:4676)
at org.apache.hadoop.hdfs.server.namenode.NameNode.nextGenerationStamp(NameNode.java:473)
at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
at org.apache.hadoop.ipc.Client.call(Client.java:739)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
at $Proxy4.nextGenerationStamp(Unknown Source)
at org.apache.hadoop.hdfs.server.datanode.DataNode.syncBlock(DataNode.java:1550)
at org.apache.hadoop.hdfs.server.datanode.DataNode.recoverBlock(DataNode.java:1524)
at org.apache.hadoop.hdfs.server.datanode.DataNode.recoverBlock(DataNode.java:1590)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
异常5,6都是关于Hadoop文件系统的,说明Hadoop文件操作的负载比较大,会导致datanode当掉而出各种错误
可以调整几个参数(下面的几个参数都是默认值的10倍),但需要监控内存是否够用。
在conf目录的hdfs-site.xml加几个参数:
<property>
<name>dfs.datanode.max.xcievers</name>
<value>2560</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>30</value>
<description>The number of server threads for the datanode.</description>
</property>
同时改下hdfs-site里这个参数的值,由2改成3:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
在core-site.xml加上这样一个参数:
<property>
<name>ipc.server.listen.queue.size</name>
<value>1280</value>
<description>Indicates the length of the listen queue for servers accepting
client connections.
</description>
</property>
服务器地址 NAME目录 临时目录 日志目录 节点数据目录 主节点 子节点
10.87.25.111 hadoop-0.20.1/name hadoop-0.20.1/tmp /hadoop/analyse01/logs01 /hadoop/analyse01/data01 是
是
10.87.25.112 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs02 /hadoop/analyse01/data02 否 是
10.87.25.113 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs03 /hadoop/analyse01/data03 否 是
10.87.25.114 无 hadoop-0.20.1/tmp /hadoop/analyse01/logs04 /hadoop/analyse01/data04 否 是
NAME目录配置:hadoop-0.20.1/conf/hdfs-site.xml dfs.name.dir
临时目录配置:hadoop-0.20.1/conf/core-site.xml hadoop.tmp.dir
日志目录配置:hadoop-0.20.1/conf/hadoop-env.sh export HADOOP_LOG_DIR=/hadoop/analyse01/logs01
节点数据目录配置:hadoop-0.20.1/conf/hdfs-site.xml dfs.data.dir
启动服务流程
1.使用hadoop用户登录10.87.25.111服务器;
2.进入hadoop-0.20.1目录
3.在命令行输入:./bin/start-all.sh启动hadoop服务
4.在命令行输入:nohup ./bin/hadoop jar web_analysis_hn.jar WebAnalytics & 启动网页分析服务
5.监控日志命令为:tail -2000f nohup.out 或 tail -2000f analyse.log
停止服务流程
1.使用hadoop用户登录10.87.25.111服务器;
2.进入hadoop-0.20.1目录
3.使用ps -ef|grep java 查看WebAnalytice的进程号
4.在命令行输入:kill -9 WebAnalytice进程号
5.在命令行输入:./bin/stop-all.sh
监控hadoop运行情况
访问:http://10.87.25.111:50070 可以查看hadoop启动节点的状况
访问:http://10.87.25.111:50030 可以查看hadoop中MAP数使用情况,分析任务的进行状态,运行中的任务,运行完成的任务,运行失败的任务
异常情况
如果需要在hadoop中添加或者删除子节点,首先删除主机的name,tmp,data目录,在删除分机的tmp,data目录;在/hadoop-0.20.1/conf目录中,修
改slaves文件,添加或删除一个子节点,并把改文件通过scp命令拷贝到其他机器,使所有机器的slaves文件内容保持一致,然后在命令行输入
./bin/hadoop namenode -format格式化目录
参考资料
学习
访问 Hadoop 官方网站,了解 Hadoop 及其子项目 HBase 的信息。
Hadoop wiki上, 有许多 Hadoop 的用户文档,开发文档,示例程序等。
阅读 Google Mapduce 论文: MapReduce: Simplified Data Processing on Large Clusters, 深入了解 Mapreduce 计算模型。
深入了解 Hadoop 分布式文件系统 HDFS: The Hadoop Distributed File System:Architecture and Design
深入了解 Google 文件系统 GFS: The Google File System, Hadoop HDFS 实现了与 GFS 类似的功能。
最后
以上就是重要航空为你收集整理的hadoop0.20.1安装部署的全部内容,希望文章能够帮你解决hadoop0.20.1安装部署所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复