关于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
6:$HADOOP_HOME/conf/slaves
配置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
——————————————————————**************************分割线*****************************
——————————————————————
剩下的就是将一台namenode机器与三台datanode机器进行相互的无密码访问。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已经格式化过,所以初次格式化的信息可能与以上不太一样
2:启动hadoop:start-all.sh
- [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 JobTracker administrative web GUI JOBTRACKER的HTTP服务器和端口 |
50070 | dfs.http.address
NameNode administrative web GUI NAMENODE的HTTP服务器和端口 |
50010 | dfs.datanode.address DataNode control port (each DataNode listens on this port and registers it with the NameNode on startup) DATANODE控制端口,主要用于DATANODE初始化时向NAMENODE提出注册和应答请求 |
50020 |
dfs.datanode.ipc.address DataNode IPC port, used for block transfer DATANODE的RPC服务器地址和端口 |
50060 | mapred.task.tracker.http.address
Per TaskTracker web interface TASKTRACKER的HTTP服务器和端口 |
50075 |
dfs.datanode.http.address Per DataNode web interface DATANODE的HTTP服务器和端口 |
50090 | dfs.secondary.http.address Per secondary NameNode web interface 辅助DATANODE的HTTP服务器和端口 |
以上就是安装Hadoop的全过程,安装过程很简单,其实还没有体现多少hadoop的知识,更多的是linux的知识,但是通过安装后的分析,是一个很好的例子来为我们学习hadoop的架构、工作原理等。