hadoop-1.1.2集群搭建
Hadoop安装分为三种不同模式:
本地模式:hadoop在运行时,不使用hdfs,而是使用linux操作系统的文件系统.(默认hadoop就是本地模式)
伪分布模式:在一个节点上运行hadoop(指的是hadoop的各个进程都是在我们的一个节点上都是开启的).hadoop的"运行机制"和集群模式相似,
集群模式:在生产中真正使用的,hadoop的各个进程运行在集群的很多节点上
集群开发环境部署:
因为是在笔记本上做的实验,所以这里我选择三台机器安装,下面是各个节点的分配:
172.16.1.181 hadoop1 NameNode,JobTracker,TaskTracker,DataNode 172.16.1.182 hadoop2 SecondaryNameNode,TaskTracker,DataNode 172.16.1.183 hadoop3 TaskTracker,DataNode
NameNode和JobTracker在生产中各自是一台机器,因为NameNode在运行时时需要消耗大量内存的,JobTracker接收用户的请求,对用户cpu要求稍微高一点,作为和我们用户直接做接口的这种进程,最好独立,保证资源的充分.
使用阿里云和使用自己的机器的区别:最大的好处就是方便,我们不需要去维护这个集群,初期投资成本比较低
机器采购硬件配置:cpu:2G的主频,内存越大越好,最小是32G或者是64G的,生产环境中32G或者是64G只能做一个节点来用.硬盘一般尽量去选择1T的多块硬盘
准备软件:
虚拟机VMware,Linux Centos6.5,jdk-7u45-linux-x64.tar.gz,hadoop-1.1.2.tar.gz
配置静态ip地址:
内网ip:我们的各个节点通过一台交换机或者一个路由在一起的.
外网:虽然两台机器是在一起的,但是他们走的外网网络的话,它是从你的内网走出去到了外网,在进入到你的内网,再到另一台机器.
外网配置后特别慢,内网相对比较快.
DHCP动态的不利于我们去指定一个节点,静态管理还是比较方便的.
(1)使用vi编辑文件vi /etc/sysconfig/network-scripts/ifcfg-Wired connectioin 1(不同的机器ifcfg-*文件名可能会不同)
BOOTPROTO=static 默认none,动态ip static表示静态ip IPADDR=172.16.1.181 指的是ip到底是什么 NETMASK=255.255.255.0 掩码 GATEWAY=172.16.1.1 网关,局域网中做交换机的那个,一般交换机扮演网关角色 DNS1=172.16.1.1 DNS的配置 保存退出
(2)执行service network restart重启网卡设置
(3)执行命令ifconfig查看配置结果是否正确
设置hostname:
主机名:ip的一个代称,在当前网络环境中是有效的
(1)使用vi编辑/etc/sysconfig/network
把HOSTNAME的值改为hadoop1,保存退出.(重启之后永久生效)
(2)执行hostname hadoop1,在当前环境中立即生效
(3)执行命令hostname查看设置结果
绑定ip与hostname
编辑文件/etc/hosts,增加ip与主机名的映射信息
172.16.1.181 hadoop1 172.16.1.182 hadoop2 172.16.1.183 hadoop3
关闭防火墙:
用来拦截外部请求的,对于某个ip来访问某个端口等待,防火墙都会做拦截,关闭防火墙的目的,就是为了让我们的程序能够更容易的安装,部署.
工作中hadoop集群内网的防火墙也是可以关闭的.内部的Hadoop集群不对外进行通信
(1)执行命令service iptables stop关闭防火墙
(2)执行命令service iptables status查看防火墙是否正在运行.
关闭防火墙的自动运行:
执行命令chkconfig iptables off
部署SSH(secure shell)免密码登陆:
hadoop主节点启动的时候,会在我们的从节点启动进程,通过ssh 登陆之后,在他上面执行脚本之后登陆的
ssh是一个加密的通信方式,这种加密是非对称加密,指的是我们有公钥和密钥这两个东西
(1)执行命令 ssh-keygen -t rsa 产生公钥私钥文件,产生的文件位于~/.ssh目录下
(2)执行命令ssh-copy-id -i hadoop2复制公钥文件到对方hadoop2中authorized_keys中去了.
(3)ssh hadoop2,就可以实现真正的密码登录了
只需要实现主节点到从节点的免密码登陆即可,不必要实现从节点到从节点的免密码登录.(因为我们的hadoop是主节点(hadoop1)去
启动或关闭从节点(hadoop3,hadoop4,hadoop5)的进程,去调用脚本,我们的从节点不会调用主节点的脚本,所以ssh只需要主到从)
安装jdk
将文件jdk-7u45-linux-x64.tar.gz上传到hadoop1上
(1)cd /usr/locall
(2)执行命令chmod u+x jdk-6u24-linux-i586.bin对文件赋执行权限
(3)执行命令tar-zxvf jdk-7u45-linux-x64.tar.gz解压缩
(4)mv jdk1.7.0_45 jdk
(5)vi /etc/profile 增加如下内容:
export JAVA_HOME=/usr/local/jdl
export PATH=.:$JAVA_HOME/bin:$PATH
(6) source /etc/profile
以上步骤分别在hadoop2,hadoop3节点上执行配置.
部署hadoop:
(1)在hadoop1上执行命令 /mnt/software/hadoop-1.1.2.tar.gz ~ 复制hadoop压缩包到home目录.
(2)在hadoop1上执行命令tar -zxvf ~/hadoop-1.1.2.tar.gz 进行解压缩
mv hadoop-1.1.2 hadoop
(3)在hadoop1上执行命令vi /etc/profile 设置环境变量,增加了内容如下:
export HADOOP_HOME_WARN_SUPPRESS=1 export HADOOP_HOME=/usr/local/hadoop export PATH=.:$HADOOP_HOME/bin:$PATH 保存退出 执行source /etc/profile
为了防止在启动的过程程序抛警告"Warning: $HADOOP_HOME is deprecated",加入如下代码:
export HADOOP_HOME_WARN_SUPPRESS=1
(4)编辑配置文件
<1>conf/hadoop-env.sh
修改第9行内容 export JAVA_HOME=/usr/local/jdk
<2>conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
<3>conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>0.0.0.0:0</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:0</value>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:0</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:0</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
<4>conf/mapred-site.xml
<configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://hadoop1:8000</value> </property> <property> <name>mapred.job.tracker.http.address</name> <value>0.0.0.0:50030</value> </property> <property> <name>mapred.task.tracker.http.address</name> <value>0.0.0.0:0</value> </property> </configuration>
<5>修改masters文件(保存SecondaryNameNode)
hadoop2
<6>修改slaves文件(指定从节点的位置)
hadoop3
hadoop4
hadoop5
(5)在hadoop1上将配置好的/usr/local/hadoop分别复制到其他节点
scp -r hadoop* hadoop2:/usr/local/ scp -r hadoop* hadoop3:/usr/local/
scp /etc/profile hadoop2:/etc/
scp /etc/profile hadoop3:/etc/
分别在hadoop2,hadoop3上执行source /etc/profile
(6)在hadoop1节点执行hadoop namenode -format 进行格式化
(7)在hadoop1节点上执行命令start-all.sh 启动集群
(8)检查是否启动成功:执行jps命令 浏览器访问hadoop1:50070(hdfs) hadoop1:50030(jobtracker)
hadoop/logs 中查看启动日志 .out是临时文件
查看端口:netstat -ant | grep 9000
查看对应的进程号:ps -ef | grep 9000
杀死进程 kill -9 9000
关闭集群的方式:stop-all.sh
以上的配置将NameNode和JobTracker都部署在一台机器上了,但是我们在生产中是分别将NameNode和JobTracker分别部署在不同的机器上的,所以我们做如下修改:
我们假设NameNode在hadoop1上,JobTracker在hadoop2上
(1)NameNode所在节点是通过core-site.xml中的fs.default.name的值体现出来的.
这里不需要修改,还是hdfs://hadoop1:9000
(2)JobTracker所在节点是通过mapred-site.xml的mapred.job.tracker的值体现的
将值修改为hdfs://hadoop2:8000
(3)重新启动集群:
启动时不要使用start-all.sh,而应该使用hadoop-daemon.sh start ***命令启动:
在hadoop1上执行命令hadoop-daemon.sh start namenode
在hadoop2上执行命令hadoop-daemon.sh start jobtracker
在hadoop2上执行命令hadoop-daemon.sh start secondarynamenode
在hadoop1上执行命令hadoop-daemons.sh start datanode
在hadoop1上执行命令hadoop-daemons.sh start tasktracker
关闭集群:
按照启动相反的操作,将start改为stop即可.