从0开始打造Hadoop生态

一、系统架构

我们假设只有三台服务器,并且要在三台服务器上做高可用。

服务 服务器1 服务器2 服务器3
NameNode Δ
DataNode
JournalNode
ResourceManager
NodeManager
Zookeeper
ZKFC
HMaster Δ
HRegionServer

二、环境配置

我们需要把系统要安装之前的东西配置一下。

2.1、主机命名

我们分别把三台服务器命名为hadoop1, hadoop2, hadoop3。并在hosts中加上ip到主机名的映射。

192.168.13.81 hadoop1
192.168.13.82 hadoop2
192.168.13.83 hadoop3

2.2、Java环境

我们的java环境如下

[root@hadoop1 user]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

2.3、免密登录

三台机子生成自己的私钥,并且发到自己和其余两台的服务器上

ssh-keygen -t rsa
ssh-copy-id ip

三、软件下载

我们按照如下方式选择版本

  • Hadoop 选择2.8.5版本
  • Zookeeper 选择了3.4.10版本
  • HBase 选择了 2.2.0版本,Hbase官网可以查询你需要的版本

四、Hadoop配置

我们选择一个目录进行整个hadoop的安装,假设它是/home/user

4.1、hadoop-env.sh

export JAVA_HOME=/usr

4.2、core-site.xml

这个ns可以理解我们定义的一个变量,你也可以叫其他的

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/user/dir_hadoop2</value>
        <description>A base for other temporary directories.</description>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>16384</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
</configuration>

4.3、hdfs-site.xml

<configuration>
        <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
        <property>
                <name>dfs.nameservices</name>
                <value>ns</value>
        </property>
        <!-- ns下面有两个NameNode,分别是nn1,nn2 -->
        <property>
                <name>dfs.ha.namenodes.ns</name>
                <value>nn1, nn2</value>
        </property>
        <!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns.nn1</name>
                <value>hadoop1:9000</value>
        </property>
        <!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns.nn1</name>
                <value>hadoop1:50070</value>
        </property>
        <!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns.nn2</name>
                <value>hadoop2:9000</value>
        </property>
        <!-- nn2的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns.nn2</name>
                <value>hadoop2:50070</value>
        </property>
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value>
        </property>
        <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/user/journal_hadoop2</value>
        </property>
        <!-- 开启NameNode失败自动切换 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <!-- 配置失败自动切换实现方式 -->
        <property>
                <name>dfs.client.failover.proxy.provider.ns</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行,脑裂时通过ssh登录杀掉old-active,并将standby切换为active -->
        <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>
        <!--设置副本数为2 -->
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
</configuration>

4.4、mapred-site.xml

需要注意的是 如果内存太小了,MP任务可能会一直报错

<configuration> 
     <!-- 指定mr框架为yarn方式 --> 
     <property> 
       <name>mapreduce.framework.name</name> 
       <value>yarn</value> 
     </property> 
     <!--map任务内存大小,默认1G--> 
     <property> 
       <name>mapreduce.map.memory.mb</name> 
       <value>1024</value> 
     </property> 
     <!--reduce任务内存大小,默认1G--> 
     <property> 
       <name>mapreduce.reduce.memory.mb</name> 
       <value>1024</value> 
     </property> 
     <!--MR AppMaster运行需要内存,默认1536M--> 
     <property> 
        <name>yarn.app.mapreduce.am.resource.mb</name> 
        <value>460</value> 
     </property> 
     <!--MR AppMaster运行的JVM进程内存,默认-Xmx1024m--> 
     <property> 
        <name>yarn.app.mapreduce.am.command-opts</name> 
        <value>-Xmx368m</value> 
     </property> 
</configuration>

4.5、 yarn-site.xml

需要注意的是 如果内存太小了,MP任务可能会一直报错

<configuration>
<!-- Site specific YARN configuration properties -->
        <!-- 分别指定RM的地址 -->
        <property>
           <name>yarn.resourcemanager.hostname</name>
           <value>hadoop3</value>
        </property>
        <!-- 指定zk集群地址 -->
        <property>
           <name>yarn.resourcemanager.zk-address</name>
           <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
        </property>
        <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
        </property>
        <!--RM中分配容器的内存最小值,默认1G-->
        <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>1024</value>
        </property>
        <!--RM中分配容器的内存最大值,默认8G-->
         <property>
            <name>yarn.scheduler.maximum-allocation-mb</name>
            <value>2048</value>
        </property>
        <!--可用物理内存大小,默认8G-->
        <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>2048</value>
        </property>
        <!--虚拟内存检查是否开始-->
        <property>
            <name>yarn.nodemanager.vmem-check-enabled</name>
            <value>false</value>
        </property>
