从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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容