LinuxX64下Hadoop分布式配置和使用0319.docx
《LinuxX64下Hadoop分布式配置和使用0319.docx》由会员分享,可在线阅读,更多相关《LinuxX64下Hadoop分布式配置和使用0319.docx(41页珍藏版)》请在冰豆网上搜索。
![LinuxX64下Hadoop分布式配置和使用0319.docx](https://file1.bdocx.com/fileroot1/2023-2/23/14c963eb-1f33-4dee-ade1-9bb677e4b2b1/14c963eb-1f33-4dee-ade1-9bb677e4b2b11.gif)
LinuxX64下Hadoop分布式配置和使用0319
Hadoop0.20.2在LinuxX64下的分布式配置和使用
2013年3月
郭运凯
目录
介绍2
1集群网络环境介绍及快速部署2
2SSH无密码验证配置6
2.1配置所有节点之间SSH无密码验证6
3JDK安装和Java环境变量配置10
3.1安装JDK1.610
3.2Java环境变量配置11
4Hadoop集群配置13
5Hadoop集群启动17
6Hadoop使用22
6.1客户机与HDFS进行交互22
6.1.1客户机配置22
6.1.2列出HDFS根目录/下的文件22
6.1.3HDFS用户管理23
6.1.5复制本地数据到HDFS中23
6.1.6数据副本说明23
6.1.7hadoop-site.xml参数说明24
6.1.8HDFS中的路径25
6.1.8Hadoop相关命令25
6.2客户机提交作业到集群25
6.2.1客户机配置25
6.2.2一个测试例子WordCount26
6.2.3编写Hadoop应用程序并在集群上运行29
6.2.4三种模式下编译运行Hadoop应用程序29
6.2.5提交多个作业到集群31
附录:
Hadoop安装常见错误31
介绍
这是利用Vmware9.0(VMware-workstation-full-9.0.0-812388,已下载(注册机))在一台服务器上搭建的分布式环境,操作系统CentOS6.3X64中配置Hadoop-0.20.2时的总结文档。
Hadoop配置建议所有配置文件中使用主机名进行配置,并且机器上应在防火墙中开启相应端口,并设置SSHD服务为开机启动,此外java环境变量可以在/etc/profile中配置。
1集群网络环境介绍及快速部署
集群包含五个节点:
1个namenode,4个datanode,节点之间局域网连接,可以相互ping通。
所有节点均是Centos6.364位系统,防火墙均禁用,sshd服务均开启并设置为开机启动。
a)首先在VMware中安装好一台Centos6.3,安装时创建hadoop用户。
假设虚拟机的名字为NameNode
b)关闭虚拟机,把NameNode文件夹,拷贝4份,并命名为DataNode1,..,DataNode4
c)用VMware打开每个DateNode,设置其虚拟机的名字
d)打开操作系统,当弹出对话框时,选择“Icopyit”
e)打开每个虚拟机,查看ip地址
ifconfig
按照以上各虚拟机结果,IP地址规划如下
郭
10.88.106.187
namenode
10.88.106.188
datanode1
10.88.106.189
datanode2
10.88.106.190
datanode3
10.88.106.191
datanode4
王
192.168.1.114
namenode
192.168.1.115
datanode1
192.168.1.116
datanode2
192.168.1.117
datanode3
有时候,会使用VMware虚拟机的的克隆功能,快速的复制已安装好的系统。
可是克隆完之后,ifconfig会发现没有eth0网卡。
问题解决方法:
1、编辑/etc/udev/rules.d/70-persistent-net.rules文件
把NAME="eth0"的那行配置注释掉或者删掉,把NAME="eth1"的修改成NAME="eth0",修改后如下:
2、更改网卡配置文件,/etc/sysconfig/network-scripts/ifcfg-eth0
将HWADDR的值修改为/etc/udev/rules.d/70-persistent-net.rules文件中的新值,修改后如下:
3、修改/etc/sysconfig/network,更改主机名
4、重启系统,reboot,再次ifconfig查看网卡情况
5、同时需注意IP地址尽量设置成静态iP防止IP变动。
配置文件位于:
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.3
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
使IP地址生效:
/sbin/ifdowneth0
/sbin/ifupeth0
配置dns解析
echo"nameserver211.98.1.28">>/etc/resolv.conf
通知网关更新信息:
/etc/init.d/networkrestart
f)配置NameNode
第一步,检查机器名
#hostname
如发现不对,则修改,root用户登陆,修改命令如下
#vim/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=NameNode
依次对每个节点进行处理,修改完之后,重启系统#reboot
g)修改/etc/hosts
root用户
vim/etc/sysconfig/network
(1)namenode节点上编辑/etc/hosts文件
将所有节点的名字和IP地址写入其中,写入如下内容,注意注释掉127.0.0.1行,保证内容如下:
10.88.106.187namenode
10.88.106.188datanode1
10.88.106.189datanode2
10.88.106.190datanode3
10.88.106.191datanode4
#127.0.0.1centos63localhost.localdomainlocalhost
(2)将Namenode上的/etc/hosts文件复制到所有数据节点上,操作步骤如下:
root用户登录namenode;
执行命令:
scp/etc/hostsroot@10.88.106.188:
/etc/hosts
scp/etc/hostsroot@10.88.106.189:
/etc/hosts
scp/etc/hostsroot@10.88.106.190:
/etc/hosts
scp/etc/hostsroot@10.88.106.191:
/etc/hosts
节点分别检查cat/etc/hosts
h)规划系统目录
完整路径
说明
/usr/local/hadoop
hadoop的主目录
/home/hadoop/tmp
临时目录
/home/hadoop/hdfs/name
namenode上存储hdfs名字空间元数据
/home/hadoop/hdfs/data
datanode上数据块的物理存储位置
/home/hadoop/mapred/local
tasktracker上执行mapreduce程序时的本地目录
/home/hadoop/mapred/system
这个是hdfs中的目录,存储执行mr程序时的共享文件
至于这里为什么在/usr/local下建立,解释如下
/usr文件系统
/usr文件系统经常很大,因为所有程序安装在这里./usr里的所有文件一般来自Linuxdistribution;本地安装的程序和其他东西在/usr/local下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.
/usr/local本地安装的软件和其他文件放在这里.
小贴士:
创建目录:
mkdir(makedirectories)
功能说明:
建立目录
语 法:
mkdir[-p][--help][--version][-m<目录属性>][目录名称]
补充说明:
mkdir可建立目录并同时设置目录的权限。
参 数:
-m<目录属性>或–mode<目录属性>建立目录时同时设置目录的权限。
-p或–parents若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。
例:
mkdirtest
开始建立目录:
在NameNode下,root用户
[root@NameNode~]#mkdir-p/usr/local/hadoop/tmp
[root@NameNode~]#mkdir-p/home/hadoop/hdfs/name
[root@NameNode~]#mkdir-p/home/hadoop/hdfs/data
[root@NameNode~]#mkdir-p/home/hadoop/mapred/local
[root@NameNode~]#mkdir-p/home/hadoop/mapred/system
验证一下
可以直接进入tmp目录,不用先建立上级目录
修改目录/usr/local/hadoop的拥有者(因为该目录用于安装hadoop,用户对其必须有rwx权限。
)
chown-Rhadoop:
hadoop/usr/local/hadoop
修改前
修改后
创建完毕基础目录后,下一步就是设置SSH无密码验证,以方便hadoop对集群进行管理。
2SSH无密码验证配置
Hadoop需要使用SSH协议,namenode将使用SSH协议启动namenode和datanode进程,datanode向namenode传递心跳信息(三秒一次侦测节点是否活着)可能也是使用SSH协议,这是我认为的,还没有做深入了解,datanode之间可能也需要使用SSH协议。
假若是,则需要配置使得所有节点之间可以相互SSH无密码登陆验证。
2.1配置所有节点之间SSH无密码验证
(0)原理
节点A要实现无密码公钥认证连接到节点B上时,节点A是客户端,节点B是服务端,需要在客户端A上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到服务端B上。
当客户端A通过ssh连接服务端B时,服务端B就会生成一个随机数并用客户端A的公钥对随机数进行加密,并发送给客户端A。
客户端A收到加密数之后再用私钥进行解密,并将解密数回传给B,B确认解密数无误之后就允许A进行连接了。
这就是一个公钥认证过程,其间不需要用户手工输入密码。
重要过程是将客户端A公钥复制到B上。
因此如果要实现所有节点之间无密码公钥认证,则需要将所有节点的公钥都复制到所有节点上。
(1)所有机器上生成密码对
(a)所有节点用hadoop用户登陆,并执行以下命令,生成rsa密钥对:
ssh-keygen-trsa
这将在/home/hadoop/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。
#suhadoop
ssh-keygen-trsa
Generatingpublic/privatersakeypair.
Enterfileinwhichtosavethekey(/home/hadoop/.ssh/id_rsa):
默认路径
Enterpassphrase(emptyfornopassphrase):
回车,空密码
Entersamepassphraseagain:
Youridentificationhasbeensavedin/home/hadoop/.ssh/id_rsa.
Yourpublickeyhasbeensavedin/home/hadoop/.ssh/id_rsa.pub.
这将在/home/hadoop/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。
(b)将所有datanode节点的公钥id_rsa.pub传送到namenode上:
DataNode1上执行命令:
scp/home/hadoop/.ssh/id_rsa.pubhadoop@NameNode:
/home/hadoop/.ssh/id_rsa.pub.datanode1
......
DataNodeN上执行命令:
scp/home/hadoop/.ssh/id_rsa.pubhadoop@NameNode:
/home/hadoop/.ssh/id_rsa.pub.datanodeN
DataNode1
DataNode2
DataNode3
DataNode4
检查一下是否都已传输过来
各个数据节点的公钥已经传输过来。
(c)namenode节点上综合所有公钥(包括自身)并传送到所有节点上
[hadoop@NameNode.ssh]$catid_rsa.pub>>authorized_keys这是namenode自己的公钥
[hadoop@NameNode.ssh]$catid_rsa.pub.datanode1>>authorized_keys
[hadoop@NameNode.ssh]$catid_rsa.pub.datanode2>>authorized_keys
[hadoop@NameNode.ssh]$catid_rsa.pub.datanode3>>authorized_keys
[hadoop@NameNode.ssh]$catid_rsa.pub.datanode4>>authorized_keys
chmod644~/.ssh/authorized_keys
使用SSH协议将namenode的公钥信息authorized_keys复制到所有DataNode的.ssh目录下。
scpauthorized_keysdata节点ip地址:
/home/hadoop/.ssh
scp~/.ssh/authorized_keyshadoop@DataNode1:
/home/hadoop/.ssh/authorized_keys
scp~/.ssh/authorized_keyshadoop@DataNode2:
/home/hadoop/.ssh/authorized_keys
scp~/.ssh/authorized_keyshadoop@DataNode3:
/home/hadoop/.ssh/authorized_keys
scp~/.ssh/authorized_keyshadoop@DataNode4:
/home/hadoop/.ssh/authorized_keys
从这里就可以看到,当配置好hosts之后,就可以直接以机器名来访问各个机器,不用再记忆各个机器的具体IP地址,当集群中机器很多且IP不连续时,就发挥出威力来了。
从上图可以看到,将authorized_keys分发给各个节点之后,可以直接ssh登录,不再需要密码。
这样配置过后,namenode可以无密码登录所有datanode,可以通过命令
“sshDataNode1(2,3,4)”来验证。
配置完毕,在namenode上执行“sshNameNode,所有数据节点”命令,因为ssh执行一次之后将不会再询问。
在各个DataNode上也进行“sshNameNode,所有数据节点”命令。
至此,所有的节点都能相互访问,下一步开始配置jdk
3JDK安装和Java环境变量配置
3.1安装JDK1.6
1.下载JDK。
选定linux环境版本,下载到的文件是:
jdk-6u41-linux-x64.bin
2.Namenode节点以root用户创建JDK安装目录。
在Linux系统硬盘系统文件夹usr/local下创建一个文件夹Java。
命令:
mkdir–P/usr/local/java
3.复制JDK安装包到系统指定文件夹。
把下载的安装文件(jdk-6u41-linux-x64.bin)拷到linux路径/usr/local/java下。
4.给安装文件赋予权限。
a).进入目录,命令:
cd/usr/local/java
b).赋予权限,命令:
chmod+xjdk-6u41-linux-x64.bin
(如果因权限问题执行失败,则加上su,即suchmodu+xjdk-6u41-linux-x64.bin)
5安装JDK。
开始安装,在控制台执行命令:
./jdk-6u41-linux-x64.bin
(如果因权限问题执行失败,则加上su,即sud./jdk-6u41-linux-x64.bin)
文件会被安装到当前目录/usr/local/java/jdk1.6.0_41
删除安装文件rmjdk-6u41-linux-x64.bin
安装完成后,修改/usr/local/java目录拥有着为hadoop用户,
chown-Rhadoop:
hadoop/usr/local/java
然后将/usr/local/java目录需要复制到所有数据节点上。
scp -r /usr/local/java root@datanode1:
/usr/local/
………
3.2Java环境变量配置
root用户登陆,命令行中执行命令”vim/etc/profile”,并加入以下内容,配置环境变量(注意/etc/profile这个文件很重要,后面Hadoop的配置还会用到)。
#setjavaenvironment
#setjavaenvironment
JAVA_HOME=/usr/local/java/jdk1.6.0_41
PATH=$JAVA_HOME/bin:
$PATH
CLASSPATH=.:
$JAVA_HOME/lib/dt.jar:
$JAVA_HOME/lib/tools.jar
exportJAVA_HOMECLASSPATHPATH
保存并退出,执行以下命令使配置生效
chmod+x/etc/profile
source/etc/profile
配置完毕,在命令行中使用命令“java-version”可以判断是否成功。
在hadoop用户下测试java–version,一样成功。
a).输入命令打印三个环境变量的值:
echo$JAVA_HOME
echo$CLASSPATH
echo$PATH
b).正确的结果如下:
[root@NameNode~]#echo$JAVA_HOME
/usr/local/java/jdk1.6.0_41
[root@NameNode~]#echo$CLASSPATH
.:
/usr/local/java/jdk1.6.0_41/lib/dt.jar:
/usr/local/java/jdk1.6.0_41/lib/tools.jar
[root@NameNode~]#echo$PATH
/usr/local/java/jdk1.6.0_41/bin:
/usr/lib64/qt-3.3/bin:
/usr/local/sbin:
/usr/local/bin:
/sbin:
/bin:
/usr/sbin:
/usr/bin:
/root/bin
[root@NameNode~]#
将Namenode上的/etc/profile复制到所有数据节点上。
操作步骤如下:
root用户登录namenode;
执行命令:
scp/etc/profileroot@(datanode1):
/etc/profile
……
scp/etc/profileroot@(datanoden):
/etc/profile
并在各个节点执行source/etc/profile使其生效
4Hadoop集群配置
在namenode上执行:
Hadoop用户登录。
下载hadoop-0.20.2,将其解压到/usr/local/hadoop目录下,
解压后目录形式是/usr/local/hadoop/hadoop-0.20.2。
使用如下命令:
tarzxvfhadoop-0.20.2.tar.gz
(1)配置Hadoop的配置文件
(a)root下用户配置hadoop-env.sh
$vim/usr/local/hadoop/hadoop-0.20.2/conf/hadoop-env.sh
#setjavaenvironment
exportJAVA_HOME=/usr/local/java/jdk1.6.0_41/
exportHADOOP_HOME_WARN_SUPPRESS=1
exportHADOOP_CLASSPATH=/usr/local/hadoop/hadoop-0.20.2:
/usr/local/hadoop/hadoop-0.20.2/lib
(b)root用户配置/etc/profile
#setjavaenviroment
exportHADOOP_HOME=/usr/local/hadoop/hadoop-0.20.2
exportHADOOP_HOME_WARN_SUPPRESS=1
JAVA_HOME=/usr/local/java/jdk1.6.0_41
JRE_HOME=/usr/local/java/jdk1.6.0_41/jre
PATH=$JAVA_HOME/bin:
$JRE_HOME/bin:
$HADOOP_HOME/bin:
$PATH
CLASSPATH=.:
$JAVA_HOME/bin/dt.jar:
$JAVA_HOME/lib/tools.jar
exportJAVA_HOMECLASSPATHPATH
修改完,各个节点重启/etc/profile
[root@NameNode~]#source/etc/profile
(c)配置/usr/local/hadoop/hadoop-0.20.2/conf/hadoop-site.xml
Hadoop-0.20.2之后的版本请分别配置core-site.xml,hdfs-site.xml和mapred-site.xml三个配置文件。
配置文件名(xml)
字段名
字段值
说明
core-site
fs.default.name
hdfs:
//NameNode:
9000
hadoop.tmp.dir
/-home/hadoop/tmp
临时目录
hdfs-site
dfs.name.dir
/home/hadoop/hdfs/name
namenode上存储hdfs名字空间元数据
dfs.data.dir
home/hadoop/hdfs/data
datanode上数据块的物理存储位置
dfs.replication
3
副本个数,不配置默认是3,应小于datanode机器数量
mapred-site