</configuration>

4.6、slaves

配置的地方在etc/hadoop/slaves

hadoop1 
hadoop2 
hadoop3

4.7、zookeeper

首先重命名zoo_sample.cfg文件为zoo.cfg,然后对它进行修改,修改后的样子大约是这样的

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/user/zoodata
dataLogDir=/home/user/zoodatalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#quorumListenOnAllIPs=true
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

但是如果使用的是公网IP的时候,注意把本机配置为0.0.0.0。假设我们现在在hadoop1节点上,且使用的是公网IP,则应该如下配置

#末尾添加
server.1=0.0.0.0:2888:3888
server.2=165.227.133.86:2888:3888
server.3=159.65.120.185:2888:3888

然后我们手动创建zoodata和zoodatalog文件夹,并在每台zoo服务器的文件夹里面创建一个文件,以此输入1、2、3。
这个1,2,3对应的是上面server.1=hadoop1:2888:3888中的1、2、3
你可以vim创建,或者使用echo 1 > myid

五、HBase配置

HBase的软件是一个单独的文件夹

5.1、hbase-env.sh

第二个配置是并行GC的配置,数字根据你的线程数设置

export JAVA_HOME=/usr
export HBASE_OPTS="$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=20"
export HBASE_MANAGES_ZK=true

5.2、 hbase-site.xml

<configuration> 
  <property> 
    <name>hbase.rootdir</name> 
    <value>hdfs:///ns/hbase</value> 
  </property> 
  <property> 
    <name>hbase.zookeeper.property.dataDir</name> 
    <value>/home/user/zoodata</value> 
  </property> 
  <property>   
    <name>hbase.cluster.distributed</name>   
    <value>true</value>   
  </property> 
  <property> 
    <name>hbase.master</name> 
    <value>hdfs://hadoop1:60000</value> 
  </property> 
  <property> 
    <name>hbase.master.info.port</name> 
    <value>60010</value> 
  </property> 
  <property>     
    <name>hbase.zookeeper.property.clientPort</name>     
    <value>2181</value>     
  </property>   
  <property>   
    <name>hbase.zookeeper.quorum</name>   
    <value>hadoop1,hadoop2,hadoop3</value>   
  </property> 
</configuration>

完成配置后,记得把core-site.xmlhdfs -site.xml的软链接链到这个目录下面,否则无法识别ns。

5.3、conf/regionservers

hadoop1
hadoop2
hadoop3

六、复制

把除了myid以外其它东西复制到另外两台服务器。可以直接使用scp复制

七、服务启动

7.1、Zookeeper

在三台服务器

zkServer.sh start

启动之后检查启动是否正常

[root@hadoop1 user]# zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/user/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

如果不正常,检查一下防火墙有没有问题。防火墙一定要关闭。

7.2、HDFS

  • 在hadoop1执行hadoop-daemons.sh start journalnode
  • 在hadoop1上格式化HDFS hdfs namenode -format。格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,在这里是存在 /home/user/dir_hadoop2 的目录下。然后将这个文件用scp拷贝到你备用namenode服务器的/home/user/dir_hadoop2 目录下。
  • 在hadoop1上格式化ZKhdfs zkfc -formatZK
  • 在hadoop1上hdfs zkfc -formatZK
  • 在hadoop1上启动HDFS start-dfs.sh
  • 在hadoop3上启动Yarn start-yarn.sh
  • 在hadoop1上启动HBase hbase-2.2.0/bin/start-hbase.sh

八、验证服务

[root@hadoop1 user]# jps
2464 NodeManager
16417 HQuorumPeer
20065 Jps
32066 NameNode
32180 DataNode
18470 HMaster
18589 HRegionServer
32383 JournalNode

运行一下hadoop提供的demo中的WordCount程序:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input out

九、关闭服务

https://blog.csdn.net/u011414200/article/details/50437356

参考链接:https://www.cnblogs.com/luhaojie/p/9236839.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容