您的位置:首页 > 运维架构

【Hadoop系列】第二章:安装Hadoop(下)集群版Hadoop

2015-07-15 11:59 423 查看

第二章:安装Hadoop(下)集群版Hadoop

一、环境配置

本地环境:window7 x64

青云服务器

由于我自己没有这么多服务器,虚拟机更带不动这么多个,所以最后使用青云服务器,开通了四台服务器,整个使用流程还是很简单的,可以配置公网ip,给其中一台服务器连上公网。一天大概几块钱的样子,不用的时候关掉服务器和ip可以省些钱。

名称 IP 主机号

Frank1 10.60.202.54 FRANK-001

Frank2 10.60.274.69 FRANK-002

Frank3 10.60.217.36 FRANK-003

Frank4 10.60.245.65 FRANK-004

我们首先解决跟青云服务器有关系的一些问题。

服务器可以连接公网来上网(自己绑定),与本地电脑可以互相ping通,但是在本地访问服务器的公网地址一直出不来页面,在服务器中也开启了防火墙端口,然而没什么作用。最后询问相关人员才得到答复,原来要自己在安全选项卡里的防火墙里面,自己新建一个防火墙,加入希望访问的端口。最后将每个主机都应用这个防火墙就可以了。后面再更改这个防火墙,点击应用修改后会自动更新到每一个服务器上,非常方便,

整个部署过程中,首先将缺省防火墙的端口也添加进来。需要添加的端口有:80,50070,8485,8020,10020,19888,50010,8030,8031,8032,8033,8088,8090。后面会提及到。如果使用的不是这些端口,在配置过程中,观察错误提示什么端口无法连接,就将端口加入进来就好了。

添加进来后,如果本地通过ip地址可以进入apache的网页,说明成功了。

二、Hadoop环境配置

1).架构图

开始部署Hadoop集群,先说明一下我们的架构图

采用HDFS HA方式部署,架构图如下。



我们只有四台电脑,可以使用下面的架构图



图中的SY-0217,SY-0355,SY-0225,SY-0226分别对应FRANK-001~FRANK-004

2).具体步骤

1.修改hosts文件

我们给所有服务器取一个别名。FRANK-001主机是配置了公网ip的,使用xshell连接上后,修改hosts文件

[root@i-ryj3adbb frank]# vim /etc/hosts
添加

10.60.202.54 FRANK-001

10.60.274.69 FRANK-002

10.60.217.36 FRANK-003

10.60.245.65 FRANK-004

那么如何修改其他只有内网的服务器的hosts文件呢?可以用ssh连接。

[root@i-ryj3adbb frank]# ssh root@10.60.274.69


就可以连上10.60.274.69的root账户。

同样的修改hosts文件,其他几台服务器都类似。在这个过程中,顺便把后续要用的一些准备工作先做好,主要是:

每个服务器都创建新用户,比如我采用的frank,我们不使用root来运行hadoop,在/home/frank下新建一个hadoop文件夹,具体仿照《第二章:安装Hadoop(上)》里面的步骤。

当修改好hosts文件后,我们可以直接用别名访问,而不需要冗长的ip地址。例如

[root@i-ryj3adbb frank]# ssh root@FRANK-002

如果出错,说明配置出了问题,需检查。

2.主节点向其他节点的免密码登录

在Hadoop运行期间,namenode需要可以登录到其他的几台服务器,虽然有说法是运行时会询问你密码,输入密码就可以了,这样可以不用免密码登录。但是我测试时发现,他会三个密码一起询问,然后就出错,所以最好的还是配置免密码登录。注意,要配置的是你使用的运行Hadoop的用户名到datanode服务器使用的用户名之间的免登录。这里我采用的用户名全是frank。

原理非常简单,在namenode服务器上生成公钥密钥,放到datanode服务器的认证文件中即可。

在FRANK-001上:

[frank@i-ryj3adbb ~]# ssh-keygen -t rsa
[frank@i-ryj3adbb ~]# ssh frank@FRANK-002 "mkdir .ssh;chmod 0700 .ssh"
[frank@i-ryj3adbb ~]# ssh frank@FRANK-003 "mkdir .ssh;chmod 0700 .ssh"
[frank@i-ryj3adbb ~]# ssh frank@FRANK-004 "mkdir .ssh;chmod 0700 .ssh"
[frank@i-ryj3adbb ~]# scp ~/.ssh/id_rsa.pub frank@FRANK-002:.ssh/id_rsa.pub
[frank@i-ryj3adbb ~]# scp ~/.ssh/id_rsa.pub frank@FRANK-003:.ssh/id_rsa.pub
[frank@i-ryj3adbb ~]# scp ~/.ssh/id_rsa.pub frank@FRANK-004:.ssh/id_rsa.pub


我们生成公钥密钥后,远程在FRANK-002的frank主目录下新建了一个.ssh文件夹,赋予700权限,同时把本地生成的公钥传到FRANK-002的frank用户对应的目录下。

然后转到FRANK-002服务器上操作,新建authorized_keys认证文件,赋予600权限,同时把传来的公钥内容导入。

