关于Hadoop,是目前比较热的一个话题,从事IT行业的人自然需要对它进行研究,有关Hadoop的介绍,网上都非常详细,也非常专业,关于hadoop集群的安装配置,网上也有非常多,虽然例子比较多,但是我还是一步步的进行了安装和学习,自然在安装过程中遇到了不少问题,记录下来,毕竟看别人的东西不如自己写的来的深刻,就算是对hadoop的又一次认识和以后的参考吧。
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
先说一下软件的下载地址
Hadoop:hadoop-1.2.0.tar.gz
http://www.apache.org/dyn/closer.cgi/hadoop/common/
说明:hadoop1.x版本与目前2.x版本的文件结构都不太一样,甚至有些命令都有所变化,所以在学习过程中用户看到的已经成熟的例子都是1.x版本的
比如配置文件中:
1.x:$HADOOP_HOME/conf/
2.x:$HADOOP_HOME/etc/hadoop/
1.x有master配置文件,2.x我却没有找到
所以一开始我安装的是2.x版本,在安装过程中出现很多问题,因为是初学,所以就为了先安装好在学习的原则,选择了1.x版本。
JDK:jdk-7u25-linux-x64.tar.gz
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
首先说明一下:因为我是在VM虚拟机下进行测试的,所以只需要先安装好一台机器后作为namenode,然后Clone出多台机器作为datanode即可,当然clone之后还有许多细节方面的东西,下面我都会一一说明,如果是真机安装部署,就需要特别注意,N台机器的操作系统、创建用户、密码、文件夹和文件权限等都需要保持一致,这样也很好理解,鉴于hadoop的一个namenode和N个datanode的机制,如果某个datanode宕机的话,不影响其他datanode功能,所以所有的datanode环境一致的话就不会出现那么多乱七八糟的问题。
说明,以下会说到datanode、tasktracker、master等,这里说说我的理解
HDFS角度:namenode,物理上:master,逻辑上的:jobtracker,其实这里都是一个机器,就是管理的机器
HDFS角度:datanode、物理上:slave,逻辑上的:tasktracker,其实这里指向的N个工作机器的一个,就是干活的机器
**************************分割线*****************************
-----------------------------------------------------------------------------------------------
安装环境结构如下:
从上面可以看出,我的hadoop集群是一个namenode节点,三个datanode节点。
各个机器的防火墙都需要关闭
从上面看jdk和hadoop的软件肯定不可少的,创建一个hadoop用户(/home/hadoop),将hadoop软件安装在该用户下,配置相关的环境变量。安装jdk,配置环境变量。
root用户下的环境变量
export JAVA_HOME=/home/jdk/jdk1.7.0_25
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib
hadoop用户下的环境变量
export JAVA_HOME=/home/jdk/jdk1.7.0_25
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib
#Hadoop
export HADOOP_HOME=/home/hadoop/hadoop-1.2.0
export HIVE_HOME=/home/hadoop/hive-0.11.0
export HADOOP_HOME_WARN_SUPPRESS=1
export PATH=$PATH:$HADOOP_HOME/bin:$HIVE_HOME/bin
~
关于jdk和hadoop的安装就不说了,就是一个解压缩命令
------------------------------------------------------------------
**************************分割线*****************************
-----------------------------------------------------------------------------------------------
安装完毕后,就是需要修改配置文件了
1:$HADOOP_HOME/conf/hadoop-env.sh
添加jdk的环境变量
export JAVA_HOME=/home/jdk/jdk1.7.0_25
2:$HADOOP_HOME/conf/core-site.xml
配置的是HDFS的地址和端口号
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-1.2.0/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.100.203:9000</value>
</property>
</configuration>
注意:默认是没有tmp文件夹的,需要自己创建。而且注意XML节点的开始和结束
3:$HADOOP_HOME/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
注意:配置的备份方式默认为3,replication 是数据副本数量,默认为3,datanode少于3台就会报错4:$HADOOP_HOME/conf/mapred-site.xml
配置的是JobTracker的地址和端口
说明:hadoop2.x没有mapred-site.xml只有mapred-site.xml.template,用户需要复制一份模板
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.100.203:9001</value>
</property>
</configuration>
配置参数列表
参数 | 描述 | 默认 | 配置文件 | 例子值 |
dfs.name.dir | name node的元数据,以,号隔开,hdfs会把元数据冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 | {hadoop.tmp.dir} /dfs/name | hdfs-site.xm | /hadoop/hdfs/name |
dfs.name.edits.dir | node node的事务文件存储的目录,以,号隔开,hdfs会把事务文件冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 | ${dfs.name.dir} | hdfs-site.xm | ${dfs.name.dir} |
fs.checkpoint.dir | secondary NameNode的元数据以,号隔开,hdfs会把元数据冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 | ${hadoop.tmp.dir} /dfs/namesecondary | core-site.xml | /hadoop/hdfs/namesecondary |
fs.checkpoint.edits.dir | secondary NameNode的事务文件存储的目录,以,号隔开,hdfs会把事务文件冗余复制到这些目录 | ${fs.checkpoint.dir} | core-site.xml | ${fs.checkpoint.dir} |
hadoop.tmp.dir | 临时目录,其他临时目录的父目录 | /tmp/hadoop-${user.name} | core-site.xml | /hadoop/tmp/hadoop-${user.name} |
dfs.data.dir | data node的数据目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉 | ${hadoop.tmp.dir} /dfs/data | hdfs-site.xm | /hadoop/hdfs/data1/data, /hadoop/hdfs/data2/data |
mapred.local.dir | MapReduce产生的中间数据存放目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉 | ${hadoop.tmp.dir} /mapred/local | mapred-site.xml | /hadoop/hdfs/data1/mapred/local, /hadoop/hdfs/data2/mapred/local |
mapred.system.dir | MapReduce的控制文件 | ${hadoop.tmp.dir} /mapred/system | mapred-site.xml | /hadoop/hdfs/data1/system |
5:$HADOOP_HOME/conf/masters
配置namenode机器说明:尽量使用IP,hadoop2.x没有masters文件
[hadoop@namenode conf]$ more masters
192.168.100.203
配置datanode机器,只有namenode机器才适用
[hadoop@namenode conf]$ more slaves
192.168.100.204
192.168.100.205
192.168.100.206
如果截至到现在,一台机器上的基本软件已经安装完毕了,我么可以使用scp命令将jdk、hadoop安装目录拷贝到各个datanode机器上,然后配置好相关的环境变量即可,参考第一台机器的环境变量,相关路径都要一致。参考命令:
scp -r /home/hadoop/hadoop-1.2.0 hadoop@192.168.100.204:/home/hadoop/
简单说明:scp命令是将一台机器的文件或者文件夹拷贝到另外一台机器的命令
因为拷贝的是203的hadoop-1.2.0文件夹,所以需要添加-r参数,将这个文件夹拷贝到204的hadoop用户下的/home/hadoop文件下。
其他注意的:如果四台机器都完成,需要修改每台机器的/etc/hosts,添加四台机器的IP和对应机器名
[root@namenode ~]# more /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.203 namenode.com
192.168.100.204 datanode1.com
192.168.100.205 datanode2.com
192.168.100.206 datanode3.com
------------------------------------------------------------------
**************************分割线*****************************
------------------------------------------------------------------
SSH无密码访问
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。
相关原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。
需要安装的和启动SSH协议
rpm –qa | grep openssh
rpm –qa | grep rsync
以上面为例,我们假设要进行203机器与204机器的ssh无密码访问
1:验证203本身ssh自己
a:203机器hadoop用户使用ssh-keygen -t rsa -P ''命令
执行命令后,在hadoop的根目录下/home/hadoop生成一个隐藏文件.ssh,里面有两个文件
id_rsa,id_rsa.pub
b:我们需要使用cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys,生成这个文件,其实就是使用 这个文件进行无密码的连接访问的
特别注意:/home/hadoop文件夹的权限不能是777,我试过报错,建议755
/home/hadoop/.ssh文件夹的权限是700
/home/hadoop/.ssh/authorized_keys文件的权限必须为600
c:执行完后,需要切换到root用户下,修改/etc/ssh/sshd_config文件
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
将前面的#去掉
d:重新启动ssh服务 service sshd restart
e:验证连接
[hadoop@namenode ~]$ ssh 192.168.100.203
Last login: Tue Jun 25 22:15:20 2013 from 192.168.100.111
以上因为我是在我本机putty连接虚拟机,所以会显示我本机的IP,不过这不重要,重要的是连接后不需要输入密码,如果需要输入密码,还是说明连接的有问题。
简单调试:
查看ssh 登录的详细信息:ssh -v localhost
用root查询系统登录日志:$tail /var/log/secure -n 20
参考上面步骤,再看看上面的图,基本上就很容易理解了
2:203ssh连接204
a:同样的方法,204机器首先可以ssh连接自己
b:将203生成的id_rsa.pub,拷贝到204机器上,然后使用
cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys
说明:如果做了a步骤,里面已经有一个连接204的key值了,那么使用这个又生成了一个203 连接204的key值,都放在一个文件里面是否可行,当然没有问题,因为我们使用“>>”(添 加的)
c:测试连接
3:204ssh连接203
a:将204生成的id_rsa.pub文件拷贝到203,同样的命令,生成相关key即可
然后同样的方法,达到203相互连接204、205、206机器都可以无密码访问。这个如果没有做过的一开始比较繁杂,其实过程比较简单,只要理清流程就很容易了。
------------------------------------------------------------------
**************************分割线*****************************
-----------------------------------------------------------------------------------------------
启动和验证hadoop
1:格式化HDFS文件系统:hadoop namenode -format
[hadoop@namenode ~]$ hadoop namenode -format
13/06/26 00:21:20 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = namenode.com/192.168.100.203
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.2.0
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/c ommon/branches/branch-1.2 -r 1479473; compiled by 'hortonfo' on Mon May 6 06:59:37 UTC 2013
STARTUP_MSG: java = 1.7.0_25
************************************************************/
Re-format filesystem in /home/hadoop/hadoop-1.2.0/tmp/dfs/name ? (Y or N) y
Format aborted in /home/hadoop/hadoop-1.2.0/tmp/dfs/name
13/06/26 00:21:26 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at namenode.com/192.168.100.203
************************************************************/
说明:因为我的HDFS已经格式化过,所以初次格式化的信息可能与以上不太一样
[hadoop@namenode bin]$ ./start-all.sh
starting namenode, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-namenode-namenode.com.out
192.168.100.204: starting datanode, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-datanode-datanode1.com.out
192.168.100.205: starting datanode, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-datanode-datanode2.com.out
192.168.100.206: starting datanode, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-datanode-datanode3.com.out
192.168.100.203: starting secondarynamenode, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-secondarynamenode-namenode.com.out
starting jobtracker, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-jobtracker-namenode.com.out
192.168.100.205: starting tasktracker, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-tasktracker-datanode2.com.out
192.168.100.206: starting tasktracker, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-tasktracker-datanode3.com.out
192.168.100.204: starting tasktracker, logging to /home/hadoop/hadoop-1.2.0/libexec/../logs/hadoop-hadoop-tasktracker-datanode1.com.out
Hadoop验证1:jps
在namenode执行
[hadoop@namenode ~]$ jps
5387 ResourceManager
8700 SecondaryNameNode
8921 Jps
8779 JobTracker
8539 NameNode
在datanode执行
[hadoop@namenode ~]$ ssh 192.168.100.204
Last login: Tue Jun 25 18:24:54 2013 from namenode.com
[hadoop@datanode1 ~]$
[hadoop@datanode1 ~]$ jps
5571 TaskTracker
5477 DataNode
5683 Jps
Hadoop验证2:hadoop dfsadmin -report
[hadoop@namenode ~]$ hadoop dfsadmin -report
Configured Capacity: 81075068928 (75.51 GB)
Present Capacity: 74696994816 (69.57 GB)
DFS Remaining: 74696896512 (69.57 GB)
DFS Used: 98304 (96 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)
Name: 192.168.100.206:50010
Decommission Status : Normal
Configured Capacity: 27025022976 (25.17 GB)
DFS Used: 28687 (28.01 KB)
Non DFS Used: 2105032689 (1.96 GB)
DFS Remaining: 24919961600(23.21 GB)
DFS Used%: 0%
DFS Remaining%: 92.21%
Last contact: Wed Jun 26 00:27:56 EDT 2013
Name: 192.168.100.205:50010
Decommission Status : Normal
Configured Capacity: 27025022976 (25.17 GB)
DFS Used: 40945 (39.99 KB)
Non DFS Used: 2105024527 (1.96 GB)
DFS Remaining: 24919957504(23.21 GB)
DFS Used%: 0%
DFS Remaining%: 92.21%
Last contact: Wed Jun 26 00:27:56 EDT 2013
Name: 192.168.100.204:50010
Decommission Status : Normal
Configured Capacity: 27025022976 (25.17 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 2168016896 (2.02 GB)
DFS Remaining: 24856977408(23.15 GB)
DFS Used%: 0%
DFS Remaining%: 91.98%
Last contact: Wed Jun 26 00:27:56 EDT 2013
同样,也可以使用网页的形式来查看信息
访问"http:192.168.100.203:50030"
访问"http:192.168.100.203:50070"
Hadoop默认端口和描述
端口 | 描述 |
50030 | mapred.job.tracker.http.address |
50070 | dfs.http.address NameNode administrative web GUI NAMENODE的HTTP服务器和端口 |
50010 | dfs.datanode.address |
| dfs.datanode.ipc.address |
50060 | mapred.task.tracker.http.address Per TaskTracker web interface TASKTRACKER的HTTP服务器和端口 |
| dfs.datanode.http.address Per DataNode web interface DATANODE的HTTP服务器和端口 |
50090 | dfs.secondary.http.address |
以上就是安装Hadoop的全过程,安装过程很简单,其实还没有体现多少hadoop的知识,更多的是linux的知识,但是通过安装后的分析,是一个很好的例子来为我们学习hadoop的架构、工作原理等。
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------