1、hadoop简单介绍
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,能够分成两大类角色:Master和Salve。
一个HDFS集群是由一个NameNode和若干个DataNode组成的。当中NameNode作为主server。管理文件系统的命名空间和client对文件系统的訪问操作;集群中的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),用来作为备用,以防止Masterserver宕机。另一个备用立即启用。兴许经验积累一定阶段后补上一台备用Master机器(可通过配置文件改动备用机器数)。
注意:由于hadoop要求全部机器上hadoop的部署文件夹结构要求同样(由于在启动时按与主节点同样的文件夹启动其他任务节点),而且都有一个同样的username账户。
參考各种文档上说的是全部机器都建立一个hadoop用户。使用这个账户来实现无password认证。这里在3台机子上我用同样名称的账号进行配置。
3、改动机器名(可不做)
3.1、改动3台机子的机器名。可将作为master的机器改为master,作为slave的机器改为slave1、slave2。
3.2、为了能正确解析主机名,最好也改动/etc/hosts文件中相应的主机名,讲机器名与ip相互相应
"/etc/hosts"这个文件是用来配置主机将用的DNSserver信息,是记载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无password验证配置
5.1、SSH无password原理
Master(NameNode | JobTracker)作为client,要实现无password公钥认证,连接到serverSalve(DataNode | Tasktracker)上时。须要在Master上生成一个密钥对,包含一个公钥和一个私钥,而后将公钥拷贝到全部的Slave上。
当Master通过SSH连接Salve时。Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。
Master收到加密数之后再用私钥解密,并将解密数回传给Slave。Slave确认解密数无误之后就同意Master进行连接了。这就是一个公钥认证过程,其间不须要用户手工输入password。
5.2、Master机器配置
5.2.1、
Master节点利用ssh-keygen命令生成一个无password密钥对。
在Master节点上运行下面命令:
ssh-keygen -t rsa
执行后询问其保存路径时直接回车採用默认路径。
生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/username/.ssh"文件夹下。
查看"/home/username/"下是否有".ssh"目录,且".ssh"文件下是否有两个刚生产的无password密钥对。
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、 配置节点间无password訪问
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进行測试,发现登录已经不须要输password了。
6、Hadoop配置
全部的机器上都要安装hadoop,如今就先在Masterserver安装。然后其它server依照步骤反复进行就可以。
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)的地址和port号。
<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下进行设置。
注意:/home/zlj/hadoop-2.7.1/hdfs/name和/home/zlj/hadoop-2.7.1/hdfs/data这两个文件夹必须提前在相应文件夹下建好。
-
- 6.5、配置mapred-site.xml文件
改动Hadoop中MapReduce的配置文件。配置的是JobTracker的地址和port。
<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(username:用户组) 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、port的问题,相同的目录拷贝,有一个slave的dataNode一直都启动不起来。后来查看log发现是port已经被占用了,此时须要改动port。
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、想要改动hadoop各个port。启动dataNode时,log报错
java.net.BindException: Problem binding to [hadoop11:53501] java.net.BindExce 无法指定被请求的地址
原因:hdfs-site.xml中datanode.address相关项的port的写法不正确。
解决的方法:port前面的ip地址不应该写Master的地址,而应该是0.0.0.0,全部当中的datanode.address相关项都如此。
hadoop经常使用port配置可參看:http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html
8.5、遇到不管什么问题,一定要先查看log,hadoop-2.7.1/logs/****.log,里面会提示错误信息。