[frank@i-ryj3adbb ~]# ssh root@FRANK-002
[frank@i-cfcz6gzp ~]# touch ~/.ssh/authorized_keys
[frank@i-cfcz6gzp ~]# chmod 600 ~/.ssh/authorized_keys
[frank@i-cfcz6gzp ~]# cat ~/.ssh/id_rsa.pub  >> ~/.ssh/authorized_keys


这里注意是>>,会保留原来的内容,如果用>,就覆盖了以前的。一个建议是,可以把id_rsa在每次复制过去时改个名字,免得混淆。

再切换回去,发现可以不需要密码就能登录FRANK-002,其他机器类似。

3.所有服务器上java的安装和环境变量配置

安装方法见《【Hadoop系列】第二章:安装Hadoop(上)单机版Hadoop

关于java安装包如何发给只有内网的服务器,可以用上面免密码登录中公钥如何传送的得到启发,不赘述了(scp命令)。

我的java安装在/usr/java/jdk1.8.0_45/

环境变量的配置

编辑/etc/profile

·在profile文件末尾加入:

export JAVA_HOME=/usr/java/jdk1.8.0_45/

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录

·注解

a. 你要将/usr/java/jdk1.8.0_45/改为你的jdk安装目录

b. linux下用冒号“:”来分隔路径

c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值,在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种,常见的错误。

d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。

e. export是把这三个变量导出为全局变量。

f. 大小写必须严格区分。

4.在主节点上安装hadoop和配置

我们hadoop安装包是hadoop-2.6.0-cdh5.4.4.tar.gz,CDH版,各自版本应该都是一样,注意我们用的不是源码。放在/home/frank/hadoop/文件夹下

使用frank用户(这个很重要,否则文件的所有人就不是frank了)解压,修改其中的配置文件。详细步骤和命令可以参考《【Hadoop系列】第二章:安装Hadoop(上)单机版Hadoop》。

我们修改配置文件

首先是hadoop-env.sh中配置好java环境,添加export JAVA_HOME=/usr/java/jdk1.8.0_45/,虽然已经配置了环境变量,可以不需要这个配置,但是我遇到过出错的,这样配置一下比较保险。

0.hadoop-env.sh

添加export JAVA_HOME=/usr/java/jdk1.8.0_45/

1.core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://FRANK-001:8020</value>
</property>
</configuration>


2.hdfs-site.xml

<configuration>

<property>
<name>dfs.nameservices</name>
<value>hadoop-test</value>
<description>
Comma-separated list of nameservices.
</description>
</property>

<property>
<name>dfs.ha.namenodes.hadoop-test</name>
<value>nn1,nn2</value>
<description>
The prefix for a given nameservice, contains a comma-separated
list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE).
</description>
</property>

<property>
<name>dfs.namenode.rpc-address.hadoop-test.nn1</name>
<value>FRANK-001:8020</value>
<description>
RPC address for nomenode1 of hadoop-test
</description>
</property>

<property>
<name>dfs.namenode.rpc-address.hadoop-test.nn2</name>
<value>FRANK-002:8020</value>
<description>
RPC address for nomenode2 of hadoop-test
</description>
</property>

<property>
<name>dfs.namenode.http-address.hadoop-test.nn1</name>
<value>FRANK-001:50070</value>
<description>
The address and the base port where the dfs namenode1 web ui will listen on.
</description>
</property>

<property>
<name>dfs.namenode.http-address.hadoop-test.nn2</name>
<value>FRANK-002:50070</value>
<description>
The address and the base port where the dfs namenode2 web ui will listen on.
</description>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/frank/hadoop/hdfs/name</value>
<description>Determines where on the local filesystem the DFS name node
should store the name table(fsimage).  If this is a comma-delimited list
of directories then the name table is replicated in all of the
directories, for redundancy. </description>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://FRANK-002:8485;FRANK-003:8485;FRANK-004:8485/hadoop-test</value>
<description>A directory on shared storage between the multiple namenodes
in an HA cluster. This directory will be written by the active and read
by the standby in order to keep the namespaces synchronized. This directory
does not need to be listed in dfs.namenode.edits.dir above. It should be
left empty in a non-HA cluster.
</description>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/frank/hadoop/hdfs/data</value>
<description>Determines where on the local filesystem an DFS data node
should store its blocks.  If this is a comma-delimited
list of directories, then data will be stored in all named
directories, typically on different devices.
Directories that do not exist are ignored.
</description>
</property>

<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>false</value>
<description>
Whether automatic failover is enabled. See the HDFS High
Availability documentation for details on automatic HA
configuration.
</description>
</property>

<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/frank/hadoop/hdfs/journal/</value>
</property>

</configuration>


3.mapred-site.xml

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>The runtime framework for executing MapReduce jobs.
Can be one of local, classic or yarn.
</description>
</property>

<!-- jobhistory properties -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>FRANK-002:10020</value>
<description>MapReduce JobHistory Server IPC host:port</description>
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>FRANK-002:19888</value>
<description>MapReduce JobHistory Server Web UI host:port</description>
</property>

