我是在ubuntu上安装的Hadoop,ubuntu版本14.04和16.04都有,关系不大。使用了3台服务器。
总共安装了2个nameNode,3个dataNode,3个journalNode
下面是安装步骤:
1. 安装JDK:我安装的是1.8。
jdk安装方法,参照以前的:
和这个里面有些不同,现在直接下载tar.gz包,解压缩就可以了。环境变量照上面这个配。
2. 修改主机名:
编辑/etc/hostname,修改主机名,每台机器都改成不一样的。改完后再输入hostname查看,会发现没变,改了这个文件是要重启后才会变的。直接执行hostname <主机名>即可。例如将hostname改成server229:
hostname server229
然后修改/etc/hosts,将各机器的ip和主机名配置进去,所以需要配一下:
127.0.0.1 localhost
127.0.1.1 selfserver229
192.168.18.228 server228
192.168.18.225 server225
192.168.18.223 server223
192.168.18.229 server229
192.168.18.226 server226
比如我上面这个,该台机器的ip是192.168.18.229。127.0.0.1和127.0.1.1中两个是本来就有的,其中127.0.1.1和原来hostname里的主机名是一样的,我这里特地改成不一样的。hostname里的主机名配到该机器的物理ip上。
检验是否配置好,ping <主机名>就可以了
3. 安装ssh和rsync
apt-get install ssh
apt-get install rsync
4. 配置ssh免密码登录
因为偷懒,所以用的都是root账户,而现在的ubuntu下,默认都是不让root账户远程ssh登录的。所以首先要开启root账号远程ssh登录, 还是参照以前的文章:
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
注意一下,如果因为懒,把所有机器都用相同的key的话,也是可以的,把生成的id_rsa和id_rsa.pub拷贝到其它机器的/root/.ssh/下然后生成authorized_keys就可以,但是要注意权限,这三个文件都是只能所有者读写,其它权限都是没有的。也就是上面的最后一条命令,将权限设为0600.
5. 安装zookeeper集群
看之前的文章:
好了,终于可以开始安装hadoop了
6. 解压hadoop安装包,我安装的hadoop版本是2.7.4. 安装路径是/usr/local/hadoop/
tar -xzvf hadoop-2.7.4.tar.gz
7. 在hadoop内配置jdk
修改hadoop路径下etc/hadoop目录下的hadoo-env.sh
export JAVA_HOME=/root/training/jdk1.8.0_181
8. 修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为nameService1-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://nameService1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hadoop-2.7.4/tmp</value>
</property>
<!-- zookeeper集群地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>server229:2181,server229:2182,server225:2181</value>
</property>
</configuration>
以上配置中指定了一个临时目录,文件夹不存在的话,需要自己用mkdir创建。zookeeper集群里的ip都用主机名替代了,主机名就是第2步中配在hosts文件里的。
9. 配置hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为nameService1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>nameService1</value>
</property>
<property>
<name>dfs.ha.namenodes.nameService1</name>
<value>nameNode1,nameNode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameService1.nameNode1</name>
<value>server227:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.nameService1.nameNode1</name>
<value>server227:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameService1.nameNode2</name>
<value>server228:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.nameService1.nameNode2</name>
<value>server228:50070</value>
</property>
<!-- 指定NameNode的日志在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://server227:8485;server228:8485;server225:8485/nameService1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/hadoop-2.7.4/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.nameService1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制占用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
这个配置文件中主要是配置了一个nameservice,这个nameservice就是core-site.xml里指定的那个名字:“nameservice1”,然后这个nameservice下有两个namenode(namenode1和namenode2),即一主一备保证高可用。还配置了journalNode,按照关网要求的journalNode至少要3台。journalNode上还配置了一个文件路径journal,同样,文件夹不存在的话要自己创建。
10. 配置mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
11. 配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 开启RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>resourceManager1,resourceManager2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.resourceManager1</name>
<value>server227</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.resourceManager2</name>
<value>server228</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>server229:2181,server229:2182,server225:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
这主要是配置yarn容器。
12. 配收slave文件
打开slave文件,这个文件是配置从节点的,里面原来有一行localhost,把它注掉。换成3台从节点的域名。
#localhost
server227
server228
server225
13. 将配置文件拷贝到另外两台机器上,因为已经开启了ssh免密登录,所以可以直接用scp命令
scp -r /usr/local/hadoop/hadoop-2.7.3/etc root@server228:/usr/local/hadoop-2.7.3/etc/
14. 启动journalNode
在hadoop目录下的sbin下面执行,上面说了journalNode要3个,所以3台机器上都要执行
./hadoop-daemon.sh start journalnode
15. 格式化HDFS(在主节点上执行),这个命令在bin下
./hdfs namenode -format
然后将/usr/local/hadoop/hadoop-2.7.4/tmp拷贝到从节点的相同目录下
16. 初识化zookeeper,主节点上执行一次就可以了
./hdfs zkfc -formatZK
17. 启动hadoop
start-all.sh
到这边为止hdfs已经可以用了。
18. yarn的resourceManager的从节点需要单独启动一下
yarn-daemon.sh start resourcemanager
hadoop的安装真的很复杂。。。
官网链接:
resourceManager高可用: http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html