初学hadoop,写下一些 学习过程 和 心得体会,希望能帮助到同样学习的兄弟们 三台机器: 分别为 master(192.168.32.5),slave1(192.168.32.6),slave2(192.168.32.7) master即为hadoop的Namenode节点,slave1和slave2为hadoop的Datanode节点 注:以下操作均为root用户或root权限用户操作(本文章为root用户操作) 1.设置机器名(在这里只要机器名不同就可以,不一定需要后缀域名) (1). hostname分别为:master.localdomain slave1.localdomain slave2.localdomain 分别修改各机器/etc/sysconfig/network文件 ,使 hostname=master.localdomain hostname=slave1.localdomain hostname=slave2.localdomain (2). 各机器/etc/hosts文件配置为 # cat /etc/hosts 192.168.32.5 master.localdomain master 192.168.32.6 slave1.localdomain slave1 192.168.32.7 slave2.localdomain slave2 注:以上机器各个机器名一定要不同,否则hadoop的raduce过程会出错,之所以各个机器名使用域名方式 ,是因为这样可以使 linux启动时 sendmain和ssclient进程启动更迅速些 2.无密码登陆 (1). 本机无密码登陆(master) 从master (Namenode)上无需密码ssh到各slave (Datanode)上,在master上执行如下命令: # ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 则在 /root/.ssh目录中生成了两个文件为::id_dsa 和id_dsa.pub。这两个是成对出现,类似钥匙和锁。再把id_dsa.pub 追加到授权key 里面(当前并没有authorized_keys文件):$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys。完成后可以实现无密码登录本机:$ ssh localhost。 (2). master (Namenode) 到slavle(DataNode)无密码登陆 把NameNode 上的id_dsa.pub 文件追加到dataNode 的authorized_keys 内( 以192.168.32.7 节点为例): a. 拷贝NameNode 的id_dsa.pub 文件: $ scp id_dsa.pub root@192.168.32.7:/root b. 登录192.168.32.7,执行$ cat id_dsa.pub >> .ssh/authorized_keys 其他的dataNode 执行同样的操作。 注意:如果配置完毕,如果namenode 依然不能访问datanode,可以修改datanode 的authorized_keys:$ chmod 600 authorized_keys。 3.关闭linux防火墙,使其永久关闭防火墙 # chkconfig iptables off # service iptables stop (如果只运行此一条命令,系统重启后防火墙将继续开启) 4.安装JDK,配置JDK环境变量,过程略过 (此需要JDK1.6+版本) 5.安装hadoop 下载hadoop安装包,我下载的的为hadoop-0.20.0.tar.gz版本,解压即可(本人解压到/usr目录中) # tar -zxvf hadoop-0.20.0.tar.gz 配置hadoop环境变量,添加如下到/etc/profile中 export HADOOP_HOME=/usr/hadoop-0.20.2 export PATH=$HADOOP_HOME/bin:$PATH 6.配置hadoop hadoop 的主要配置都在hadoop-0.20.2/conf 下。 (1).在conf/hadoop-env.sh 中配置Java 环境(namenode与datanode 的配置相同): $ vi hadoop-env.sh 配置export JAVA_HOME=/usr/java/jdk1.6 (去掉行的#注释且加java路径即可) (2).配置conf/masters 和conf/slaves 文件:(只在namenode 上配置) masters文件内容: 192.168.32.5 slaves文件内容: 192.168.32.6 192.168.32.7 (3).配置conf/core-site.xml, conf/hdfs-site.xml 及conf/mapred-site.xml (简单配置,datanode 的配置相同,不同情况说明) A. core-site.xml: <configuration> <property> <name>hadoop.tmp.dir</name> <value>/root/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://192.168.32.5:9000</value> </property> </configuration> B. hdfs-site.xml: <configuration> <!--dfs.name.dir在namenode中配置,在datanode中可省略, 如在namenode中省略,则namenode数据存储于/root/hadoop/tmp/name文件夹中--> <property> <name>dfs.name.dir</name> <value>/root/hadoopName</value> </property> <!--dfs.data.dir节点如在datanode中省略,则datanode数据存储于/root/hadoop/tmp/data文件夹中--> <property> <name>dfs.data.dir</name> <value>/root/hadoopData</value> </property> <!--replication 默认为3,如果不修改,datanode 少于三台就会报错--> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> C. mapred-site.xml: <configuration> <property> <name>mapred.job.tracker</name> <value>192.168.32.5:9001</value> </property> </configuration> (4).运行hadoop 进入hadoop-0.20.1/bin,首先格式化文件系统:$ hadoop namenode –format 启动Hadoop:$ start-all.sh 用jps 命令查看进程,NameNode 上的结果如下: # jps 3020 JobTracker 2952 SecondaryNameNode 2817 NameNode 3110 Jps DataNode上的结果: # jps 6360 Jps 6222 TaskTracker 6158 DataNode web地址输入 http://192.168.32.5:50070/dfshealth.jsp,如图 点击Browse the filesystem链接进入 http://192.168.32.7:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=/ ,如图 查看集群状态, [root@master conf]# hadoop dfsadmin -report Configured Capacity: 8110792704 (7.55 GB) Present Capacity: 2848157696 (2.65 GB) DFS Remaining: 2847920128 (2.65 GB) DFS Used: 237568 (232 KB) DFS Used%: 0.01% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Datanodes available: 2 (2 total, 0 dead) Name: 192.168.32.7:50010 Decommission Status : Normal Configured Capacity: 4055396352 (3.78 GB) DFS Used: 126991 (124.01 KB) Non DFS Used: 2631352305 (2.45 GB) DFS Remaining: 1423917056(1.33 GB) DFS Used%: 0% DFS Remaining%: 35.11% Last contact: Wed Mar 23 04:44:25 CST 2011 Name: 192.168.32.6:50010 Decommission Status : Normal Configured Capacity: 4055396352 (3.78 GB) DFS Used: 110577 (107.99 KB) Non DFS Used: 2631282703 (2.45 GB) DFS Remaining: 1424003072(1.33 GB) DFS Used%: 0% DFS Remaining%: 35.11% Last contact: Wed Mar 23 04:44:27 CST 2011 此时hadoop安装即完成了 遇到的问题: 1. 出现错误:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out 此问题也和系统 打开文件数限制 有关系,但初装应该不会超限,所以原因如下: (1).对于运行在A节点上的map任务,运行完毕后,将运行结果提交给jobtracker,并将运行结果保存在节点A上. (2).对于运行在B节点上的reduce任务,从jobtracker取得任务信息(假设任务包括对节点A的map的数据).并直接从节点A提取该map的结果. 我的这一问题发生的原因在第二步.当节点B的reduce从jobtracker获得的任务中,包括map的服务器地址,而这个地址是改服务器的名字,而不是IP地址.因此,当在本地解析该服务器名的时候,无法解析出他的ip地址,导致无法从A节点,提去数据. 解决办法: 1. 配置 /etc/hosts <A的ip地址> A的服务器名 2. 配置各个机器的hostname,使其hostname不同 # hostname naster 当前生效,重启失效 或 修改 /etc/sysconfig/network文件 hostname=master 注:不要删除host文件里的 localhost.localdomain 问题二: 出现如下异常: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /root/hadoop/tmp/mapred/system. Name node is in safe mode. 解决办法: # hadoop dfs -safemode leave 问题三: namenode和Datanode都正常启动,只有进程,也可以建立文件夹,但不能对文件作操作(即:访问不了datanode) 解决方法: # chkconfig iptables off # service iptables stop 永久关闭防火墙 --------------------------------------------------------------------------------------- 提前问题: 在hadoop启动的时候,个人关掉了slave2,master却不知道, 怎么让它知道?? 你知道Zoo Keeper吗?? 现象:stop-all.sh 出现如下信息 [root@master root]# stop-all.sh stopping jobtracker 192.168.32.6: stopping tasktracker 192.168.32.7: ssh: connect to host 192.168.32.7 port 22: No route to host stopping namenode 192.168.32.6: stopping datanode 192.168.32.7: ssh: connect to host 192.168.32.7 port 22: No route to host 192.168.32.5: stopping secondarynamenode