1. 程式人生 > >Hadoop-HA模式(詳解)

Hadoop-HA模式(詳解)

一、概述

之前的部落格寫了搭建hadoop叢集環境,今天寫一寫搭建高可用(HA)環境。Hadoop-HA模式大致分為兩個(個人在學習中的理解):

  • namenode 高可用
  • yarn 高可用

1、Namenode HA

這裡寫圖片描述

Namenode在HDFS中是一個非常重要的元件,相當於HDFS檔案系統的心臟,在顯示分散式叢集環境中,還是會有可能出現Namenode的崩潰或各種意外。所以,高可用模式就體現出作用了。
namenode HA配置大概流程(個人理解):

  • 在啟動namenode之前,需要啟動hadoop2.x中新引入的(QJM)Quorum Journal Manager,QJM主要用來管理namenode之間的資料同步,當active namenode資料更新時會傳遞給QJM,QJM在所有的namenode之間同步,最後QJM將active namenode 更新的資料同步到了standby namenode中。
  • 啟動多個namenode時,並配置namenode的主機地址,還要配置隔離機制,因為容易出現SB(split-brain)狀況,所謂的sb狀況意思就是當多個namenode正常狀態時,一臺active,多臺standby。如果某段時間因為網路等非namenode自身關係導致namenode間交流阻斷了,這樣容易出現多臺active的裝置,容易搶佔資源等。
  • 引入zookeeper來對namenode進行監聽,因為在一般情況下,active 的namenode崩潰了的話,需要人工切換standby Namenode為active。非常不人性化。通過zookeeper可以監聽多個namenode,當active namenode崩潰的話,zookeeper監聽到後馬上通知zookeeper的leader進行主備選舉,在standby namenode中選舉出一臺,並將它置為active模式替換崩潰的namenode。

2、Yarn HA

這裡寫圖片描述
Yarn HA 的作用我認為和Namenode HA差不多,都是用來防止心臟元件出意外導致整個叢集崩潰。
Yarn HA 配置大概流程(個人理解):

  • 通過在yarn-site.xml中配置對zookeeper的支援後,在ResourceManager啟動的時候,Active ResourceManager會將自己的狀態資訊寫入到zookeeper叢集中。
  • 啟動其他的ResourceManager後,都會在standby狀態。
  • 當active ResourceManager 意外停止時,zookeeper就會選舉出一個standby 狀態的ResourceManager,然後將原來ResourceManager的狀態資訊寫入到standby ResourceManager中,最後將standby ResourceManager置為active狀態,完成了主備切換。

二、Namenode HA 搭建

在之前的部落格中,Hadoop分散式環境搭建有教程,zookeeper叢集搭建也有教程,這裡是在這兩個要求的前提下進行的。

1、配置檔案的修改

   觀看官方文件的說明:點選

QJM(Quorum Journal Manager)配置
這裡寫圖片描述
修改hdfs-site.xml:

    <!-- 完全分散式叢集名稱 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <!-- 叢集中NameNode節點名稱 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- nn1的RPC通訊地址 -->
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>machine1.example.com:8020</value>
    </property>
    <!-- nn2的RPC通訊地址 -->
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>machine2.example.com:8020</value>
    </property>
    <!-- nn1的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>machine2.example.com:50070</value>
    </property>

    <!-- nn2的http通訊地址 -->
    <property>
          <name>dfs.namenode.http-address.mycluster.nn2</name>
          <value>machine2.example.com:50070</value>
    </property>
    <!-- 指定NameNode元資料在JournalNode上的存放位置 -->
    <property>
          <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
    </property>
    <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
    <property>
          <name>dfs.client.failover.proxy.provider.mycluster</name>
          <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 -->
    <property>
          <name>dfs.ha.fencing.methods</name>
          <value>sshfence</value>
    </property>
    <!-- 使用隔離機制時需要ssh無祕鑰登入-->
    <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/home/exampleuser/.ssh/id_rsa</value>
    </property>
    <!-- 宣告journalnode伺服器儲存目錄-->
    <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/path/to/journal/node/local/data</value>
    </property>
    <!-- 關閉許可權檢查-->
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>

修改core-site.xml:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.6.5/data</value>
    </property>

Automatic Failover(自動主備切換)配置
hdfs-site.xml新增:

    !<--開啟Automatic Failover模式-->
    <property>
           <name>dfs.ha.automatic-failover.enabled</name>
           <value>true</value>
     </property>