</configuration>


4.yarn-site.xml

<configuration>

<!-- Resource Manager Configs -->
<property>
<description>The hostname of the RM.</description>
<name>yarn.resourcemanager.hostname</name>
<value>FRANK-001</value>
</property>

<property>
<description>The address of the applications manager interface in the RM.</description>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>

<property>
<description>The address of the scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>

<property>
<description>The http address of the RM web application.</description>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>

<property>
<description>The https adddress of the RM web application.</description>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>

<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>

<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<property>
<description>fair-scheduler conf location</description>
<name>yarn.scheduler.fair.allocation.file</name>
<value>${yarn.home.dir}/etc/hadoop/fairscheduler.xml</value>
</property>

<property>
<description>List of directories to store localized files in. An
application's localized file directory will be found in:
${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}.
Individual containers' work directories, called container_${contid}, will
be subdirectories of this.
</description>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/frank/hadoop/yarn/local</value>
</property>

<property>
<description>Whether to enable log aggregation</description>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<property>
<description>Where to aggregate logs to.</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
</property>

<property>
<description>Amount of physical memory, in MB, that can be allocated
for containers.</description>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4000</value>
</property>

<property>
<description>Number of CPU cores that can be allocated
for containers.</description>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>

<property>
<description>the valid service name should only contain a-zA-Z0-9_ and can not start with numbers</description>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

</configuration>


5.slaves

FRANK-002
FRANK-003
FRANK-004


6.fairscheduler.xml

<allocations>

<queue name="infrastructure">
<minResources>1024 mb, 1 vcores </minResources>
<maxResources>153600 mb, 100 vcores </maxResources>
<maxRunningApps>200</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>1.0</weight>
<aclSubmitApps>root,yarn,search,hdfs</aclSubmitApps>
</queue>

<queue name="tool">
<minResources>1024 mb, 1 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

<queue name="sentiment">
<minResources>1024 mb, 1 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

</allocations>


这个里面配置的最小的资源,最大的资源等等。<minResources>1024 mb, 1 vcores </minResources>这个原来应该是 <minResources>102400 mb, 50 vcores </minResources>表示10G内存,50个核,不过我服务器加起来就4个cpu,4G内存,所以改的小了。对这个数据的配置我也没有很好的理解。

5.其他服务器的配置

我们先保证hadoop的所有路径都是属于frank用户。

进入/home/frank,用root用户执行

[root@i-cfcz6gzp frank]# chown -R frank.frank hadoop


接下来将所有的hadoop文件拷贝到其他服务器

使用frank用户

scp -r ~/hadoop/* frank@FRANK-002:.hadoop/


拷贝过去后,一样的要将所有权改为frank用户。

下面的步骤都是在hadoop的主目录下进行的/home/hadoop/hadoop-2.6.0-cdh5.4.4

6.启动journalnode服务

在各个JournalNode节点上,输入以下命令启动journalnode服务:

[frank@i-cfcz6gzp hadoop-2.6.0-cdh5.4.4]$ sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /home/frank/hadoop/hadoop-2.6.0-cdh5.4.4/logs/hadoop-frank-journalnode-i-cfcz6gzp.out
[frank@i-cfcz6gzp hadoop-2.6.0-cdh5.4.4]$ jps
11233 Jps
11158 JournalNode
这里就是FRANK-002,FRANK-003,FRANK-004这三个服务器了

7.启动namenode

在[nn1]上,也就是FRANK-001,对其进行格式化,并启动:

[frank@i-ryj3adbb hadoop-2.6.0-cdh5.4.4]$ bin/hdfs namenode -format
[frank@i-ryj3adbb hadoop-2.6.0-cdh5.4.4]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /home/frank/hadoop/hadoop-2.6.0-cdh5.4.4/logs/hadoop-frank-namenode-i-ryj3adbb.out
[frank@i-ryj3adbb hadoop-2.6.0-cdh5.4.4]$ jps
1632 Jps
1560 NameNode


8.启动standby namenode

在[nn2]上,也就是FRANK-002,同步nn1的元数据信息:

[frank@i-03a6bhpc hadoop-2.6.0-cdh5.4.4]$ bin/hdfs namenode -bootstrapStandby

启动nn2,

[frank@i-03a6bhpc hadoop-2.6.0-cdh5.4.4]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /home/frank/hadoop/hadoop-2.6.0-cdh5.4.4/logs/hadoop-frank-namenode-i-03a6bhpc.out
[frank@i-03a6bhpc hadoop-2.6.0-cdh5.4.4]$ jps
16646 NameNode
10152 JournalNode
16719 Jps


9.激活nn1

经过以上四步操作,nn1和nn2均处理standby状态

将[nn1]切换为Active

[frank@i-ryj3adbb hadoop-2.6.0-cdh5.4.4]$ bin/hdfs haadmin -transitionToActive nn1


10.在[nn1]上,启动所有datanode

sbin/hadoop-daemons.sh start datanode


11.启动yarn

sbin/start-yarn.sh
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: