使用VirtualBox虚拟机搭建hadoop运行环境,
最近学了一下大数据,包括hadoop环境的搭建,搭建工具:centos6.5,hadoop2.6.4,eclipse Mars.1 Release (4.5.1),jdk1.8
第一步、网络与ip地址的设置,安装virtualbox此处省略,接下来就是安装centos6.5,具体参照这篇博客http://www.2cto.com/os/201407/318477.html,安装好之后会重启,点击输入密码进入root用户,我将root用户的密码设置为123456,比较简单,接下来要在VirtualBox界面设置虚拟机的网络连接方式,如下图:
为了确保每个虚拟机都可以使用主机的网络,还要另外设置一块网卡为NAT模式(前提必须是虚拟机是关机状态的),如下图:
设置好之外还需要设置全局连接方式:VirtualBox主界面 管理->全局设定->网络->把第一个NatWork打钩,然后再设置仅Host-Only联网方式双击VirtualBox Host-Only Ethernet Adapter ,设置成如下图:
DHCP的设置,不启用DHCP服务器,开启虚拟机进入root用户设置ip地址,
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改成如下图所示:
NETMASK:
子网掩码 用来标识这个IP地址的网段,IP地址间能不能通信主要看属不属于同一网段,用子网掩码来区分网段,子网掩码为1的部分对应IP地址不可变,为0的部分可变,不可变的为网络位,可变的为主机位
IPADDR:
ip地址必须和GATEWAY在同一网关字段,
GATEWAY:
默认网关 ,就是上一张图片里的ip 192.168.18.1地址,这里是使用了一个虚拟的网卡VirtualBox Host-Only Ethernet Adapter来实现网关
将NM_CONTROLLED=yes改为no这条指令,不改报错了,改了之后,使用命令service network restart,如果没报错,再使用ifconfig出现如下所示界面,则证明修改成功:
·
接下来可以在主机中ping 192.168.18.110,如果ping通则证明主机与虚拟机连通了, 接着可以使用第三方软件在windows环境下连接虚拟机如Xshell,或者SecureCRT.exe之类的软件在windows下操作虚拟机,其他两台虚拟机操作同上,或者利用Virtualbox的虚拟机复制功能,复制两台一样的虚拟机,只需要修改一下ip地址和mac硬件地址,我采用的是重复第一台的操作,继续搭建了第二和第三台虚拟机,
二、hadoop集群安装
将192.168.18.110设置为主节点,其他两个节点的ip分别设置为192.168.18.111,192.168.112
1.配置hosts
接下来就是添加主机IP与主机名的映射关系
[root@localhost ~]# vi /etc/hosts
前两行注释掉:
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#添加映射关系:
192.168.18.110 master
192.168.18.111 slaver1
192.168.18.112 slaver2
保存之后,将主节点的hosts分别拷贝到其他两个子节点,在主节点上执行
[root@localhost ~]# scp /etc/hosts root@192.168.18.111:/etc/
[root@localhost ~]# scp /etc/hosts root@192.168.18.112:/etc/
[root@localhost ~]# source /etc/profile 在192.168.18.110上执行
[root@localhost ~]# source /etc/profile 在192.168.18.111上执行
[root@localhost ~]# source /etc/profile 在192.168.18.112上执行
2. 配置ssh无密码访问
生成公钥密钥对
在每个节点上分别执行:
[root@master ~]# ssh-keygen -t rsa
[root@slaver1 ~]# ssh-keygen -t rsa
[root@slaver2 ~]# ssh-keygen -t rsa
一直按回车直到生成结束
执行结束之后每个节点上的/root/.ssh/目录下生成了两个文件 id_rsa 和 id_rsa.pub
其中前者为私钥,后者为公钥
在主节点上执行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cp id_rsa.pub authorized_keys
将子节点的公钥拷贝到主节点并添加进authorized_keys
将两个子节点的公钥拷贝到主节点上,分别在两个子节点上执行:
[root@slaver1 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver1.pub
[root@slaver2 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver2.pub
然后在主节点上,将拷贝过来的两个公钥合并到authorized_keys文件中去
主节点上执行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cat id_rsa_slaver1.pub>>authorized_keys
[root@master .ssh]# cat id_rsa_slaver2.pub>>authorized_keys
cat id_rsa_slaver1.pub>>authorized_keys
将主节点的authorized_keys文件分别替换子节点的authorized_keys文件
主节点上执行用scp命令将authorized_keys文件拷贝到子节点的相应位置
[root@master ~]# cd /root/.ssh
[root@master .ssh]# scp authorized_keys root@slaver1:/root/.ssh/
[root@master .ssh]# scp authorized_keys root@slaver2:/root/.ssh/
最后测试是否配置成功
在主节点上分别执行
[root@master ~]# ssh slaver1
[root@master ~]# ssh slaver2
能正确跳转到两台子节点的操作界面即可,同样在每个子节点通过相同的方式登录主节点和其他子节点也能无密码正常登录就表示配置成功。
这里的配置方式可以有多种操作步骤,最终目的是每个节点上的/root/.ssh/authorized_keys文件中都包含所有的节点生成的公钥内容。
上面配置SSH切换服务器较繁琐,稍不小心就会出错,可以用下面的
安装ssh 证书
[root@master ~]$ ssh-keygen -t rsa
[root@slaver1 ~]$ ssh-keygen -t rsa
[root@slaver2 ~]$ ssh-keygen -t rsa
[root@master ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@master ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@master ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver1 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver1 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver1 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver2 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver2 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver2 ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
3. 安装jdk
卸载jdk(三台机器上都要卸载)
查看系统已经装的jdk:
[root@master ~]# rpm -qa|grep jdk
java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
卸载jdk:
[root@master ~]# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
[root@master ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
其他两个节点操作上边相同动作
安装JDK(三台机器都要安装)
安装在同一位置/opt/java/jdk1.7.0_76
下载JDK。这里如何将jdk从windows发送至虚拟机,使用的是FileZillaClient进行连接如下图,将文件发送到/opt/java/目录下(注java是在/opt目录下新建的):
解压JDK :
[root@master ~]# mkdir -p /opt/java/
[root@master ~]# tar -zxvf /opt/java/jdk-7u76-linux-x64.tar.gz -C /opt/java/
其他两个节点操作上边相同动作
配置环境变量, 编辑profile文件:
[root@master ~]# vi /etc/profile
在profile文件末尾添加以下代码:
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
拷贝profile到子节点
主节点上执行:
[root@master ~]# scp /etc/profile root@slaver1:/etc/
[root@master ~]# scp /etc/profile root@slaver2:/etc/
重启生效:
[root@master ~]# reboot
[root@slaver1 ~]# reboot
[root@slaver2 ~]# reboot
以下只在主节点上操作
4.安装hadoop
首先将hadoop-2.6.4.tar.gz放到三台机器的/usr目录下
在master主机上安装hadoop
安装位置自定,例如安装在/usr目录下面
下载hadoop包,放在/usr目录下,解压hadoop
[root@master ~]# tar -zxvf /usr/hadoop-2.6.4.tar.gz -C /usr/
在usr下面生成hadoop-2.6.4目录
配置环境变量:
[root@master ~]# vi .bash_profile
PATH=$PATH:$HOME/bin:/usr/hadoop-2.6.4/sbin
export PATH
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
HADOOP_HOME=/usr/hadoop-2.6.4
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_HOME HADOOP_CONF_DIR PATH
[root@master ~]# source .bash_profile
5.配置hadoop
配置hadoop配置文件
需要配置的文件的位置为/hadoop-2.6.4/etc/hadoop,需要修改的有以下几个
hadoop-env.sh
yarn-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
其中
hadoop-env.sh和yarn-env.sh里面都要添加jdk的环境变量:
hadoop-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/opt/java/jdk1.7.0_76
(红色为新添加的内容,其他的代码是文件中原有的)
# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
#export JSVC_HOME=${JSVC_HOME}
yarn-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-env.sh
# User for YARN daemons
export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
# resolve links - $0 may be a softlink
export YARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
# some Java parameters
export JAVA_HOME=/opt/java/jdk1.7.0_76
(红色为新添加的内容,其他的代码是文件中原有的)
[root@master ~]# mkdir -p /usr/temp
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/data
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/namesecondary
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/name
注:下边配置参数时蓝色汉字为注释,不能拷贝进配置文件中
core-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> #相当于版本一的fs.default.name 默认端口号8020
<value>hdfs://master:9000</value>
<description>NameNode URI.</description>
</property>
<property>
<name>io.file.buffer.size</name> #流的缓冲区为128K
<value>131072</value>
<description>Size of read/write buffer used inSequenceFiles.</description>
</property>
<property>
<name>hadoop.tmp.dir</name> #HDFS与本地磁盘的临时文件路径,服务器多磁盘每个都配
<value>file:///usr/temp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
#sqoop访问Hadoop的MapReduce使用的是代理的方式,必须在Hadoop中配置所接受的proxy(代理,委托)用户和组,找到Hadoop的core-site.xml配置文件
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
#hadoop 在NameNode所在机器里运行SecondaryNameNode,http监听端口50090,在浏览器输入NameNode的地址和50090端口号,就可看到其信息
<description>The secondary namenode http server address andport.</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/name</value>
#存放 naname table 和 dfs.namenode.edits.dir,存放edit(编辑校订)文件
<description>Path on the local filesystem where the NameNodestores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name> #数据块的存放位置
<value>file:///usr/hadoop-2.6.4/dfs/data</value>
<description>Comma separated list of paths on the local filesystemof a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name> #检查点路径
<value>file:///usr/hadoop-2.6.4/dfs/namesecondary</value>
<description>Determines where on the local filesystem the DFSsecondary name node should store the temporary images to merge. If this is acomma-delimited list of directories then the image is replicated in all of thedirectories for redundancy.</description>
</property>
<property>
<name>dfs.replication</name> #副本镜像数
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
#1.配置
namenode必须将dfs.webhdfs.enabled设置为true,否则不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode来保存的。
2.使用说明
hdfs使用50070端口,访问datanode的webhdfs使用50075端口,访问文件、文件夹信息使用namenode的IP和50070端口,访问文件内容或者进行打开、上传、修改、下载等操作使用datanode的IP和50075端口,要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hefs-site.xml中的dfs.webhdfs.enabled为true
<value>true</value>
</property>
<property>
<name>dfs.permissions</name> #设置权限
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name> #Web接口访问的用户名和组的帐户设定
<value>supergroup</value>
</property>
</configuration>
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
mapred-site.xml中
<configuration>
<property>
<name>mapreduce.framework.name</name> #mapreduce框架名称
<value>yarn</value>
<description>Theruntime framework for executing MapReduce jobs. Can be one of local, classic oryarn.</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>MapReduce JobHistoryServer IPC host:port</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
<description>MapReduce JobHistoryServer Web UI host:port</description>
</property>
<property>
<name>mapred.remote.os</name>
<value>Linux</value>
</property>
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
yarn-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<description>The hostname of theRM.</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>Shuffle service that needs to be set for Map Reduceapplications.</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
slaves中
[root@master hadoop]# vi slaves
slaver1
slaver2
拷贝hadoop安装文件到子节点
主节点上执行:
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver1:/usr/
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver2:/usr/
格式化主节点的namenode
主节点上进入hadoop目录
然后执行:
[root@master ~]#
[root@master hadoop-2.6.4]# ./bin/hadoop namenode -format
新版本用下面的语句不用hadoop命令了cd /usr/hadoop-2.6.4
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]# ./bin/hdfs namenode -format
启动hadoop
主节点上在hadoop-2.6.4目录下执行:
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]#./sbin/start-all.sh
主节点上jps进程有:
[root@master hadoop-2.6.4]# jps
NameNode
SecondaryNameNode
ResourceManager
jps
每个子节点上的jps进程有:
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
Jps
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
jps
如果这样表示hadoop集群配置成功
注:xml文件中的注释必须去掉,否则会报错。