Hadoop2.6.0分布式安装过程用了3~4天才完成,其实过程到不是很复杂,主要是期间系统崩溃等各种问题,头都大了,万幸今天终于搞好了,最后运行了wordcount程序,也算是走个流程,需要的朋友可以参考一下。
安装的版本如下:
Vmware workstation 11
操作系统:CentOS6.5 64位
hadoop2.6
jdk1.7.0_67
安装过程主要如下:
1. 配置hosts信息
2. 安装jdk
3. 配置ssh免密码登录
4. 安装hadoop
5. wordcoun测试
1. 配置hosts信息
本人的安装过程采用了三台虚拟机:主机名分别为master,slave1和slave2
各自的IP如下:
master:192.168.1.100
slave1:192.168.1.101
slave2: 192.168.1.102
2 安装jdk过程:
我用的是jdk-7u67-linux-x64.tar.gz版本
a> 解压安装jdk到路径:/usr/local/java
# tar –zxvf jdk-7u67-linux-x64.tar.gz
b> 配置java环境变量
# vi /etc/profile
打开profile文件后,在该文件后面添加如下配置信息:
#java environmet export JAVA_HOME=/usr/local/java/jdk1.7.0_67 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
保存信息后
# source /etc/profile使该配置生效
c> 查看java版本
# java –version(若linux系统有默认java旧版本,一定要修改成为当前沃我们配置的java信息,因为后面安装hadoop时候也要用到java配置信息,详细方法网上有很 多资源)
3. ssh免密码远程登录(这步很关键,当时没有研究仔细,都搞了大半天)
以master节点为例,其他slave1和slave2节点操作类似。
a> 生成私钥和公钥,操作如下:
b> 拷贝id_dsa.pub到authorized_keys
c> 完成后可以使用# ssh localhost测试一下是否在本地免密码登录是否能行,按照a和b步骤一般没什么问题
d> 配置远程免密码登录,这一步是配置ssh免密码登录最为关键的步骤,这样比如master的公钥信息放在了slave1的authorized_keys中,那么通过在master远程登录操作:# ssh slave1 就可以登录了,为了配置这三台虚拟机能够互相免密码登录,必须要将它们的公钥放在其他节点的authorized_keys中。我的方法是先将slave1和slave2中的authorized_keys追加到master的author_keys中,然后再通过master想其他两个节点进行分发。具体操作如下:
slave1节点上(~/ssh目录下):
slave2节点上(~/ssh目录下):
master节点上:将从节点slave1和slave2上的公钥信息追加的自己节点的authoried_keys中,然后转发到两个从节点上。
然后在slave1和slave2节点总将~/.ssh下的authorized_keys_master的内容将原来的文件下面的authorized_keys文件内容覆盖掉,以slave1为例
# rm –rf ~/.ssh/authorized_keys
#cat ~/.ssh/authorized_keys_mater >> ~/.ssh/authorized_keys
在slave2中进行同样类似的操作后就三台电脑就可以互相免密码登录了:
在master上操作成功,其他节点类似:
4. 安装hadoop
(在master节点上操作,配置好的hadoop文件通过分发给slave1和slave2节点)
a> 解压hadoop-2.6.0.tar.gz到/usr/local/hadoop路径
# tar –zxvf hadoop-2.6.0.tar.gz
b> 配置hadoop环境变量(在/etc/profile文件下和配置java的一样)
Hadoop信息添加完成后,用# source /etc/profile使配置文件生效
c> 查看hadoop版本如下:
d> 接下来主要修改以下几个文件:
hadoop-env.sh
yarn-env.sh
slaves
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
修改hadoop-env.sh文件和yarn-env.sh文件一样主要修改jdk路径为我们自己的,找到对应的修改JAVA_HOME的模块:
export JAVA_HOME=/usr/local/java/jdk1.7.0_67
修改slaves文件,添加:
slave1
slave2
修改core-site.xml文件(友情提示:红棕色的为需要注意的地方,并且出现的路径也是必须提前手工创建):
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>hadoop.proxyuser.u0.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.u0.groups</name> <value>*</value> </property> </configuration>
修改hdfs-site.xml文件:
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
修改mapred-site.xml文件:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration>
修改yarn-site.xml文件:
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration>
通过如上系列的hadoop文件配置结束后,将整个hadoop文件分发到slave1和slave2的/usr/local下面
在master节点上操作:
# scp -rf /usr/local/hadoop root@slave1:/usr/local/
# scp -rf /usr/local/hadoop root@slave2:/usr/local/
再回到slave1和slave2中配置各自的hadoop路径并生效即可。a> 接下来基本的配置已经完成,可以运行了,主要是在master节点上操作
² 格式化namenode
# hadoop namenode –format
² 启动start-dfs.sh
# cd /usr/local/hadoop/sbin
# ./start-dfs.sh
此时在Master上面运行的进程有:namenode secondarynamenode
Slave1和Slave2上面运行的进程有:datanode
Master节点的操作
Slave1节点上使用jps命令查看:
² 启动start-yarn.sh
# ./start-yarn.sh
此时在Master上面运行的进程有:namenode secondarynamenode resourcemanager。 Slave1和Slave2上面运行的进程有:datanode nodemanager
以上操作都没问题后,就可以在master节点上通过网页版很方便的查看到信息,输入:192.168.1.100:50070
5. Wordcount测试
这个测试使用的是hadoop自带的wordcount测试程序,结果倒是没问题,就是速度不行,不晓得是不是电脑配置的原因。
a> 新建要测试的文件如为:test.txt并输入你自己想要的字符或单词。
b> 创建hdfs文件夹
# hadoop fs –mkdir /input
c> 上传test.txt文件(可能上传操作会出现问题,错误提示贴在最后面了,如果遇到相同的,就按照解决方案做就行了)。
#hadoop fs –put test.txt /input
d> 开始执行wordcount程序
# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /input /output
e> 执行完成后,查看结果
至此,嗯也算搞完了,为后面的学习做准备。加油各^ - ^
上传hdfs文件遇到的一个问题,错误提示贴出来如下:
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /input/test.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1549)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3200)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:641)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:482)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:962)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2039)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2035)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2033)
at org.apache.hadoop.ipc.Client.call(Client.java:1468)
at org.apache.hadoop.ipc.Client.call(Client.java:1399)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
at com.sun.proxy.$Proxy14.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:399)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy15.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1532)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1349)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:588)
put: File /input/test.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation
解决方案:将各个节点的防火墙关掉就解决了