core-site.xml新增:

    !<--zookeeper叢集地址-->
    <property>
       <name>ha.zookeeper.quorum</name>
       <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
     </property>

將配置檔案分發到三臺裝置上!

2、啟動測試

叢集框架如圖:
這裡寫圖片描述
上面是看官網修改的配置,我先貼出自己的和之前寫的部落格不同配置的幾個檔案:
core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>
        <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/opt/module/hadoop-2.6.5/data/tmp</value>
        </property>
        <property>
                 <name>fs.trash.interval</name>
                 <value>2</value>
        </property>
        <property>
                <name>fs.trash.checkpoint.interval</name>
                <value>1</value>
        </property>
        <property>
                <name>hadoop.http.staticuser.user</name>
                <value>root</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
         </property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <!-- 完全分散式叢集名稱 -->
        <property>
                <name>dfs.nameservices</name>
                <value>mycluster</value>
        </property>
        <!-- 叢集中NameNode節點都有哪些 -->
        <property>
                <name>dfs.ha.namenodes.mycluster</name>
                <value>nn1,nn2</value>
        </property>
        <!-- nn1的RPC通訊地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                <value>hadoop001:8020</value>
        </property>
        <!-- nn2的RPC通訊地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>hadoop003:8020</value>
        </property>
        <!-- nn1的http通訊地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>hadoop001:50070</value>
        </property>

        <!-- nn2的http通訊地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn2</name>
                <value>hadoop003:50070</value>
        </property>
        <!-- 指定NameNode元資料在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
        </property>
        <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
        </property>
        <!-- 使用隔離機制時需要ssh無祕鑰登入-->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
        </property>
        <!-- 宣告journalnode伺服器儲存目錄-->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/opt/module/hadoop-2.6.5/data/jn</value>
        </property>
        <!-- 關閉許可權檢查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>
        <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
        <property>
                <name>dfs.client.failover.proxy.provider.mycluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <!-- automatic failover-->
        <property>
                 <name>dfs.ha.automatic-failover.enabled</name>
                 <value>true</value>
         </property>
</configuration>

啟動步驟:

  • 首先啟動zookeeper叢集。
#先啟動三臺zookeeper叢集:
[root@hadoop001 bin]# pwd
/opt/module/zookeeper-3.4.10/bin
[root@hadoop001 bin]# ./zkServer.sh start

[root@hadoop002 bin]# pwd
/opt/module/zookeeper-3.4.10/bin
[root@hadoop002 bin]# ./zkServer.sh start

[root@hadoop003 bin]# pwd
/opt/module/zookeeper-3.4.10/bin
[root@hadoop003 bin]# ./zkServer.sh start

