ubuntu hadoop 集群配置了集群,但启动仍然是伪分布式下的启动状态

后使用快捷导航没有帐号?
查看: 709|回复: 6
Linux下Hadoop分布式配置和使用 转载
金牌会员, 积分 1254, 距离下一级还需 1746 积分
论坛徽章:10
Linux下Hadoop分布式配置和使用&&2012年9月 目& &录 介绍& && & 这是本人在完全分布式环境下在Cent-OS中配置Hadoop-0.19.1时的总结文档,但该文档也适合其他版本的Linux系统和目前各版本的Hadoop(Hadoop-0.20之后的版本配置文件hadoop-site.xml被拆分成了三个core-site.xml,hdfs-site.xml和mapred-site.xml,这里会说明0.20后的版本中如何配置这三个文件)。& && & Hadoop配置建议所有配置文件中使用主机名进行配置,并且机器上应在防火墙中开启相应端口,并设置SSHD服务为开机启动,此外java环境变量可以在/etc/profile中配置。<font color="# 集群网络环境介绍& & 集群包含三个节点:1个namenode,2个datanode,节点之间局域网连接,可以相互ping通。节点IP地址和主机名分布如下:<font color="#.10.97.132&&gc03vm12&&(namenode))<font color="#.10.97.142&&gc04vm12&&(datanode01)<font color="#.10.97.144&&gc04vm14&&(datanode02) 可以相互ping通。节点IP地址和主机名分布如下:<font color="#.10.97.132&&rf12namenode&&(namenode))<font color="#.10.97.142&&gc04vm12&&(datanode01)<font color="#.10.97.144&&gc04vm14&&(datanode02)
所有节点均是Cent-OS系统,防火墙均禁用,sshd服务均开启并设置为开机启动。所有节点上均创建了一个hadoop用户,用户主目录是/home/hadoop。& & 所有节点上均创建了一个目录/usr/local/hadoop,并且拥有者是hadoop用户。因为该目录用于安装hadoop,用户对其必须有rwx权限。(一般做法是root用户在/usr/local下创建hadoop目录,并修改该目录拥有者为hadoop(chown –R hadoop:hadoop&&/usr/local/hadoop)。<font color="# /etc/hosts文件配置& & (1)namenode节点上编辑/etc/hosts文件将所有节点的名字和IP地址写入其中,写入如下内容,注意注释掉127.0.0.1行,保证内容如下:<font color="#.10.97.132&&gc03vm12&&<font color="#.10.97.142&&gc04vm12&&<font color="#.10.97.144&&gc04vm14&&# 127.0.0.1& &&&centos54 localhost.localdomain localhost(2)将Namenode上的/etc/hosts文件复制到所有数据节点上,操作步骤如下:& & root用户登录namenode;执行命令:scp /etc/hosts (10.10.97.144,datanode ip):/etc/hosts<font color="# SSH无密码验证配置& & Hadoop需要使用SSH协议,namenode将使用SSH协议启动namenode和datanode进程,datanode向namenode传递心跳信息可能也是使用SSH协议,这是我认为的,还没有做深入了解,datanode之间可能也需要使用SSH协议。假若是,则需要配置使得所有节点之间可以相互SSH无密码登陆验证。下面给出了两种配置方式,用户可以选择第一种,若实验中出现问题可选择第二种进行尝试。<font color="#.1 选择一:配置Namenode无密码登录所有Datanode(0)原理Namenode作为客户端,要实现无密码公钥认证,连接到服务端datanode上时,需要在namenode上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到datanode上。当namenode通过ssh连接datanode时,datanode就会生成一个随机数并用namenode的公钥对随机数进行加密,并发送给namenode。namenode收到加密数之后再用私钥进行解密,并将解密数回传给datanode,datanode确认解密数无误之后就允许namenode进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端namenode公钥复制到datanode上。所有机器上生成密码对,所有节点上执行以下命令:ssh-keygen -t rsa Generating public/private rsa key pair.Enter file in which to save the key (/home/ hadoop /.ssh/id_rsa):&&默认路径Enter passphrase (empty for no passphrase):&&回车,空密码Enter same passphrase again: Your identification has been saved in /home/ hadoop /.ssh/id_rsa.Your public key has been saved in /home/ hadoop /.ssh/id_rsa.pub.这将在/home/hadoop/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。在namenode节点上做如下配置cp id_rsa.pub authorized_keys& &namenode的公钥使用SSH协议将namenode的公钥信息authorized_keys复制到所有DataNode的.ssh目录下。scp authorized_keys data节点ip地址:/home/hadoop/.ssh&&& & 这样配置过后,namenode可以无密码登录所有datanode,可以通过命令“ssh 节点ip地址”来验证。& & 配置完毕,在namenode上执行“ssh 本机,所有数据节点”命令,因为ssh执行一次之后将不会再询问。<font color="#.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 -t rsa 这将在/home/hadoop/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。(b)将所有datanode节点的公钥id_rsa.pub传送到namenode上:cp&&id_rsa.pub datanode01.id_rsa.pubscp datanode01.id_rsa.pub namenode节点ip地址:/home/hadoop/.ssh&&......cp&&id_rsa.pub datanoden.id_rsa.pubscp datanoden.id_rsa.pub namenode节点ip地址:/home/hadoop/.ssh&&(c)namenode节点上综合所有公钥(包括自身)并传送到所有节点上cp id_rsa.pub authorized_keys& &这是namenode自己的公钥cat datanode01.id_rsa.pub && authorized_keys......cat datanode0n.id_rsa.pub && authorized_keys& & 然后使用SSH协议将所有公钥信息authorized_keys复制到所有DataNode的.ssh目录下scp authorized_keys data节点ip地址:/home/hadoop/.ssh&&& & 这样配置过后,所有节点之间可以相互SSH无密码登陆,可以通过命令“ssh 节点ip地址”来验证。配置完毕,在namenode上执行“ssh 本机,所有数据节点”命令,因为ssh执行一次之后将不会再询问。<font color="# JDK安装和Java环境变量配置<font color="#.1 安装 JDK 1.6<font color="#.下载JDK。 选定linux环境版本,下载到的文件是:jdk-6u21-linux-i586.bin <font color="#.创建JDK安装目录。 在Linux系统硬盘系统文件夹usr下创建一个文件夹Java。 命令:mkdir java <font color="#.复制JDK安装包到系统指定文件夹。 把下载的安装文件(jdk-6u21-linux-i586.bin)拷到linux路径/usr/java下。
<font color="#.给安装文件赋予权限。 a).进入目录,命令:cd /usr/java b).赋予权限,命令:chmod +x jdk-6u21-linux-i586.bin (如果因权限问题执行失败,则加上su, 即su chmod u+x jdk-6u21-linux-i586.bin)
<font color="#安装JDK。 开始安装,在控制台执行命令: ./ jdk-6u21-linux-i586.bin (如果因权限问题执行失败,则加上su , 即sud./ jdk-6u21-lnux-i586.bin)
文件会被安装到当前目录 /usr/java/jdk1.6.0_21删除安装文件rm jdk-6u21-linux-i586.bin
& & 安装完成后,修改/usr/java目录拥有着为hadoop用户,& & Chown -R hadoop:hadoop /usr/java/usr/java目录需要复制到所有数据节点上。<font color="#.2 Java环境变量配置& && & root用户登陆,命令行中执行命令”vim /etc/profile”,并加入以下内容,配置环境变量(注意/etc/profile这个文件很重要,后面Hadoop的配置还会用到)。# set java environment#set java environment JAVA_HOME=/usr/java/jdk1.6.0_21 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME CLASSPATH PATH保存并退出,执行以下命令使配置生效chmod +x&&/etc/profilesource&&/etc/profile& & 配置完毕,在命令行中使用命令”java -version”可以判断是否成功。在hadoop用户下测试java –version,一样成功。a).输入命令打印三个环境变量的值: echo $JAVA_HOME echo $CLASSPATH echo $PATH
b).正确的结果分别是: /usr/java/jdk1.6.0_21.:/usr/java/jdk1.6.0_21/lib/dt.jar:/usr/java/jdk1.6.0_21/lib/tools.jar /usr/java/jdk1.6.0_21/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
& & 将Namenode上的/etc/profile复制到所有数据节点上。操作步骤如下:& & root用户登录namenode;执行命令:scp /etc/profile root@(datanode ip):/etc/profile<font color="# Hadoop集群配置& &在namenode上执行:& & Hadoop用户登录。下载hadoop-0.20.2,将其解压到/usr/local/hadoop目录下,解压后目录形式是/usr/local/hadoop/ hadoop-0.20.2。使用如下命令:& & tar zxvf hadoop-0.20.2.tar.gz& & (1)配置Hadoop的配置文件& & (a)配置hadoop-env.sh $ vim /usr/local/hadoop/hadoop-0.20.2/conf/hadoop-env.sh# set java environmentexport JAVA_HOME=/usr/java/jdk1.6.0_21/(b)配置conf/hadoop-site.xmlHadoop-0.20之后的版本请分别配置core-site.xml,hdfs-site.xml和mapred-site.xml三个配置文件。&?xml version=&1.0&?&&?xml-stylesheet type=&text/xsl& href=&configuration.xsl&?&&!-- Put site-specific property overrides in this file. --& &configuration& &!—core-site.xml--&&property&& & &name&fs.default.name&/name&& & &value&hdfs://gc03vm12:9000&/value&& & &description&HDFS的URI,文件系统://namenode标识:端口号&/description&&/property& &property&& & &name&hadoop.tmp.dir&/name&& & &value&/usr/local/hadoop/hadooptmp&/value&&&& & &description&namenode上本地的hadoop临时文件夹&/description&&/property& &!—hdfs-site.xml--&&property& & & &name&dfs.name.dir&/name& & & &value&/usr/local/hadoop/hdfs/name&/value& & & &description&namenode上存储hdfs名字空间元数据 &/description& &/property&
&property& & & &name&dfs.data.dir&/name& & & &value&/usr/local/hadoop/hdfs/data&/value& & & &description&datanode上数据块的物理存储位置&/description& &/property&
&property&& & &name&dfs.replication&/name&&&& & &value&2&/value&& & &description&副本个数,不配置默认是3,应小于datanode机器数量&/description&&/property& &!—mapred-site.xml--&&property&& & &name&mapred.job.tracker&/name&& & &value&gc03vm12:9001&/value&& & &description&jobtracker标识:端口号,不是URI&/description&&/property& &property& & & &name&mapred.local.dir&/name& & & &value&/usr/local/hadoop/mapred/local&/value& & & &description&tasktracker上执行mapreduce程序时的本地目录&/description& &/property&
&property& & & &name&mapred.system.dir&/name& & & &value&/tmp/hadoop/mapred/system&/value& & & &description&这个是hdfs中的目录,存储执行mr程序时的共享文件&/description& &/property&
&/configuration&(c)配置masters文件,加入namenode的主机名gc03vm12&&(d)配置slaves文件, 加入所有datanode的主机名gc04vm12gc04vm14& & (2)复制配置好的各文件到所有数据节点上。& & root用户下:scp /etc/hosts& & 数据节点ip地址:/etc/hostsscp /etc/profile&&数据节点ip地址:/etc/profilescp /usr/java -r&&数据节点ip地址:/usr/java hadoop用户下:(数据节点root用户mkdir /usr/local/hadoopchown -R hadoop:hadoop /usr/local/hadoop不然会出现[hadoop@gc03vm12 /]$ scp -r&&/usr/local/hadoop&&hadoop@192.168.49.129:/usr/local/scp: /usr/local//hadoop: Permission denied即没有权限创建hadoop目录,造成复制失败)scp -r /usr/local/hadoop (数据节点IP):/usr/local/<font color="# Hadoop集群启动& & Namenode执行:& & 格式化namenode,格式化后在namenode生成了hdfs/name文件夹bin/hadoop namenode –format启动hadoop所有进程,bin/start-all.sh(或者先后执行start-dfs.sh和start-mapreduce.sh)。可以通过以下启动日志看出,首先启动namenode,然后启动datanode1,datanode2,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,最后启动tasktracker2。& & 启动hadoop成功后,在namenode中生成了hadooptmp文件夹,在datanode中生成了hdfs文件夹和mapred文件夹。namenode上用java自带的小工具jps查看进程# jps<font color="#83 JobTracker<font color="#33 Jps<font color="#12 SecondaryNameNode<font color="#74 NameNode每个datanode上查看进程# jps<font color="#36 DataNode<font color="#62 Jps<font color="#49 TaskTracker在namenode上查看集群状态bin/hadoop dfsadmin –reportConfigured Capacity:
(14.93 GB)Present Capacity:
(7.28 GB)DFS Remaining:
(7.22 GB)DFS Used: .26 MB)DFS Used%: 0.84% -------------------------------------------------Datanodes available: 2 (2 total, 0 dead) Name: 10.10.97.142:50010Decommission Status : NormalConfigured Capacity:
(7.46 GB)DFS Used: .13 MB)Non DFS Used:
(4.07 GB)DFS Remaining: (3.37 GB)DFS Used%: 0.41%DFS Remaining%: 45.14%Last contact: Thu May 13 06:17:57 CST 2010 Name: 10.10.97.144:50010Decommission Status : NormalConfigured Capacity:
(7.46 GB)DFS Used: .13 MB)Non DFS Used:
(3.59 GB)DFS Remaining: (3.85 GB)DFS Used%: 0.41%DFS Remaining%: 51.54%Last contact: Thu May 13 06:17:59 CST 2010Hadoop 的web 方式查看:http:// namenode ip地址:50070 NameNode 'gc03vm12:9000'Started: Mon Sep 24 02:28:17 CST 2012 Version: <font color="#.20.2, r911707 Compiled: Fri Feb 19 08:07:34 UTC 2010 by chrisdo Upgrades: There are no upgrades in progress. Browse the filesystem
Namenode Logs Cluster Summary6 files and directories, 1 blocks = 7 total. Heap Size is 9.12 MB / 966.69 MB (0%) Configured Capacity:<font color="#.6 GBDFS Used:<font color="# KBNon DFS Used:<font color="#.78 GBDFS Remaining:<font color="#.81 GBDFS Used%:<font color="# %DFS Remaining%:<font color="#.32 %Live Nodes :<font color="#Dead Nodes :<font color="#NameNode Storage: Storage DirectoryTypeState
/usr/local/hadoop/hdfs/nameIMAGE_AND_EDITSActiveHadoop, 2012.
& & Hadoop查看工作情况: http:// namenode ip地址:50030<font color="# Hadoop使用& && & Hadoop有两个重要的模块:MapReduce和HDFS,HDFS是一个分布式文件系统,用于存储数据,MapReduce是一个编程框架,Hadoop中运行的程序均是MapReduce作业,一个作业分为若干个Map任务和Reduce任务。<font color="#.1 客户机与HDFS进行交互<font color="#.1.1 客户机配置& & 可以查看HDFS中的数据,向HDFS中写入数据。(1)选择一台机器,该机器可以是Hadoop集群中的节点,也可以是集群之外的机器。下面说明在集群之外的客户机上如何操作与HDFS交互,集群之内的节点省去配置过程。(2)集群之外的机器请保证和Hadoop集群是网络连通的,并且安装了Hadoop(解压安装包即可)并在conf/hadoop-site.xml中做了相关配置,至少配置如下:&configuration& &!—core-site.xml--&&property&& && &&&&name&fs.default.name&/name&& && &&&&value&hdfs://gc04vm12:9000&/value&& && &&&&description& &/description&&/property& &!—mapred-site.xml--&&property&& & &name&mapred.job.tracker&/name&& & &value&gc03vm12:9001&/value&& & &description&jobtracker标识:端口号,不是URI&/description&&/property& &/configuration& & & (3)按照以上步骤配置完成后,即可在客户机的命令行中执行命令,查看HDFS文件系统。<font color="#.1.2 列出HDFS根目录/下的文件[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls /Found 3 itemsdrwxr-xr-x& &- hadoop supergroup& && && & 0
00:42 /tmpdrwxr-xr-x& &- hadoop supergroup& && && & 0
00:53 /userdrwxr-xr-x& &- hadoop supergroup& && && & 0
00:55 /usr& & 第一列是目录权限,第二列的hadoop是目录拥有者,第三列是组名,第4列是目录大小(单位是B),第5列是目录的绝对路径。这里表示/目录下有三个目录。这里的用户hadoop是安装hadoop的用户,是超级用户,相当于Linux操作系统的root用户,组supergroup相当于root用户组。<font color="#.1.3 列出当前用户主目录下的文件Hadoop默认当前HDFS中的用户就是当前登录客户机的用户。[root@gc03vm12 nutch-1.0]# bin/hadoop dfs –lsls: Cannot access .: No such file or directory.& &提示不能访问时因为hdfs中没有/user/root目录。注意:这里的当前用户主目录是客户机中当前登录用户的主目录,即HDFS中的“/user/用户名”目录,由于当前是root用户登录,命令“bin/hadoop dfs –ls”访问的是HDFS中的“/user/root目录”。此时若/user/root目录不存在,则会出现上面的提示。由于HDFS中不存在root用户,所以客户机当前登录用户无法向HDFS中写入数据,因为对HDFS中的所有目录没有写权限,只有r读权限。要使当前用户能够向HDFS中写入数据,必须在HDFS中创建root用户并且创建相应目录,赋予相关权限。总之,HDFS的用户权限和Linux一样重要。<font color="#.1.4 HDFS用户管理创建HDFS用户需要使用hadoop用户登录客户机器,并且执行hadoop相关命令。由于Hadoop默认当前HDFS中的用户就是当前登录客户机的用户,所以当前HDFS用户即为Hadoop超级用户hadoop。Hadoop似乎没有提供创建用户的命令,但要在HDFS中创建用户和用户组可以这样做。(i)Hadoop超级用户hadoop在hdfs中创建目录/user/root,即 bin/hadoop dfs -mkdir /user/root(ii)更改/user/root目录所属用户和组, 即bin/hadoop dfs -chown -R root:root /user/root,命令执行完毕Hadoop将默认创建有用户root,用户组root。注意:若此处没有指定组,则默认将root用户分配到supergroup组, bin/hadoop dfs -chown -R root /user/root(ii)这样就相当于在hdfs中创建了用户root,组root。并且当前客户机的root用户对hdfs中的/user/root目录进行rwx。<font color="#.1.5 复制本地数据到HDFS中[root@gc03vm12 nutch-1.0]# bin/hadoop dfs –copyFromLocal /local/x&&/user/root/& & 执行以上命令即能将本地数据上传到HDFS中,上传的文件将会被分块,并且数据块将物理存储在集群数据节点的hadoop-site.xml文件中的dfs.data.dir参数指定的目录下,用户可以登录数据节点查看相应数据块。& & HDFS中一个文件对应若干数据块,如果文件小于块大小(默认64M),则将会存储到一个块中,块大小即文件大小。若文件很大,则分为多个块存储。<font color="#.1.6 数据副本说明& &Hadoop-site.xml文件中的dfs.replication参数指定了数据块的副本数量。一个文件被分为若干数据块,其所有数据块副本的名字和元数据都是一样的,例如下图显示了上传一个目录(包含两个小文件)到HDFS后数据节点中数据块情况:图 节点一上的副本图 节点二上的副本<font color="#.1.7 hadoop-site.xml参数说明(1) hadoop.tmp.dir该参数默认值是“/tmp/hadoop-{当前登录用户名}”。它是本地路径,当第一次启动Hadoop集群进程时在namenode节点的本地创建该目录,其作用是存储相关临时文件。(2)mapred.system.dir 该参数默认值是${hadoop.tmp.dir}/mapred/system,它所表示的目录是hdfs中的路径,是相对于dfs.default.name的路径,即它在hdfs中的绝对路径是{$dfs.default.name}/{$mapred.system.dir}。该参数指定的目录的作用是当作业运行时,存储作业相关文件,供tasktracker节点共享。一般hdfs系统中/目录下可以看到该参数指定的目录,如[nutch@gc04vm12 nutch-1.0]$ bin/hadoop dfs -lsr /drwxr-xr-x& &- nutch supergroup& &&&/tmpdrwxr-xr-x& &- nutch supergroup& &&&/tmp/hadoopdrwxr-xr-x& &- nutch supergroup& &&&/tmp/hadoop/mapreddrwx-wx-wx& &- nutch supergroup& &
/tmp/hadoop/mapred/system (即此)& & 其他参数参见hadoop-default.xml中的说明。<font color="#.1.8 HDFS中的路径& && && &首先请查阅资料,把握URI的概念。在HDFS中,例如下面这些形式均是URI(注意不是URL,URI概念比URL更广)。例如file:///,hdfs://x/y/z,/x/y/z,z。HDFS路径应该可以分为三种:绝对URI路径,即hdfs://namenode:端口/xxxx/xxxx这种形式;HDFS绝对路径 ,例如/user或者///user,注意使用/或者///表示根目录,而不能使用//;HDFS相对路径,例如x,此路径往往是相对于当前用户主目录/user/用户名而言,例如x对应的HDFS绝对路径是/user/hadoop/x。Hadoop-site.xml中参数mapred.system.dir的值所指的路径是HDFS的绝对路径,它和fs.default.name参数一起构成了绝对URI,例如参数值/tmp/hadoop/mapred/system最终将对应的是绝对URI:hdfs://gc04vm12:9000/tmp/hadoop/mapred/system无论使用何种路径,均能查看HDFS中的数据,例如:<font color="#.1.8 Hadoop相关命令Hadoop提供一系列的命令,在bin中,例如bin/hadoop&&fs –x;bin/hadoop namenode –x等等。其中有些命令只能在namenode上执行。bin下还有一些控制脚本,例如start-all.sh、start-mapred.sh、start-dfs.sh等等。数据节点上运行start-all.sh将会只启动本节点上的进程,如datanode、tasktracker。<font color="#.2 客户机提交作业到集群<font color="#.2.1 客户机配置& & 可以在客户机上向Hadoop集群提交作业。(1)选择一台机器,该机器可以是Hadoop集群中的节点,也可以是集群之外的机器。下面说明在集群之外的客户机上如何向hadoop提交作业,集群之内的节点省去配置过程。(2)集群之外的机器请保证和Hadoop集群是网络连通的,并且安装了Hadoop(解压安装包即可)并在conf/hadoop-site.xml中做了相关配置,至少配置如下:&configuration& &!—core-site.xml--&&property&& && &&&&name&fs.default.name&/name&& && &&&&value&hdfs://gc04vm12:9000&/value&& && &&&&description& &/description&&/property& &!—mapred-site.xml--&&property&& & &name&mapred.job.tracker&/name&& & &value&gc03vm12:9001&/value&& & &description&jobtracker标识:端口号,不是URI&/description&&/property& &/configuration& & & (3)按照以上步骤配置完成后,即可在客户机的命令行中执行命令,向hadoop提交作业。<font color="#.2.2 一个测试例子WordCount& & 计算输入文本中词语数量的程序WordCount在Hadoop主目录下的java程序包hadoop-0.19.1-examples.jar中,执行步骤如下:& & (1)上传数据到HDFS中bin/hadoop fs -mkdir mytestbin/hadoop fs -copyFromLocal /home/hadoop/mytest/input1bin/hadoop fs -copyFromLocal /home/hadoop/mytest/input2(2)执行命令,提交作业bin/hadoop jar hadoop-0.19.1-examples.jar wordcount mytest/* output命令执行完毕,在页面http://namenodeip:50030/中能够看到作业执行情况。(3)程序输出程序将统计mytest目录下的所有文本文件中词语的数量,并将结果输出到hdfs的output目录下的part-00000文件中。这里的output目录是程序生成的目录,程序运行前不可存在。执行以下命令可以查看结果。bin/hadoop fs -cat output/part-00000<font color="#.2.3 编写Hadoop应用程序并在集群上运行& & 这里介绍一个向HDFS中写入数据的例子(注意不是MR程序)来说明编写Hadoop应用程序并放到集群上运行的步骤。(1)客户端编写应用程序并编译运行,进行测试。编写程序一般需要引入hadoop相关jar包或者直接使用hadoop整个程序包,相关代码见附录。(2)打包应用程序在eclipse中打包成jar文件存储到相应目录下,例如/hadoop/ jarseclipse/dfsOperator.jar。(3)上传数据到HDFSbin/hadoop fs –copyFromLocal local dst本实例中不需要上传数据,一般的程序都涉及输入数据。(4)执行应用程序bin/hadoop jar&&x.jar&&jar包中主类名&&[输入参数] [输出参数] 这里使用的命令是:
& & bin/hadoop jar ~/jarseclipse/dfsOperator.jar DFSOperator<font color="#.2.4 三种模式下编译运行Hadoop应用程序& & 集群是完全分布式环境,Hadoop的MR程序将以作业的形式提交到集群中运行。我们在客户端编写Hadoop应用程序时一般是在伪分布式模式或单击模式下进行编译,然后将编译无误的程序打成包提交到Hadoop集群中,当然我们仍可直接让程序在Hadoop集群中编译。(1)让Hadoop应用程序在直接在集群中编译将hadoop整个包导入eclipse中,配置hadoop-site.xml文件如下:&configuration& &!—core-site.xml--&&property&& && &&&&name&fs.default.name&/name&& && &&&&value&hdfs://gc04vm12:9000&/value&& && &&&&description& &/description&&/property& &!—mapred-site.xml--&&property&& & &name&mapred.job.tracker&/name&& & &value&gc03vm12:9001&/value&& & &description&jobtracker标识:端口号,不是URI&/description&&/property& &/configuration&编写应用程序,编译运行,此时程序将直接在Hadoop集群中运行。此种方法在开发中不建议使用,以防止破坏集群环境。(2)单机模式下编译Hadoop应用程序将hadoop整个包导入eclipse中, hadoop-site.xml文件不做任何配置,保留默认的空配置。单机模式下运行Hadoop应用程序时,程序使用的是本地文件系统。(3)伪分布式模式下编译Hadoop应用程序在单机上配置Hadoop伪分布式模式,配置文件hadoop-site.xml如下:&?xml version=&1.0&?&&?xml-stylesheet type=&text/xsl& href=&configuration.xsl&?&&!-- Put site-specific property overrides in this file. --& &configuration& &!—core-site.xml--&&property&& & &name&fs.default.name&/name&& & &value&hdfs://localhost:9000&/value&& & &description&HDFS的URI,文件系统://namenode标识:端口号&/description&&/property& &!—hdfs-site.xml--&&property&& & &name&dfs.replication&/name&&&& & &value&1&/value&& & &description&副本个数,不配置默认是3,应小于datanode机器数量&/description&&/property& &!—mapred-site.xml--&&property&& & &name&mapred.job.tracker&/name&& & &value&localhost:9001&/value&& & &description&jobtracker标识:端口号,不是URI&/description&&/property& &/configuration&使用bin/start-all.sh启动伪分布式集群。将hadoop整个包导入eclipse中,并将hadoop-site.xml文件配置为以上一样的内容。(或者直接将上面的hadoop目录导入eclipse中)。& & 编写应用程序并运行,此时程序将在伪分布式模式下运行,使用的是HDFS。<font color="#.2.5 提交多个作业到集群& & 提交一个后,可以继续提交,这样集群中将有多个作业,Hadoop有一个作业队列,可以在以下网址中查看。http://10.10.97.142:50030/jobqueue_details.jsp?queueName=default涉及多个作业时,Hadoop将对作业进行调度,默认调度方式是基于优先级的FIFO方式。更改作业优先级命令作业优先级有五种:VERY_HIGH HIGH NORMAL LOW VERY_LOW例如:bin/hadoop job -set-priority job__0074 VERY_HIGH附 程序Apache所有开源项目下载地址是:http://archive.apache.org/dist/import java.io.IOE import org.apache.hadoop.conf.Cimport org.apache.hadoop.fs.FSDataInputSimport org.apache.hadoop.fs.FSDataOutputSimport org.apache.hadoop.fs.FileSimport org.apache.hadoop.fs.Pimport org.apache.hadoop.io.IOU
public class DFSOperator {& &&&/*& && &* Write to HDFS& && &*/& &&&public static void main(String args[]){& && && &Configuration conf=new Configuration();//it will read conf/*.xml,such as hadoop-site.xml& && && &try{& && && && &&&System.out.println(&write to hdfs&);& && && && &&&FileSystem fs=FileSystem.get(conf);& && && && &&&//Path f=new Path(&hdfs:///javawrhdfsfile&);//hdfs root directory,it must be three &///& or one &/&& && && && &&&//Path f=new Path(&hdfs:/user/nutch/javawrhdfsfile&);// &hdfs:/& or &hdfs:///& is the root directory of hdfs,like &/& in linux& && && && &&&//Path f=new Path(&hdfs:/javawrhdfsfile&); //absolute path,f.isAbsolute() is &true&& && && && &&&//Path f=new Path(&//javawrhdfsfile&); //it will have error& && && && &&&//Path f=new Path(&///javawrhdfsfile&); & && && && &&&Path f=new Path(&/javawrhdfsfile&); & && && && &&&//Path f=new Path(&hdfs://10.10.97.142:9000//javawrhdfsfile&); //绝对URI前缀请与dfs.defaule.name一致,使用ip时因为/etc/hosts改了,会出现问题& && && && &&&//Path f=new Path(&hdfs://gc04vm12:9000/javawrhdfsfile&); & && && && &&&//Path f=new Path(&javawrhdfsfile&);//relative path,it will be in the user home dir,f.isAbsolute() is &false&& && && && &&&FSDataOutputStream out=fs.create(f,true);& && && && &&&for(int i=0;i&5;i++){& && && && && && & out.writeChars(&zhankunlin&+i+&\n&);& && && && &&&}& && && && &&&out.close();& && && && &&&System.out.println(&write finished,it produced a file: &+f.toString());// & && && && &&&& && && && &&&System.out.println(&read the file: &+f.toString());& && && && &&&FSDataInputStream in=fs.open(f);& && && && &&&IOUtils.copyBytes(in, System.out, 4096,false);& && && && &&&System.out.println(&read finished!&);& && && && &&&IOUtils.closeStream(out);& && && &}catch(IOException e){& && && && &&&e.printStackTrace();& && && &}& &&&}}
中级会员, 积分 318, 距离下一级还需 182 积分
论坛徽章:2
好详细....
中级会员, 积分 318, 距离下一级还需 182 积分
论坛徽章:2
再顶一下...
金牌会员, 积分 1254, 距离下一级还需 1746 积分
论坛徽章:10
我过去也按照这个做了一次,做成功了
注册会员, 积分 141, 距离下一级还需 59 积分
论坛徽章:1
金牌会员, 积分 1698, 距离下一级还需 1302 积分
论坛徽章:7
注册会员, 积分 81, 距离下一级还需 119 积分
论坛徽章:1

我要回帖

更多关于 hadoop伪分布式安装 的文章

 

随机推荐