1、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分布式集群的主要任务。
很多朋友都好奇GOOGLE/BAIDU这类搜索引擎,是怎么实现这么高效的查询速度,用的什么数据库等等,GOOGLE当然不会把自己的核心技术全面公开,即使对它最了解的非GOOGLE人士,也只能用连蒙带猜的方式推测,因此能回答这个问题的人怕是不多的。不过我想说的是,HADOOP实现了一套类似GOOGLE的解决方案。
2、安装环境
3台机子,1台作Master,1台作Slave
系统:CentOS release 6.5
Master(NameNode)机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;2个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。其实应该还应该有1个Master机器(SecondNameNode),用来作为备用,以防止Master服务器宕机,还有一个备用马上启用。后续经验积累一定阶段后补上一台备用Master机器(可通过配置文件修改备用机器数)。
注意:由于hadoop要求所有机器上hadoop的部署目录结构要求相同(因为在启动时按与主节点相同的目录启动其它任务节点),并且都有一个相同的用户名账户。参考各种文档上说的是所有机器都建立一个hadoop用户,使用这个账户来实现无密码认证。这里在3台机子上我用相同名称的账号进行配置。
3、修改机器名(可不做)
3.1、修改3台机子的机器名,可将作为master的机器改为master,作为slave的机器改为slave1、slave2。
3.2、为了能正确解析主机名,最好也修改/etc/hosts文件里对应的主机名,讲机器名与ip相互对应
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名对应的IP地址。
我们要测试两台机器之间知否连通,一般用"ping 机器的IP",如果想用"ping 机器的主机名"发现找不见该名称的机器(这也就是为什么在修改主机名的同时最好修改该文件中对应的主机名),解决的办法就是修改"/etc/hosts"这个文件,通过把LAN内的各主机的IP地址和HostName的一一对应写入这个文件的时候,就可以解决问题。
在进行Hadoop集群配置中,需要在"/etc/hosts"文件中添加集群中所有机器的IP与主机名,这样Master与所有的Slave机器之间不仅可以通过IP进行通信,而且还可以通过主机名进行通信。所以在所有的机器上的"/etc/hosts"文件中都要添加如下内容:
10.3.1.11 Master
10.1.1.15 Slave1
10.1.1.14 Slave2
4、安装jdk。
安装完成通过java -version来查看是否安装好和版本信息,用java -verbose查看java安装路径。
注意:所有集群中的JDK版本必须相同。
5、SSH无密码验证配置
5.1、SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
5.2、Master机器配置
5.2.1、
Master节点利用ssh-keygen命令生成一个无密码密钥对。
在Master节点上执行以下命令:
ssh-keygen -t rsa
运行后询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/用户名/.ssh"目录下。
查看"/home/用户名/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。
5.2.2、接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
5.2.3、查看下authorized_keys的权限,如果权限不对则利用如下命令设置该文件的权限:
chmod 600 authorized_keys
vi ~/.bashrc
在文件底部增加:
export HADOOP_HOME=/home/zlj/hadoop-2.7.1
export PATH=${HADOOP_HOME}/bin:${PATH}
5.3、Slave机器配置
重复5.2步骤对Slave机器进行配置
5.4、 配置节点间无密码访问
5.4.1、将Slave1和Slave2两个节点的公钥信息全部输出到Master的authorized_keys文件中:
在Master机器上执行:
ssh Slave1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh Slave2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
5.4.2、将authorized_keys文件复制到其它节点,直接执行scp命令就可以
scp ~/.ssh/authorized_keys Slave1:/home/grid/.ssh/authorized_keys
scp ~/.ssh/authorized_keys Slave2:/home/grid/.ssh/authorized_keys
5.4.2、测试
用ssh Slave1或ssh Slave2进行测试,发现登录已经不需要输密码了。
6、Hadoop配置
所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。
6.1、从官网http://hadoop.apache.org下载hadoop-2.7.1.tar.gz,只在Master上解压,我的解压路径是/home/zlj/hadoop-2.7.1/
6.2、配置hadoop的基础环境变量,如JDK位置,hadoop一些配置、文件及日志的路径,这些配置都在/home/hadoop-2.7.1/etc/hadoop/hadoop-env.sh文件中,修改以下内容:
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.45.x86_64
Hadoop配置文件在hadoop-2.x/etc/hadoop/目录下,由于Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个core- site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在 HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
6.3、配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS master(即namenode)的地址和端口号。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://10.3.1.11:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/zlj/hadoop-2.7.1/tmp</value>
</property>
</configuration>
备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删掉,必须重新执行format才行,否则会出错。注意:/home/zlj/hadoop-2.7.1/tmp这个文件夹必须提前在对应目录下建好。
6.4、配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3。
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/zlj/hadoop-2.7.1/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/zlj/hadoop-2.7.1/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>10.3.1.11:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
dfs.name.dir:指定namenode存储元数据的路径
dfs.data.dir:指定datanode存储数据的路径
dfs.replication:设置副本的数量
dfs.namenode.secondary.http-address:指定SecondNameNode的地址。以前的hadoop版本有masters文件进行设定,2.x版本下直接在hdfs-site.xml下进行设置。
6.5、配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://10.3.1.11:9001</value>
</property>
</configuration>
6.6、修改slaves,指定slaves的地址。
vi /home/zlj/hadoop-2.7.1/etc/hadoop/slaves
增加如下内容:
10.3.1.15
10.3.1.14
6.7、将配置好的hadoop-2.7.1文件夹拷贝到slaves机器上,scp就好。
6.8、修改文件夹权限
chown -R zlj:zlj(用户名:用户组) hadoop-2.7.1(文件夹)
7、格式化HDFS文件系统
7.1、在Master上进行操作。(备注:只需一次,下次启动不再需要格式化,只需 start-all.sh)
hadoop-2.7.1/bin/hadoop namenode -format
7.2、启动hadoop
在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。使用下面命令启动。
hadoop-2.7.1/sbin/start-all.sh
7.3、验证hadoop
7.3.1、用"jps"命令
在Master(hadoop11)上用 java自带的小工具jps查看进程。
在Slave(hadoop12)上
8、安装中遇到的问题
8.1、先开始在.xml中指定路径用的是~/这种方式,发现SecondNameNode怎么都没有。都改为绝对路径,就好了。
8.2、端口的问题,同样的文件夹拷贝,有一个slave的dataNode一直都启动不起来,后来查看log发现是端口已经被占用了。
8.3、启动dataNode时,log报错
FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to hadoop11/10.3.1.11:9000. Exiting.
java.io.IOException: All specified directories are failed to load.
提醒两个个cid不一致,原因是Hadoop启动后,再使用格式化namenode,会导致datanode和namenode的clusterID不一致。
先找到/etc/hadoop/hdfs-site.xml,里面按照dfs.datanode.data.dir指定的路径下找/current/VERSION文件,即可修改clusterID。或者,直接删除两个current,重新格式化启动。
8.4、遇到无论什么问题,一定要先查看log,hadoop-2.7.1/logs/****.log,里面会提示错误信息。