① 如何搭建hadoop集群 桥接
本文通过在vmware workstation上建立三台虚拟机来搭建hadoop集群环境,其中一台作为namenode,两台作为datanode。
一、安装vmware workstation(10.0.0)(一路下一步即可)
二、创建3个虚拟机
每个虚拟机安装Ubuntu 桌面版(我用的11.10,但是有点老了,建议用12.04或更高版本)
namenode建议多给写内存,我的是namenode 1G内存,20G硬盘,datanode 800M内存,20G硬盘(我电脑内存8G,若内存不够可以少分点,但是可能有些卡)上网上式可设置为桥接方式:直接连接物理网络。
三、安装vmware tools(便于主机和虚拟机直接可以直接拖拽,复制粘贴)
点击vmware 上 虚拟机-》安装VMware tools,自动打开一个包含vmware安装包的位置,可以拷贝到你有权限的地方,例如/usr/src下用 sudo tar zxvf 软件包名称 解压,之后进入解压后的文件夹,执行
sudo ./vmware-install.sh来安装,过程中遇见yes或no一律enter键,安装后重启生效。
四、配置共享目录(让主机和虚拟机直接方便实时共享)
对每个虚拟机,点击vmware上虚拟机-》设置-》选项,选择共享文件夹,永久共享,添加一个本机的目录所为共享目录,并为这个共享起一个名字,例如叫share。这样在虚拟机上的 /mnt/hgfs下会自动生成share文件夹保持与主机上的目录实时一致。重启生效,有时生效较慢,多重启几次就行了,不知何故。
五,安装ssh,为了一会的免密码登陆
对每台虚拟机运行:sudo apt-get install openssh-server
若不成功,你可能需要更新一下资源列表了:sudo apt-get update
六、配置ssh无密码登录,方便namenode给datanode分配任务和汇总信息
说明:以下生成的秘钥默认保存在用户名空间,所以建议三台虚拟机建立同样的用户名,例如hadoop,也可以都用root用户。
在name node,和datanode都运行:
ssh-keygen –t dsa -P '' –f ~/.ssh/id_dsa (建议手打此命令,复制有时候不行,注意都是英文字符,-P的P是大写)
下面将三台虚拟机的公钥拷贝到共享目录中并重命名以供彼此配置使用
在name node:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa0.pub
在data node 1:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa1.pub
在data node 2:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa2.pub
将共享目录中公钥分别添加到三台虚拟机的授权下,分别在name node,data node 1和data node 2执行:
cat /mnt/hgfs/share/id_dsa0.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa1.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa2.pub >> ~/.ssh/authorized_keys
测试:
ssh localhost
ssh 目标机器地址
七,安装jdk
对每个虚拟机:
下载jdk(jdk1.6.0)并解压,假定目录为/usr/src/jdk1.6.0(如果你的不是,也可以改成是,这样下面的命令直接复制就行了)
设置环境变量。
#vi /etc/profile
在最后面加入
#set java environment
export JAVA_HOME=/usr/src/jdk1.6.0
export CLASSPATH=.:$JAVA_HOME/lib.tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出。
要使JDK在所有的用户中使用,可以这样:
vi /etc/profile.d/java.sh
在新的java.sh中输入以下内容:
#set java environment
export JAVA_HOME=/usr/src/jdk1.6.0
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出,然后给java.sh分配权限:chmod 755 /etc/profile.d/java.sh
重启虚拟机
八、安装hadoop
在usr/src目录解压: tar zxvf hadoop-0.20.2.tar.gz
把hadoop的安装路径添加到/etc/profile中:
export HADOOP_HOME=/usr/src/hadoop-0.20.2
export PATH=$HADOOP_HOME/bin:$PATH
九、配置hadoop
在hadoop-0.20.1/conf目录:
(1)对3个虚拟机,在conf/hadoop-env.sh中配置java环境
vi hadoop-env.sh
在hadoop-env.sh文件中添加
export JAVA_HOME=/usr/src/jdk1.6.0
(2) 用ifconfig命令查看ip地址,假定name node内部地址为192.168.204.157,data node 1和data node 2分别为192.168.204.162,192.168.204.173
对name node配置conf/masters和conf/slaves:
masters : 192.168.204.157
slaves : 192.168.204.162
192.168.204.173
(3)对name node, data node 1和data node2,配置conf/core-site.xml, conf/hdfs-site.xml及conf/mapred-site.xml,配置文件内的IP地址均配置为name node的IP地址(比如name node IP地址为192.168.204.157。
说明:因为三台上面这三个配置一样,所以配置一份,然后复制粘贴即可。
(又说明:下面之所以上图片是因为,新浪会把字符按html重新编译,无法正常显示,无奈啊)
十、运行hadoop
先把三台虚拟机的防火墙关了: sudo ufw disable
对name node:
进入hadoop-0.20.2/bin,首先格式化文件系统: hadoop namenode –format
对data node1 和data node 2:
进入hadoop-0.20.2/bin,执行: hadoop datanode –format
对name node:,在bin目录下执行:
start-all.sh
hadoop dfsadmin –safemode leave
hadoop dfsadmin –report, 查看节点情况,看到类似界面显示available的Datanodes 。
用jps命令查看进程,NameNode上的结果为:
26745 JobTracker
29398 jps
27664 NameNode
Data Node 1 的结果:
6718 TaskTracker
6042 DataNode
6750 jps
Data Node 2 的结果:
12173 TaskTracker
10760 DataNode
12700 jps
至此,安装成功。
② 怎么搭建两个hadoop集群的测试环境
环境配置:
虚拟机:
vmware workstation 12
系统:
ubuntu 16.04 LTS(推荐使用原版,不要用kylin)
节点: 192.168.159.132 master 192.168.159.134 node1 192.168.159.137 node2
jdk-8u101-Linux-x64.gz (Java)hadoop-2.7.3.tar.gz (Hadoop 包)
安装步骤:
1、安装虚拟机系统,并进行准备工作(可安装一个然后克隆)
2.修改各个虚拟机的hostname和host
3.创建用户组和用户
4、配置虚拟机网络,使虚拟机系统之间以及和host主机之间可以通过相互ping通。
5.安装jdk和配置环境变量,检查是否配置成功
6、配置ssh,实现节点间的无密码登录 ssh node1/2指令验证时候成功
7、master配置hadoop,并将hadoop文件传输到node节点
8、配置环境变量,并启动hadoop,检查是否安装成功,执行wordcount检查是否成功。
1.安装虚拟机
在VM上安装下载好的Ubuntu的系统,具体过程自行网络。可以安装完一个以后克隆,但是本人安装过程中遇到很多问题,经常需要删除虚拟机,重新安装,而被克隆的虚拟机不能删除,所以本人就用了很长时候,一个一个安装。
一共3台虚拟机:分配情况和IP地址如下:
(注:查看ip地址的指令 ifconfig)
安装虚拟机时可以设置静态IP,因为过程中常常遇到网络连接问题,ifconfig找不到IPV4地址。当然,也可以不设,默认分配。
192.168.159.132 master 192.168.159.134 node1 192.168.159.137 node2
2.修改虚拟机的hostname和hosts文件
以master上机器为例,打开终端,执行如下的操作,把hostname修改成master,hosts修改成如下所示的样子:
#修改hostname的指令:sudo gedit /etc/hostname
#修改hosts指令:sudo gedit /etc/hosts
#将以下内容添加到hosts中192.168.159.132 master192.168.159.134 node1192.168.159.137 node2
如下图所示:
自此,hadoop集群搭建成功!
③ 如何使用vagrant在虚拟机安装hadoop集群
vagrant 是一个非常好用的工具,可以用它来在单台物理机器编程管理多个虚拟机(vms)。其支持原生VirtualBox,并同时提供了对VMware Fusion、Amazon EC2虚拟机集群的插件支持。
vagrant提供了极易使用、基于Ruby的内部DSL,允许用户使用它们的配置参数定义一个或多个虚拟机。另外,对于自动部署,vagrant支持多种机制:可以使用puppet,chef或者用于在vagrant配置文件中定义的所有虚拟机上自动安装软件程序和配置的shell脚本等。
所以,使用vagrant可以在运行着多台vm的系统上定义复杂的虚拟框架,是不是很酷?
vagrant的典型使用案例是以简单并且一致的方式构建工作或者开发环境。在Eligotech(原作者公司)公司里,开发人员正在开发一个产品,目标是让用户简单的使用Apache Hadoop、CDH(Cloudera的开源版本)。开发人员经常是为了测试需要在机器上安装hadoop环境。他们发现vagrant在这方面是一个非常便利的工具。
一个vagrant配置文件的例子,你们可以自行测试。你需要下载并安装vagrant(帮助地址http://docs.vagrantup.com/v2/installation/index.html)和virtualBox。所有东西都安装完毕后即可复制粘贴下面的文本保存为Vagrantfile,并将其放到一个目录下,比如VagrantHadoop.这个配置文件假定你机器内存至少32G,如果不适合可以自行编辑该文件。
#-*-mode:ruby-*-
#vi:setft=ruby:
$master_script=<<SCRIPT
#!/bin/bash
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
apt-getinstallcurl-y
REPOCM=${REPOCM:-cm4}
CM_REPO_HOST=${CM_REPO_HOST:-archive.cloudera.com}
CM_MAJOR_VERSION=$(echo$REPOCM|sed-e's/cm\([0-9]\).*/\1/')
CM_VERSION=$(echo$REPOCM|sed-e's/cm\([0-9][0-9]*\)/\1/')
OS_CODENAME=$(lsb_release-sc)
OS_DISTID=$(lsb_release-si|tr'[A-Z]''[a-z]')
if[$CM_MAJOR_VERSION-ge4];then
cat>/etc/apt/sources.list.d/cloudera-$REPOCM.list<<EOF
deb[arch=amd64]http://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm$OS_CODENAME-$REPOCMcontrib
deb-srchttp://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm$OS_CODENAME-$REPOCMcontrib
EOF
curl-shttp://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm/archive.key>key
apt-keyaddkey
rmkey
fi
apt-getupdate
exportDEBIAN_FRONTEND=noninteractive
apt-get-q-y--force-yesinstallOracle-j2sdk1.6cloudera-manager-server-dbcloudera-manager-servercloudera-manager-daemons
servicecloudera-scm-server-dbinitdb
servicecloudera-scm-server-dbstart
servicecloudera-scm-serverstart
SCRIPT
$slave_script=<<SCRIPT
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
SCRIPT
$client_script=<<SCRIPT
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
SCRIPT
Vagrant.configure("2")do|config|
config.vm.define:masterdo|master|
master.vm.box="precise64"
master.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="4096"
end
master.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node1"
v.customize["modifyvm",:id,"--memory","4096"]
end
master.vm.network:private_network,ip:"10.211.55.100"
master.vm.hostname="vm-cluster-node1"
master.vm.provision:shell,:inline=>$master_script
end
config.vm.define:slave1do|slave1|
slave1.vm.box="precise64"
slave1.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave1.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node2"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave1.vm.network:private_network,ip:"10.211.55.101"
slave1.vm.hostname="vm-cluster-node2"
slave1.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave2do|slave2|
slave2.vm.box="precise64"
slave2.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave2.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node3"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave2.vm.network:private_network,ip:"10.211.55.102"
slave2.vm.hostname="vm-cluster-node3"
slave2.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave3do|slave3|
slave3.vm.box="precise64"
slave3.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave3.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node4"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave3.vm.network:private_network,ip:"10.211.55.103"
slave3.vm.hostname="vm-cluster-node4"
slave3.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave4do|slave4|
slave4.vm.box="precise64"
slave4.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave4.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node5"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave4.vm.network:private_network,ip:"10.211.55.104"
slave4.vm.hostname="vm-cluster-node5"
slave4.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:clientdo|client|
client.vm.box="precise64"
client.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="4096"
end
client.vm.provider:virtualboxdo|v|
v.name="vm-cluster-client"
v.customize["modifyvm",:id,"--memory","4096"]
end
client.vm.network:private_network,ip:"10.211.55.105"
client.vm.hostname="vm-cluster-client"
client.vm.provision:shell,:inline=>$client_script
end
end