#分別檢視三臺狀態
[root@hadoop001 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

[root@hadoop002 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader

[root@hadoop003 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

# 啟動成功
  • 啟動QJM,
[root@hadoop001 hadoop-2.6.5]# sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-journalnode-hadoop001.out
[root@hadoop001 hadoop-2.6.5]# jps
5873 JournalNode
5511 QuorumPeerMain
5911 Jps

[root@hadoop003 hadoop-2.6.5]# sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-journalnode-hadoop003.out
[root@hadoop003 hadoop-2.6.5]# jps
5344 JournalNode
5382 Jps
5021 QuorumPeerMain
  • 格式化NameNode並啟動,也是隻需要啟動hadoop001和hadoop003(注意:先格式化一臺namenode,然後另一臺namenode同步第一臺namenode,如果兩臺都格式化就會有問題)
# 第一個namenode格式化
[root@hadoop001 hadoop-2.6.5]# bin/hdfs namenode -format

# 格式化之後啟動namenode
[root@hadoop001 hadoop-2.6.5]# sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-namenode-hadoop001.out
[root@hadoop001 hadoop-2.6.5]# jps
5511 QuorumPeerMain
7000 Jps
6591 JournalNode
6895 NameNode

# 第二個namenode同步第一個
[root@hadoop003 hadoop-2.6.5]# bin/hdfs namenode -bootstrapStandby

# 啟動第二個namenode
[root@hadoop003 hadoop-2.6.5]# sbin/hadoop-daemon.sh start namenode
  • 檢視namenode(如下圖,都啟動成功,只是都在standby狀態)
    這裡寫圖片描述
    這裡寫圖片描述
  • 手動切換nn1為啟用狀態
[[email protected] hadoop-2.6.5]# bin/hdfs haadmin -transitionToActive nn1
Automatic failover is enabled for NameNode at hadoop003/192.168.170.133:8020
Refusing to manually manage HA state, since it may cause
a split-brain scenario or other incorrect state.
If you are very sure you know what you are doing, please 
specify the forcemanual flag.
# 這裡需要強制切換

[[email protected] hadoop-2.6.5]# bin/hdfs haadmin -transitionToActive --forcemanual nn1
You have specified the forcemanual flag. This flag is dangerous, as it can induce a split-brain scenario that WILL CORRUPT your HDFS namespace, possibly irrecoverably.

It is recommended not to use this flag, but instead to shut down the cluster and disable automatic failover if you prefer to manually manage your HA state.

You may abort safely by answering 'n' or hitting ^C now.

Are you sure you want to continue? (Y or N) y
18/08/21 16:12:59 WARN ha.HAAdmin: Proceeding with manual HA state management even though
automatic failover is enabled for NameNode at hadoop003/192.168.170.133:8020
18/08/21 16:13:00 WARN ha.HAAdmin: Proceeding with manual HA state management even though
automatic failover is enabled for NameNode at hadoop001/192.168.170.131:8020

# 可以看到nn2已經啟用,nn1在standby狀態
[[email protected] hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn1
standby
[[email protected] hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn2
active
  • 在zookeeper上配置故障自動轉移節點
[root@hadoop001 hadoop-2.6.5]# bin/hdfs zkfc -formatZK
[zk: localhost:2181(CONNECTED) 5] ls /
[zookeeper, hadoop-ha]
# 可以看到zookeeper上已經有了hadoop-ha節點了
  • 啟動叢集
[[email protected] hadoop-2.6.5]# sbin/start-dfs.sh
Starting namenodes on [hadoop001 hadoop003]
hadoop001: namenode running as process 6895. Stop it first.
hadoop003: namenode running as process 6103. Stop it first.
hadoop003: starting datanode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-datanode-hadoop003.out
hadoop001: starting datanode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-datanode-hadoop001.out
hadoop002: starting datanode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-datanode-hadoop002.out
Starting journal nodes [hadoop001 hadoop002 hadoop003]
hadoop001: journalnode running as process 6591. Stop it first.
hadoop003: journalnode running as process 5814. Stop it first.
hadoop002: journalnode running as process 5450. Stop it first.
Starting ZK Failover Controllers on NN hosts [hadoop001 hadoop003]
hadoop001: starting zkfc, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-zkfc-hadoop001.out
hadoop003: starting zkfc, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-zkfc-hadoop003.out
[[email protected] hadoop-2.6.5]# jps
8114 DFSZKFailoverController
7478 ZooKeeperMain
5511 QuorumPeerMain
8169 Jps
7803 DataNode
6591 JournalNode
6895 NameNode
# 在三臺裝置上分別jps一下,都啟動了
  • 接下來kill掉一個nn1,看看zookeeper是否會自動切換nn2
[root@hadoop003 hadoop-2.6.5]# jps
6708 DFSZKFailoverController
6549 DataNode
5814 JournalNode
6103 NameNode
6825 Jps
5021 QuorumPeerMain

# 殺掉namenode程序
[root@hadoop003 hadoop-2.6.5]# kill -9 6103

#檢視nn2狀態,連線不上了
[root@hadoop003 hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn2
18/08/21 16:28:52 INFO ipc.Client: Retrying connect to server: hadoop003/192.168.170.133:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hadoop003/192.168.170.133 to hadoop003:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

# 檢視nn1狀態,已經激活了
[root@hadoop003 hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn1
active

#重新啟動同步nn1,並啟動nn2
[root@hadoop003 hadoop-2.6.5]# bin/hdfs namenode -bootstrapStandby
[root@hadoop003 hadoop-2.6.5]# sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.6.5/logs/hadoop-root-namenode-hadoop003.out
[root@hadoop003 hadoop-2.6.5]# jps
7169 Jps
6708 DFSZKFailoverController
6549 DataNode
5814 JournalNode
7084 NameNode
5021 QuorumPeerMain

# 接下來殺掉nn1,看看會不會自動啟用nn2
[root@hadoop001 hadoop-2.6.5]# jps
8114 DFSZKFailoverController
8418 Jps
7478 ZooKeeperMain
5511 QuorumPeerMain
7803 DataNode
6591 JournalNode
6895 NameNode
[root@hadoop001 hadoop-2.6.5]# kill -9 6895
[root@hadoop001 hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn1
18/08/21 16:32:11 INFO ipc.Client: Retrying connect to server: hadoop001/192.168.170.131:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hadoop001/192.168.170.131 to hadoop001:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
[root@hadoop001 hadoop-2.6.5]# bin/hdfs haadmin -getServiceState nn2
active

NameNode-HA搭建完成!

三、Yarn HA 搭建

檢視apache官方文件:
這裡寫圖片描述

1、配置檔案的修改

修改yarn-site.xml:

 <!--啟用resourcemanager ha-->
 <property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
 </property>
 <!--宣告兩臺resourcemanager的地址-->
 <property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>cluster1</value>
 </property>
 <property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>master1</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>master2</value>
 </property>
 <!--指定zookeeper叢集的地址-->
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>zk1:2181,zk2:2181,zk3:2181</value>
 </property>

將配置檔案分發到3臺伺服器上!

2.啟動測試

我把我這次修改的yarn-site.xml發出來:

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <!--日誌聚合-->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
        <!--任務歷史服務-->
        <property>
                <name>yarn.log.server.url</name>
                <value>http://hadoop001:19888/jobhistory/logs/</value>
        </property>

        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>86400</value>
        </property>

        <!--啟用resourcemanager ha-->
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>

        <!--宣告兩臺resourcemanager的地址-->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>cluster-yarn1</value>
        </property>

        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>

        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>hadoop002</value>
        </property>

        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>hadoop003</value>
        </property>

        <!--指定zookeeper叢集的地址-->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
        </property>

        <!--啟用自動恢復-->
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>

        <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集-->
        <property>
                <name>yarn.resourcemanager.store.class</name>     
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
</configuration>
  • 啟動yarn,由於hadoop002是resourceManager,所以在hadoop002上啟動
[root@hadoop002 hadoop-2.6.5]# sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/module/hadoop-2.6.5/logs/yarn-root-resourcemanager-hadoop002.out
hadoop002: starting nodemanager, logging to /opt/module/hadoop-2.6.5/logs/yarn-root-nodemanager-hadoop002.
            
           

相關推薦

Hadoop-HA模式

一、概述 之前的部落格寫了搭建hadoop叢集環境,今天寫一寫搭建高可用(HA)環境。Hadoop-HA模式大致分為兩個(個人在學習中的理解): namenode 高可用 yarn 高可用 1、Namenode HA Namenode在HDFS中

android開發學習 ------- 【轉】 android中的單例模式

lan post tail -- and 使用 href details android開發 https://blog.csdn.net/u011418943/article/details/60139644 這篇文章 前因後果 都說出來了 ,值得學習。 htt

單例模式

@override ring 我們 真的 情況 改進 port 共享 volatil 餓漢模式public class HungryMode { private static HungryMode hm = new HungryMode();

單例設計模式

靜態 對象 div oid 技術 bubuko 使用 方法 類型變量 單例設計模式 模式:模式就是解決一類問題的固定步驟 單例設計模式:保證一個類在內存中只有一個對象 舉例:多個瀏覽器向服務器發送請求,只創建一個servlet對象處理相應的請求,而不是每接收一個

設計模式 - 單例模式看看和你理解的是否一樣?

一、概述 單例模式是設計模式中相對簡單且非常常見的一種設計模式,但是同時也是非常經典的高頻面試題,相信還是有很多人在面試時會掛在這裡。本篇文章主要針對單例模式做一個回顧,記錄單例模式的應用場景、常見寫法、針對執行緒安全進行除錯(看得見的執行緒)以及總結。相信大家看完這篇文章之後,對單例模式有一個非常深刻的認識

大前端完整學習路線

電子商務 backbone linu 請求響應 查詢 設置 lob 服務端 php 第一階段: HTML+CSS: HTML進階、CSS進階、div+css布局、HTML+css整站開發、 JavaScript基礎: Js基礎教程、js內置對象常用方法、常見DOM樹

CodeForces 407C 組合數學

class 這樣的 double type 合數 void 題解 如何 const 題面:   http://codeforces.com/problemset/problem/407/C   一句話題意:給一個長度為n的序列g,m次操作,每次操作(l,r,k)表示將g

Shell編程之變量

export oca shel overruns 當我 nbsp 正則表達式 通過 onf 一、什麽是變量 在我們上學時,我們就接觸數據方程式;例如:已知x=1 y=x+1 那麽y等於多少,我們毫不猶豫的會算出來2,但是在shell中x就是變量名,那麽對應的1就是變量值,在

樸素貝葉斯文本分類

詞向量 列表 出現 下標 put The 標註 問題 else from numpy import zeros,array from math import log def loadDataSet(): #詞條切分後的文檔集合,列表每一行代表一個email p

HTTP 協議

發出 響應 傳輸協議 nbsp 一個 idt 求和 height TE HTTP協議簡介:HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於萬維網(www.world wide web) 服務器與本地瀏覽器之間傳輸文本的傳

Hibernate框架環境搭建

obj 模型 junit demo 半成品 src 數據表 mys 種類 具體說hibernate框架的項目搭建之前,首先說一下什麽是框架。。。 框架可以理解成一個半成品的項目,它封裝了一些功能,我麽需要掌握的是如何駕馭這些功能,不需要操心它是怎麽實現的。其實他

如何使用拓展歐幾裏得算法求解模線性方程組

得出 bsp 次方 及其 根據 約數 www 求解 回退   式子a≡b(mod n)稱為a和b關於模n同余,它的充要條件是a-b是n的整數倍,即a-b=zn(其中z取整數)。 而模線性方程組ax≡b(mod n)可以寫成ax-b=zn(其中z取整數),移項可得 ax-zn

Unity色子的投擲與點數的獲得

input 說了 unity sde posit vector tran 由於 ima 前幾天需要一個色子的投擲並且獲得朝上點數的Unity腳本,在網上找了很多,都是一個模子刻出來的。 對於2018版的我來說,網上找的都是很早就棄用了的老版本。 好不容易能運行了,結果並不理

約瑟夫環問題的兩種解法

lang 方式 第一次 stat 位置 code 模擬 mod 想要 約瑟夫環問題的兩種解法(詳解) 題目: Josephus有過的故事:39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓。於是決定了自殺方式,41個人排成一個

Centos7.2小白安裝全過程

安裝centos7 大內存 cee 環境 dvd term bfc 步驟 fad Centos7手動環境安裝步驟:萬事開頭難,全手動安裝今天抽空整理一下全手動安裝centos7.2,大神略過,僅供小白參考備註:虛擬機模擬安裝步驟 網絡:172.16.100.1IP:172.

專案中執行緒原來是這麼使用的

實現執行緒同步的幾種方式 1.同步方法 即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 程式碼如: public synchro

String基本型別原來是這麼使用的

首先說一下String類在哪一個包中? 答:java.lang包中。 在java中使用String類建立一個字串變數,字串變數屬於什麼? 答:物件。 關於在java中String類物件的建立: 字串的宣告方式:String stringName;(駝峰命名法)。 字串的建立:stringNa

Linux安裝ssh,原來這麼簡單就可以了

前提需要連線外網 1、首先要在烏班圖系統中,使用快捷鍵"Ctrl"+“Alt”+"T"開啟終端的快捷方式。 2、第一次設定root密碼命令為:“sudo passwd”,輸入自己想要設定的密碼。比如說(女友的生日) 3、設定完root密碼後,在確保連線外網的情況下輸入命令:“sudo

在伺服器中安裝jdk1.8版本的安裝,原來這麼簡單

因為在烏班圖的系統中由於只能註冊普通的使用者,不能註冊root使用者。 所以需要先把jdk-8u11-linux-x64.tar.gz的安裝包拷貝到普通使用者的許可權中去。 我們可以使用WinSCP視覺化工具直接對壓縮包進行拖拽到指定的目錄下,也可以使用Xshell工具使用命令列對檔

Linux下Mysql的安裝及執行

1、組及使用者建立: sudo groupadd mysql #新增組 sudo useradd -r -g mysql mysql #新增所建立組下的使用者 2、官方下載網址 wget http://downloads.mysql.com/archives/get/file/mysql-5