最近开始接触Hadoop,首先从Hadoop的安装入手,本文将记录本人安装Hadoop的初体验。
Hadoop可以用以下三种支持的模式中的一种启动Hadoop集群:单机模式、伪分布式模式、完全分布式模式,本文将介绍配置完全分布式模式。
前置说明:本人是在Vmware上虚出了两个CentOS6.4进行玩耍的,Hadoop采用的是1.2.1版本(官网:http://hadoop.apache.org/),JRE是jre1.7.0_51。
两个虚拟主机的说明见下表,其中node1作为Master:NameNode和JobTracker,node2作为Slave:DataNode和TaskTracker。
下面介绍安装过程:
1.准备工作
关闭防火墙和selinux,下载JRE并正确安装,vi 两台机器的 /etc/hosts,添加ip和host名对应关系,并确保能通过ping node1/node2能ping通。
两台机器皆添加用户 # useradd hadoop ,passwd hadoop hadoop,su至hadoop用户,到官网下载hadoop-1.2.1.tar,tar xzfv 至/home/hadoop目录下。同时,为hadoop配置PATH环境变量,# ll -a,然后添加 :/home/hadoop/hadoop-1.2.1/bin至原.bash_profile的 PATH后,同时export PATH。
2.配置节点间SSH无密码登录
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程,这就需要在节点之间执行指令的时候是不需要输入密码的形式,故需要配置SSH运用无密码公钥认证的形式。当然,前提各节点的sshd服务已启动。
具体过程如下:
a.生成密钥对 # cd /home/hadoop,# ssh-keygen -t rsa,此时会在hadoop用户目录下面生成隐藏.ssh目录,可以使用# ll -a查看其。这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passwd的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/hadoop/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行。
b.生成authorized_keys文件 进入.ssh文件夹,然后将id_rsa.pub复制到authorized_keys文件(两台机器都需要执行)
# cd .ssh
# cp id_rsa.pub authorized_keys #生成authorized_keys文件
# ssh node2 #测试无密码登陆,第一可能需要密码,输入hadoop用户的密码即可
c.node1 node2密钥互通 在node2执行以下命令:
# scp authorized_keys hadoop@node1:/tmp #先复制authorized_keys到node1的tmp目录中去
# cat /tmp/authorized_keys>>/home/hadoop/.ssh/authorized_keys #把公钥追加到文件后面,注意这个操作是在node1上
现在node1上的authorized_keys文件已经包含了两台主机的公钥。最后把node1上的authorized_keys再复制回node2上。
# scp /home/hadoop/.ssh/authorized_key hadoop@node2:/home/hadoop/.ssh
其实,这一步操作就是使node1、node2的authorized_keys相同且包含node1、node2密钥。
d.设置authorized_keys访问权限 # chmod 644 authorized_keys ,然后使用# ssh node2 ,不需要密码即证明配置无密钥SSH登录成功。
3.配置hadoop
cd至hadoop-1.2.1文件夹下。
配置conf/hadoop-env.sh的JAVA_HOME
配置conf/core-site.xml
其中fs.default.name是NameNode的URI。hdfs://主机名:端口/,hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
配置conf/mapred-site.xml
其中mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。/home/hadoop/hadoop_home/mar目录需要提前创建。
配置conf/hdfs-site.xml
其中dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错,此处配置为1。此处的name1和data1等目录不能提前创建,如果提前创建会出问题。
配置conf/masters 和 conf/slaves masters主节点配置为node1,slaves从节点配置为node2。
上述已经在node1上完成了hadoop的配置,由于我两台虚拟机是clone的,所以直接将node1上的hadoop.1.2.1文件夹scp到node2上即可。执行命令: # scp -r /home/hadoop/hadoop-1.2.1 hadoop@node2:/home/hadoop/
4.启动hadoop
首先,格式化一个新的分布式文件系统:# bin/hadoop namenode -format 注意如果已经有使用ing的fs请选择n。
启动Hadoop守护进程:
# bin/start-all.sh
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs)。
浏览NameNode和JobTracker的网络接口,它们的地址默认为:
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
将输入文件拷贝到分布式文件系统:
# bin/hadoop fs -put conf input
运行发行版提供的示例程序:
# bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
注意:如果出现 java.io.IOException: Not a file: hdfs://node1:19488/user/hadoop/input/conf 或者 put target input conf is a directory 异常时,请使用 # hadoop dfs -ls input 命令查看input是否正确,
如果不正确,使用 # hadoop dfs -rmr input删除后,再重新操作。
附,HDFS常用操作:
hadoop dfs -ls 列出HDFS下的文件
hadoop dfs -ls input 列出HDFS下某个文档中的文件
hadoop dfs -put 1.txt input/2.txt 上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功
hadoop dfs -get input/1.txt test.txt 从HDFS获取文件并且重新命名为test.txt,同put一样可操作文件也可操作目录
hadoop dfs -rmr out 删除指定文件从HDFS上
hadoop dfs -cat in/* 查看HDFS上in目录的内容
hadoop dfsadmin -report 查看HDFS的基本统计信息,结果如下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式
查看输出文件:
将输出文件从分布式文件系统拷贝到本地文件系统查看:
# bin/hadoop fs -get output output
# cat output/*
或者 在分布式文件系统上查看输出文件:
# bin/hadoop fs -cat output/*
完成全部操作后,停止守护进程:
# bin/stop-all.sh
综上,即完成了hadoop的配置即运行测试。
参考资料:http://hadoop.apache.org/docs/r1.2.1/