Hadoop集群配置(最全面总结)
通常,集群里的一台机器被指定为NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves\
官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.html)
1先决条件
确保在你集群中的每个节点上都安装了所有必需软件:sun-JDK,ssh,Hadoop
JavaTM1.5.x,必须安装,建议选择Sun公司发行的Java版本。
ssh必须安装并且保证sshd一直运行,以便用Hadoop脚本管理远端Hadoop守护进程。
2实验环境搭建
2.1准备工作
操作系统:Ubuntu
部署:Vmvare
在vmvare安装好一台Ubuntu虚拟机后,可以导出或者克隆出另外两台虚拟机。
准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
10.64.56.76node1(master)
10.64.56.77node2(slave1)
10.64.56.78node3(slave2)
主机信息:
机器名IP地址作用
Node110.64.56.76NameNode、JobTracker
Node210.64.56.77DataNode、TaskTracker
Node310.64.56.78DataNode、TaskTracker
为保证环境一致先安装好JDK和ssh:
2.2安装JDK
#安装JDK
$sudoapt-getinstallsun-java6-jdk1.2.3
这个安装,java执行文件自动添加到/usr/bin/目录。
验证shell命令:java-version看是否与你的版本号一致。
2.3下载、创建用户
在所有的机器上都建立相同的目录,也可以就建立相同的用户,以该用户的home路径来做hadoop的安装路径。例如我在所有的机器上都建立了/home/hadoop/install
$useraddhadoop
$cd/home/hadoop
2.4安装ssh和配置
1)安装:sudoapt-getinstallssh
2)配置:
在Hadoop启动以后,Namenode是通过SSH(SecureShell)来启动和停止各个datanode上的各种守护进程的,这就须要在节点之间执行指令的时候是不须要输入密码的形式,故我们须要配置SSH运用无密码公钥认证的形式。
以本文中的三台机器为例,现在node1是主节点,他须要连接node2和node3。须要确定每台机器上都安装了ssh,并且datanode机器上sshd服务已经启动。
(说明:hadoop@hadoop~]$ssh-keygen-trsa
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)
3)首先设置namenode的ssh为无需密码的、自动登录。
切换到hadoop用户
$suhadoop
cd/home/hadoop
$ssh-keygen-trsa
然后一直按回车
完成后,在home跟目录下会产生隐藏文件夹.ssh
$cd.ssh
之后ls查看文件
cpid_rsa.pubauthorized_keys
测试:
sshlocalhost发现链接成功,并且无需密码。
4)复制到node2和node3上
[[email protected]]$scpauthorized_keysnode2:/home/hadoop/.ssh/
[[email protected]]$scpauthorized_keysnode3:/home/hadoop/.ssh/
输入yes来继续。这会把该服务器添加到你的已知主机的列表中
Theauthenticityofhost‘test(192.168.9.111)’can’tbeestablished.
RSAkeyfingerprintis03:e0:30:cb:6e:13:a8:70:c9:7e:cf:ff:33:2a:67:30.
Areyousureyouwanttocontinueconnecting(yes/no)?
这里会提示输入密码,输入hadoop账号密码就可以了。
改动你的authorized_keys文件的许可权限:
[[email protected]]$chmod644authorized_keys
检查下能不能配置成功,从hadoop机器上ssh到node2和node3,如果不须要输入密码则配置成功,如果还须要请检查上面的配置能不能正确。
2.5安装Hadoop
#切换为hadoop用户
suhadoop
wgethttp://apache.mirrors.tds.net//hadoop/common/hadoop-0.20.203.0/hadoop-0.20.203.0rc1.tar.gz
下载安装包后,直接解压安装即可:
$tar-zxvfhadoop-0.20.203.0rc1.tar.gz
1)安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果我们用HADOOP_HOME指代安装的根路径,通常,集群里的所有机器的HADOOP_HOME路径相同。
2)如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-0.20.2整个文件夹拷贝到其他机器的相同位置即可。
3)可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_HOME的不同修改其hadoop-env.sh。
4)为了方便,使用hadoop命令或者start-all.sh等命令。
修改Master上/etc/profile:新增以下内容:(具体的内容根据你的安装路径修改,这步只是为了方便使用)
exportHADOOP_HOME=/home/hadoop/hadoop/install
exportPATH=$PATH:$HADOOP_HOME/bin
修改完毕后,执行source/etc/profile来使其生效。
6)配置conf/hadoop-env.sh文件
配置conf/hadoop-env.sh文件
#添加
exportJAVA_HOME=/usr/lib/jvm/java-6-sun/
这里修改为你的jdk的安装位置。
测试hadoop安装:
Bin/hadoopjarhadoop-0.20.2-examples.jarwordcountconf//tmp/out
3.集群配置(所有节点相同)
3.1配置文件:conf/core-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node1:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
1)fs.default.name是NameNode的URI。hdfs://主机名:端口/
2)hadoop.tmp.dir:Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
3.2配置文件:conf/mapred-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>node1:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>
1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
3.3配置文件:conf/hdfs-site.xml
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1,/home/hadoop/name2</value>#hadoop的name目录路径
<description></description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data1,/home/hadoop/data2</value>
<description></description>
</property>
<property>
<name>dfs.replication</name>
<!--我们的集群又两个结点,所以rep两份-->
<value>2</vaue>
</property>
</configuration>
1)dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
2)dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
3)dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
注意:此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建反而会有问题。
3.4配置masters和slaves主从结点
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
vimasters:
输入:
node1
vislaves:
输入:
node2
node3
配置结束,把配置好的hadoop文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh
$scp-r/home/hadoop/hadoop-0.20.2root@node2:/home/hadoop/
4hadoop启动
4.1格式化一个新的分布式文件系统
先格式化一个新的分布式文件系统
$cdhadoop-0.20.2
$bin/hadoopnamenode-format
成功情况下系统输出:
12/02/0600:46:50INFOnamenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG:StartingNameNode
STARTUP_MSG:host=ubuntu/127.0.1.1
STARTUP_MSG:args=[-format]
STARTUP_MSG:version=0.20.203.0
STARTUP_MSG:build=http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r1099333;compiledby'oom'onWedMay407:57:50PDT2011
************************************************************/
12/02/0600:46:50INFOnamenode.FSNamesystem:fsOwner=root,root
12/02/0600:46:50INFOnamenode.FSNamesystem:supergroup=supergroup
12/02/0600:46:50INFOnamenode.FSNamesystem:isPermissionEnabled=true
12/02/0600:46:50INFOcommon.Storage:Imagefileofsize94savedin0seconds.
12/02/0600:46:50INFOcommon.Storage:Storagedirectory/opt/hadoop/hadoopfs/name1hasbeensuccessfullyformatted.
12/02/0600:46:50INFOcommon.Storage:Imagefileofsize94savedin0seconds.
12/02/0600:46:50INFOcommon.Storage:Storagedirectory/opt/hadoop/hadoopfs/name2hasbeensuccessfullyformatted.
12/02/0600:46:50INFOnamenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG:ShuttingdownNameNodeatv-jiwan-ubuntu-0/127.0.0.1
************************************************************/
查看输出保证分布式文件系统格式化成功
执行完后可以到master机器上看到/home/hadoop//name1和/home/hadoop//name2两个目录。在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。
4.2启动所有节点
启动方式1:
$bin/start-all.sh(同时启动HDFS和Map/Reduce)
系统输出:
startingnamenode,loggingto/usr/local/hadoop/logs/hadoop-hadoop-namenode-ubuntu.out
node2:startingdatanode,loggingto/usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node3:startingdatanode,loggingto/usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node1:startingsecondarynamenode,loggingto/usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
startingjobtracker,loggingto/usr/local/hadoop/logs/hadoop-hadoop-jobtracker-ubuntu.out
node2:startingtasktracker,loggingto/usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
node3:startingtasktracker,loggingto/usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
Asyoucanseeinslave'soutputabove,itwillautomaticallyformatit'sstoragedirectory(specifiedbydfs.data.dir)ifitisnotformattedalready.Itwillalsocreatethedirectoryifitdoesnotexistyet.
执行完后可以到master(node1)和slave(node1,node2)机器上看到/home/hadoop/hadoopfs/data1和/home/hadoop/data2两个目录。
启动方式2:
启动Hadoop集群需要启动HDFS集群和Map/Reduce集群。
在分配的NameNode上,运行下面的命令启动HDFS:
$bin/start-dfs.sh(单独启动HDFS集群)
bin/start-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。
在分配的JobTracker上,运行下面的命令启动Map/Reduce:
$bin/start-mapred.sh(单独启动Map/Reduce)
bin/start-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动TaskTracker守护进程。
4.3关闭所有节点
从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。
$bin/stop-all.sh
Hadoop守护进程的日志写入到${HADOOP_LOG_DIR}目录(默认是${HADOOP_HOME}/logs).
${HADOOP_HOME}就是安装路径.
5.测试
1)浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode-http://node1:50070/
JobTracker-http://node2:50030/
3)使用netstat–nat查看端口49000和49001是否正在使用。
4)使用jps查看进程
要想检查守护进程是否正在运行,可以使用jps命令(这是用于JVM进程的ps实用程序)。这个命令列出5个守护进程及其进程标识符。
5)将输入文件拷贝到分布式文件系统:
$bin/hadoopfs-mkdirinput
$bin/hadoopfs-putconf/core-site.xmlinput
运行发行版提供的示例程序:
$bin/hadoopjarhadoop-0.20.2-examples.jargrepinputoutput'dfs[a-z.]+'
6.补充
Q:bin/hadoopjarhadoop-0.20.2-examples.jargrepinputoutput'dfs[a-z.]+'什么意思啊?
A:bin/hadoopjar(使用hadoop运行jar包)hadoop-0.20.2_examples.jar(jar包的名字)grep(要使用的类,后边的是参数)inputoutput'dfs[a-z.]+'
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。
Q:什么是grep?
A:Amap/reduceprogramthatcountsthematchesofaregexintheinput.
查看输出文件:
将输出文件从分布式文件系统拷贝到本地文件系统查看:
$bin/hadoopfs-getoutputoutput
$catoutput/*
或者
在分布式文件系统上查看输出文件:
$bin/hadoopfs-catoutput/*
统计结果:
root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2-bak/hadoop-0.20.2#bin/hadoopfs-catoutput/part-00000
3dfs.class
2dfs.period
1dfs.file
1dfs.replication
1dfs.servers
1dfsadmin
7.HDFS常用操作
hadoopdfs-ls列出HDFS下的文件
hadoopdfs-lsin列出HDFS下某个文档中的文件
hadoopdfs-puttest1.txttest上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功
hadoopdfs-getingetin从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
hadoopdfs-rmrout删除指定文件从HDFS上
hadoopdfs-catin/*查看HDFS上in目录的内容
hadoopdfsadmin-report查看HDFS的基本统计信息,结果如下
hadoopdfsadmin-safemodeleave退出安全模式
hadoopdfsadmin-safemodeenter进入安全模式
8.添加节点
可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf/master文件,加入NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新加节点主机名,再建立到新加节点无密码的SSH连接
运行启动命令:
start-all.sh
然后可以通过http://(Masternode的主机名):50070查看新添加的DataNode
9负载均衡
start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布