posts - 495,  comments - 11,  trackbacks - 0
           

          > 原理

          其實斷點續(xù)傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。
          打個比方,瀏覽器請求服務(wù)器上的一個文時,所發(fā)出的請求如下:
          假設(shè)服務(wù)器域名為 wwww.sjtu.edu.cn,文件名為 down.zip。
          GET /down.zip HTTP/1.1
          Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
          excel, application/msword, application/vnd.ms-powerpoint, */*
          Accept-Language: zh-cn
          Accept-Encoding: gzip, deflate
          User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
          Connection: Keep-Alive

          服務(wù)器收到請求后,按要求尋找請求的文件,提取文件的信息,然后返回給瀏覽器,返回信息如下:

          200
          Content-Length=106786028
          Accept-Ranges=bytes
          Date=Mon, 30 Apr 2001 12:56:11 GMT
          ETag=W/"02ca57e173c11:95b"
          Content-Type=application/octet-stream
          Server=Microsoft-IIS/5.0
          Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

          所謂斷點續(xù)傳,也就是要從文件已經(jīng)下載的地方開始繼續(xù)下載。所以在客戶端瀏覽器傳給 Web 服務(wù)器的時候要多加一條信息 -- 從哪里開始。
          下面是用自己編的一個"瀏覽器"來傳遞請求信息給 Web 服務(wù)器,要求從 2000070 字節(jié)開始。
          GET /down.zip HTTP/1.0
          User-Agent: NetFox
          RANGE: bytes=2000070-
          Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

          仔細看一下就會發(fā)現(xiàn)多了一行 RANGE: bytes=2000070-
          這一行的意思就是告訴服務(wù)器 down.zip 這個文件從 2000070 字節(jié)開始傳,前面的字節(jié)不用傳了。
          服務(wù)器收到這個請求以后,返回的信息如下:
          206
          Content-Length=106786028
          Content-Range=bytes 2000070-106786027/106786028
          Date=Mon, 30 Apr 2001 12:55:20 GMT
          ETag=W/"02ca57e173c11:95b"
          Content-Type=application/octet-stream
          Server=Microsoft-IIS/5.0
          Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT

          和前面服務(wù)器返回的信息比較一下,就會發(fā)現(xiàn)增加了一行:
          Content-Range=bytes 2000070-106786027/106786028

          返回的代碼也改為 206 了,而不再是 200 了。

          > 關(guān)鍵點

          (1) 用什么方法實現(xiàn)提交 RANGE: bytes=2000070-。
          當(dāng)然用最原始的 Socket 是肯定能完成的,不過那樣太費事了,其實 Java 的 net 包中提供了這種功能。代碼如下:

          URL url = new URL("http://www.sjtu.edu.cn/down.zip");
          HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();

          // 設(shè)置 User-Agent
          httpConnection.setRequestProperty("User-Agent","NetFox");
          // 設(shè)置斷點續(xù)傳的開始位置
          httpConnection.setRequestProperty("RANGE","bytes=2000070");
          // 獲得輸入流
          InputStream input = httpConnection.getInputStream();

          從輸入流中取出的字節(jié)流就是 down.zip 文件從 2000070 開始的字節(jié)流。大家看,其實斷點續(xù)傳用 Java 實現(xiàn)起來還是很簡單的吧。接下來要做的事就是怎么保存獲得的流到文件中去了。

          (2)保存文件采用的方法。
          我采用的是 IO 包中的 RandAccessFile 類。
          操作相當(dāng)簡單,假設(shè)從 2000070 處開始保存文件,代碼如下:
          RandomAccess oSavedFile = new RandomAccessFile("down.zip","rw");
          long nPos = 2000070;
          // 定位文件指針到 nPos 位置
          oSavedFile.seek(nPos);
          byte[] b = new byte[1024];
          int nRead;
          // 從輸入流中讀入字節(jié)流,然后寫到文件中
          while((nRead=input.read(b,0,1024)) > 0) {
          ???? oSavedFile.write(b,0,nRead);

          }

          ?

          posted @ 2011-09-08 21:51 jadmin 閱讀(111) | 評論 (0)編輯 收藏

          SymmetricDS是一個平臺獨立的數(shù)據(jù)同步和復(fù)制的解決方案。

          配置數(shù)據(jù)模型:

          運行時數(shù)據(jù)模型:

          posted @ 2011-09-02 09:15 jadmin 閱讀(234) | 評論 (0)編輯 收藏

          > 問題:給40億個不重復(fù)的unsigned int的整數(shù),沒排過序的,然后再給幾個數(shù),如何快速判斷這幾個數(shù)是否在那40億個數(shù)當(dāng)中?

          > 解決:unsigned int 的取值范圍是0到2^32-1。我們可以申請連續(xù)的2^32/8=512M的內(nèi)存,用每一個bit對應(yīng)一個unsigned int數(shù)字。首先將512M內(nèi)存都初始化為0,然后每處理一個數(shù)字就將其對應(yīng)的bit設(shè)置為1。當(dāng)需要查詢時,直接找到對應(yīng)bit,看其值是0還是1即可。

          posted @ 2011-08-30 21:01 jadmin 閱讀(145) | 評論 (0)編輯 收藏

          lazy的屬性有false、true、extra

          false和true用得比較多,extra屬性是不大容易重視的,其實它和true差不多

          extra有個小的智能的地方是,即調(diào)用集合的size/contains等方法的時候,hibernate并不會去加載整個集合的數(shù)據(jù),而是發(fā)出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數(shù)據(jù)的時候,才去發(fā)出查詢語句加載所有對象的數(shù)據(jù)


          posted @ 2011-08-30 20:00 jadmin 閱讀(113) | 評論 (0)編輯 收藏

          本文將介紹在Linux(Red Hat 9)環(huán)境下搭建Hadoop集群,此Hadoop集群主要由三臺機器組成,主機名分別為
          linux????? 192.168.35.101
          linux02? 192.168.35.102
          linux03? 192.168.35.103

          從map reduce計算的角度講,linux作為master節(jié)點,linux02和linux03作為slave節(jié)點。
          從hdfs數(shù)據(jù)存儲角度講,linux作為namenode節(jié)點,linux02和linux03作為datanode節(jié)點。


          一臺namenode機,主機名為linux,hosts文件內(nèi)容如下:
          127.0.0.1?? ??? linux????????? localhost.localdomain????????? localhost
          192.168.35.101???? linux????????? linux.localdomain????????????? linux
          192.168.35.102???? linux02
          192.168.35.103???? linux03

          兩臺datanode機,主機名為linux02和linux03
          >linux02的hosts文件
          127.0.0.1 ??? ??? linux02?????? localhost.localdomain?????? localhost
          192.168.35.102???? linux02?????? linux02.localdomain???????? linux02
          192.168.35.101???? linux
          192.168.35.103???? linux03
          >inux03的hosts文件
          127.0.0.1?? ????? ??? ?linux03????????? localhost.localdomain????????? localhost
          192.168.35.103????????? linux03??????????? linux03.localdomain??????????? linux03
          192.168.35.101? ??? ?linux
          192.168.35.102? ??? ?linux02

          1.安裝JDK
          > 從java.cun.com下載jdk-6u7-linux-i586.bin

          > ftp上傳jdk到linux的root目錄下

          > 進入root目錄,先后執(zhí)行命令
          chmod 755 jdk-6u18-linux-i586-rpm.bin
          ./jdk-6u18-linux-i586-rpm.bin

          一路按提示下去就會安裝成功

          > 配置環(huán)境變量
          cd進入/etc目錄,vi編輯profile文件,將下面的內(nèi)容追加到文件末尾
          export JAVA_HOME=/usr/java/jdk1.6.0_18
          export PATH=$JAVA_HOME/bin:$PATH
          export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

          注意:三臺機器都要安裝JDK~

          2.設(shè)置Master/Slave機器之間可以通過SSH無密鑰互相訪問
          最好三臺機器的使用相同的賬戶名,我是直接使用的root賬戶

          操作namenode機linux:
          以用戶root登錄linux,在/root目錄下執(zhí)行下述命令:
          ssh-keygen -t rsa
          一路回車下去即可在目錄/root/.ssh/下建立兩個文件id_rsa.pub和id_rsa。

          接下來,需要進入/root/.ssh目錄,執(zhí)行如下命令:
          cd .ssh

          再把is_rsa.pub文件復(fù)制到linux02和linux03機器上去。
          scp -r id_rsa.pub root@192.168.35.102:/root/.ssh/authorized_keys_01
          scp -r id_rsa.pub root@192.168.35.103:/root/.ssh/authorized_keys_01

          操作datanode機linux02:
          以用戶root登錄linux02,在目錄下執(zhí)行命令:
          ssh-keygen -t rsa
          一路回車下去即可在目錄/root/.ssh/下建立兩個文件 id_rsa.pub和id_rsa。

          接下來,需要進入/root/.ssh目錄,執(zhí)行如下命令:
          cd .ssh

          再把is_rsa.pub文件復(fù)制到namenode機linux上去。
          scp -r id_rsa.pub root@192.168.35.101:/root/.ssh/authorized_keys_02

          操作datanode機linux03:
          以用戶root登錄linux03,在目錄下執(zhí)行命令:
          ssh-keygen -t rsa
          一路回車下去即可在目錄/root/.ssh/下建立兩個文件 id_rsa.pub和id_rsa。

          接下來,需要進入/root/.ssh目錄,執(zhí)行如下命令:
          cd .ssh

          再把is_rsa.pub文件復(fù)制到namenode機linux上去。
          scp -r id_rsa.pub root@192.168.35.101:/root/.ssh/authorized_keys_03

          *******************************************************************************

          上述方式分別為linux\linux02\linux03機器生成了rsa密鑰,并且把linux的id_rsa.pub復(fù)制到linux02\linux03上去了,而把linux02和linux03上的id_rsa.pub復(fù)制到linux上去了。

          接下來還要完成如下步驟:

          linux機:
          以root用戶登錄linux,并且進入目錄/root/.ssh下,執(zhí)行如下命令:
          cat id_rsa.pub >> authorized_keys
          cat authorized_keys_02 >> authorized_keys
          cat authorized_keys_03 >> authorized_keys
          chmod 644 authorized_keys

          linux02機:
          以root用戶登錄linux02,并且進入目錄/root/.ssh下,執(zhí)行如下命令:
          cat id_rsa.pub >> authorized_keys
          cat authorized_keys_01 >> authorized_keys
          chmod 644 authorized_keys

          linux03機:
          以root用戶登錄linux03,并且進入目錄/root/.ssh下,執(zhí)行如下命令:
          cat id_rsa.pub >> authorized_keys
          cat authorized_keys_01 >> authorized_keys
          chmod 644 authorized_keys

          通過上述配置,現(xiàn)在以用戶root登錄linux機,既可以無密鑰認(rèn)證方式訪問linux02和linux03了,同樣也可以在linux02和linux03上以ssh linux方式連接到linux上進行訪問了。

          3.安裝和配置Hadoop
          > 在namenode機器即linux機上安裝hadoop
          我下載的是hadoop-0.20.2.tar.gz,ftp上傳到linux機的/root目錄上,解壓到安裝目錄/usr/hadoop,最終hadoop的根目錄是/usr/hadoop/hadoop-0.20.2/

          編輯/etc/profile文件,在文件尾部追加如下內(nèi)容:
          export HADOOP_HOME=/usr/hadoop/hadoop-0.20.2
          export PATH=$HADOOP_HOME/bin:$PATH

          > 配置Hadoop
          core-site.xml:
          <?xml version="1.0"?>
          <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

          <!-- Put site-specific property overrides in this file. -->
          <configuration>
          ?? ?<property>
          ??????????????? <name>fs.default.name</name>
          ??????????????? <value>hdfs://192.168.35.101:9000</value>
          ??????? </property>
          ??????? <property>
          ??????????????? <name>hadoop.tmp.dir</name>
          ??????????????? <value>/tmp/hadoop/hadoop-${user.name}</value>
          ??????? </property>
          </configuration>

          hdfs-site.xml:
          <?xml version="1.0"?>
          <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

          <!-- Put site-specific property overrides in this file. -->
          <configuration>
          ??????? <property>
          ??????????????? <name>dfs.name.dir</name>
          ??????????????? <value>/home/hadoop/name</value>
          ??????? </property>
          ??????? <property>
          ??????????????? <name>dfs.data.dir</name>
          ??????????????? <value>/home/hadoop/data</value>
          ??????? </property>
          ??????? <property>
          ??????????????? <name>dfs.replication</name>
          ??????????????? <value>2</value>
          ??????? </property>
          </configuration>

          mapred-site.xml
          <?xml version="1.0"?>
          <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

          <!-- Put site-specific property overrides in this file. -->
          <configuration>
          ??????? <property>
          ??????????????? <name>mapred.job.tracker</name>
          ??????????????? <value>192.168.35.101:9001</value>
          ??????? </property>
          </configuration>

          masters
          192.168.35.101

          slaves
          192.168.35.102
          192.168.35.103

          至此,hadoop的簡單配置已經(jīng)完成

          > 將在namenode機器上配置好的hadoop部署到datanode機器上
          這里使用scp命令進行遠程傳輸,先后執(zhí)行命令
          scp -r /usr/hadoop/hadoop-0.20.2 root@192.168.35.102:/usr/hadoop/
          scp -r /usr/hadoop/hadoop-0.20.2 root@192.168.35.103:/usr/hadoop/

          4.測試
          以root用戶登入namenode機linux,進入目錄/usr/hadoop/hadoop-0.20.2/
          cd /usr/hadoop/hadoop-0.20.2

          > 執(zhí)行格式化
          [root@linux hadoop-0.20.2]# bin/hadoop namenode -format
          11/07/26 21:16:03 INFO namenode.NameNode: STARTUP_MSG:
          /************************************************************
          STARTUP_MSG: Starting NameNode
          STARTUP_MSG:?? host = linux/127.0.0.1
          STARTUP_MSG:?? args = [-format]
          STARTUP_MSG:?? version = 0.20.2
          STARTUP_MSG:?? build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
          ************************************************************/
          Re-format filesystem in /home/hadoop/name ? (Y or N) Y
          11/07/26 21:16:07 INFO namenode.FSNamesystem: fsOwner=root,root,bin,daemon,sys,adm,disk,wheel
          11/07/26 21:16:07 INFO namenode.FSNamesystem: supergroup=supergroup
          11/07/26 21:16:07 INFO namenode.FSNamesystem: isPermissionEnabled=true
          11/07/26 21:16:07 INFO common.Storage: Image file of size 94 saved in 0 seconds.
          11/07/26 21:16:07 INFO common.Storage: Storage directory /home/hadoop/name has been successfully formatted.
          11/07/26 21:16:07 INFO namenode.NameNode: SHUTDOWN_MSG:
          /************************************************************
          SHUTDOWN_MSG: Shutting down NameNode at linux/127.0.0.1
          ************************************************************/

          > 啟動hadoop
          [root@linux hadoop-0.20.2]# bin/start-all.sh
          starting namenode, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-namenode-linux.out
          192.168.35.102: starting datanode, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-linux02.out
          192.168.35.103: starting datanode, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-linux03.out
          192.168.35.101: starting secondarynamenode, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-secondarynamenode-linux.out
          starting jobtracker, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-jobtracker-linux.out
          192.168.35.103: starting tasktracker, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-linux03.out
          192.168.35.102: starting tasktracker, logging to /usr/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-linux02.out
          [root@linux hadoop-0.20.2]#

          > 用jps命令查看進程
          [root@linux hadoop-0.20.2]# jps
          7118 SecondaryNameNode
          7343 Jps
          6955 NameNode
          7204 JobTracker
          [root@linux hadoop-0.20.2]#

          posted @ 2011-08-25 16:01 jadmin 閱讀(130) | 評論 (0)編輯 收藏

          引言

          Hadoop分布式文件系統(tǒng)(HDFS)被設(shè)計成適 合運行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)。它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點。但同時,它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。HDFS是一個高 度容錯性的系統(tǒng),適合部署在廉價的機器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS放寬了一部分POSIX約束,來實 現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎(chǔ)架構(gòu)而開發(fā)的。HDFS是Apache Hadoop Core項目的一部分。這個項目的地址是http://hadoop.apache.org/core/

          前提和設(shè)計目標(biāo)

          硬件錯誤

          硬件錯誤是常態(tài)而不是異常。HDFS可能由成百上千的服務(wù)器所構(gòu)成,每個服務(wù)器上存儲著文件系統(tǒng)的部分?jǐn)?shù)據(jù)。我們面對的現(xiàn)實是構(gòu)成系統(tǒng)的組件數(shù)目是巨大 的,而且任一組件都有可能失效,這意味著總是有一部分HDFS的組件是不工作的。因此錯誤檢測和快速、自動的恢復(fù)是HDFS最核心的架構(gòu)目標(biāo)。

          流式數(shù)據(jù)訪問

          運行在HDFS上的應(yīng)用和普通的應(yīng)用不同,需要流式訪問它們的數(shù)據(jù)集。HDFS的設(shè)計中更多的考慮到了數(shù)據(jù)批處理,而不是用戶交互處理。比之?dāng)?shù)據(jù)訪問的低 延遲問題,更關(guān)鍵的在于數(shù)據(jù)訪問的高吞吐量。POSIX標(biāo)準(zhǔn)設(shè)置的很多硬性約束對HDFS應(yīng)用系統(tǒng)不是必需的。為了提高數(shù)據(jù)的吞吐量,在一些關(guān)鍵方面對 POSIX的語義做了一些修改。

          大規(guī)模數(shù)據(jù)集

          運行在HDFS上的應(yīng)用具有很大的數(shù)據(jù)集。HDFS上的一個典型文件大小一般都在G字節(jié)至T字節(jié)。因此,HDFS被調(diào)節(jié)以支持大文件存儲。它應(yīng)該能提供整 體上高的數(shù)據(jù)傳輸帶寬,能在一個集群里擴展到數(shù)百個節(jié)點。一個單一的HDFS實例應(yīng)該能支撐數(shù)以千萬計的文件。

          簡單的一致性模型

          HDFS應(yīng)用需要一個“一次寫入多次讀取”的文件訪問模型。一個文件經(jīng)過創(chuàng)建、寫入和關(guān)閉之后就不需要改變。這一假設(shè)簡化了數(shù)據(jù)一致性問題,并且使高吞吐 量的數(shù)據(jù)訪問成為可能。Map/Reduce應(yīng)用或者網(wǎng)絡(luò)爬蟲應(yīng)用都非常適合這個模型。目前還有計劃在將來擴充這個模型,使之支持文件的附加寫操作。

          “移動計算比移動數(shù)據(jù)更劃算”

          一個應(yīng)用請求的計算,離它操作的數(shù)據(jù)越近就越高效,在數(shù)據(jù)達到海量級別的時候更是如此。因為這樣就能降低網(wǎng)絡(luò)阻塞的影響,提高系統(tǒng)數(shù)據(jù)的吞吐量。將計算移 動到數(shù)據(jù)附近,比之將數(shù)據(jù)移動到應(yīng)用所在顯然更好。HDFS為應(yīng)用提供了將它們自己移動到數(shù)據(jù)附近的接口。

          異構(gòu)軟硬件平臺間的可移植性

          HDFS在設(shè)計的時候就考慮到平臺的可移植性。這種特性方便了HDFS作為大規(guī)模數(shù)據(jù)應(yīng)用平臺的推廣。

          Namenode 和 Datanode

          HDFS采用master/slave架構(gòu)。一個HDFS集群是由一個Namenode和一定數(shù)目的Datanodes組成。Namenode是一個中心 服務(wù)器,負責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對文件的訪問。集群中的Datanode一般是一個節(jié)點一個,負責(zé)管理它所在節(jié)點上 的存儲。HDFS暴露了文件系統(tǒng)的名字空間,用戶能夠以文件的形式在上面存儲數(shù)據(jù)。從內(nèi)部看,一個文件其實被分成一個或多個數(shù)據(jù)塊,這些塊存儲在一組 Datanode上。Namenode執(zhí)行文件系統(tǒng)的名字空間操作,比如打開、關(guān)閉、重命名文件或目錄。它也負責(zé)確定數(shù)據(jù)塊到具體Datanode節(jié)點的 映射。Datanode負責(zé)處理文件系統(tǒng)客戶端的讀寫請求。在Namenode的統(tǒng)一調(diào)度下進行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。

          HDFS 架構(gòu)

          Namenode和Datanode被設(shè)計成可以在普通的商用機器上運行。這些機器一般運行著GNU/Linux操作系統(tǒng)(OS)。 HDFS采用Java語言開發(fā),因此任何支持Java的機器都可以部署Namenode或Datanode。由于采用了可移植性極強的Java語言,使得 HDFS可以部署到多種類型的機器上。一個典型的部署場景是一臺機器上只運行一個Namenode實例,而集群中的其它機器分別運行一個Datanode 實例。這種架構(gòu)并不排斥在一臺機器上運行多個Datanode,只不過這樣的情況比較少見。

          集群中單一Namenode的結(jié)構(gòu)大大簡化了系統(tǒng)的架構(gòu)。Namenode是所有HDFS元數(shù)據(jù)的仲裁者和管理者,這樣,用戶數(shù)據(jù)永遠不會流過Namenode。

          文件系統(tǒng)的名字空間 (namespace)

          HDFS支持傳統(tǒng)的層次型文件組織結(jié)構(gòu)。用戶或者應(yīng)用程序可以創(chuàng)建目錄,然后將文件保存在這些目錄里。文件系統(tǒng)名字空間的層次結(jié)構(gòu)和大多數(shù)現(xiàn)有的文件系統(tǒng) 類似:用戶可以創(chuàng)建、刪除、移動或重命名文件。當(dāng)前,HDFS不支持用戶磁盤配額和訪問權(quán)限控制,也不支持硬鏈接和軟鏈接。但是HDFS架構(gòu)并不妨礙實現(xiàn) 這些特性。

          Namenode負責(zé)維護文件系統(tǒng)的名字空間,任何對文件系統(tǒng)名字空間或?qū)傩缘男薷亩紝⒈籒amenode記錄下來。應(yīng)用程序可以設(shè)置HDFS保存的文件的副本數(shù)目。文件副本的數(shù)目稱為文件的副本系數(shù),這個信息也是由Namenode保存的。

          數(shù)據(jù)復(fù)制

          HDFS被設(shè)計成能夠在一個大集群中跨機器可靠地存儲超大文件。它將每個文件存儲成一系列的數(shù)據(jù)塊,除了最后一個,所有的數(shù)據(jù)塊都是同樣大小的。為了容 錯,文件的所有數(shù)據(jù)塊都會有副本。每個文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。應(yīng)用程序可以指定某個文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時候指 定,也可以在之后改變。HDFS中的文件都是一次性寫入的,并且嚴(yán)格要求在任何時候只能有一個寫入者。

          Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個Datanode接收心跳信號和塊狀態(tài)報告(Blockreport)。接收到心跳信號意味著該Datanode節(jié)點工作正常。塊狀態(tài)報告包含了一個該Datanode上所有數(shù)據(jù)塊的列表。

          HDFS Datanodes

          副本存放: 最最開始的一步

          副本的存放是HDFS可靠性和性能的關(guān)鍵。優(yōu)化的副本存放策略是HDFS區(qū)分于其他大部分分布式文件系統(tǒng)的重要特性。這種特性需要做大量的調(diào)優(yōu),并需要經(jīng) 驗的積累。HDFS采用一種稱為機架感知(rack-aware)的策略來改進數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。目前實現(xiàn)的副本存放策略只是在這 個方向上的第一步。實現(xiàn)這個策略的短期目標(biāo)是驗證它在生產(chǎn)環(huán)境下的有效性,觀察它的行為,為實現(xiàn)更先進的策略打下測試和研究的基礎(chǔ)。

          大型HDFS實例一般運行在跨越多個機架的計算機組成的集群上,不同機架上的兩臺機器之間的通訊需要經(jīng)過交換機。在大多數(shù)情況下,同一個機架內(nèi)的兩臺機器間的帶寬會比不同機架的兩臺機器間的帶寬大。

          通過一個機架感知的 過程,Namenode可以確定每個Datanode所屬的機架id。一個簡單但沒有優(yōu)化的策略就是將副本存放在不同的機架上。這樣可以有效防止當(dāng)整個機 架失效時數(shù)據(jù)的丟失,并且允許讀數(shù)據(jù)的時候充分利用多個機架的帶寬。這種策略設(shè)置可以將副本均勻分布在集群中,有利于當(dāng)組件失效情況下的負載均衡。但是, 因為這種策略的一個寫操作需要傳輸數(shù)據(jù)塊到多個機架,這增加了寫的代價。

          在大多數(shù)情況下,副本系數(shù)是3,HDFS的存放策略是將一個副本存放在本地機架的節(jié)點上,一個副本放在同一機架的另一個節(jié)點上,最后一個副本放在不同機架 的節(jié)點上。這種策略減少了機架間的數(shù)據(jù)傳輸,這就提高了寫操作的效率。機架的錯誤遠遠比節(jié)點的錯誤少,所以這個策略不會影響到數(shù)據(jù)的可靠性和可用性。于此 同時,因為數(shù)據(jù)塊只放在兩個(不是三個)不同的機架上,所以此策略減少了讀取數(shù)據(jù)時需要的網(wǎng)絡(luò)傳輸總帶寬。在這種策略下,副本并不是均勻分布在不同的機架 上。三分之一的副本在一個節(jié)點上,三分之二的副本在一個機架上,其他副本均勻分布在剩下的機架中,這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進了寫 的性能。

          當(dāng)前,這里介紹的默認(rèn)副本存放策略正在開發(fā)的過程中。

          副本選擇

          為了降低整體的帶寬消耗和讀取延時,HDFS會盡量讓讀取程序讀取離它最近的副本。如果在讀取程序的同一個機架上有一個副本,那么就讀取該副本。如果一個HDFS集群跨越多個數(shù)據(jù)中心,那么客戶端也將首先讀本地數(shù)據(jù)中心的副本。

          安全模式

          Namenode啟動后會進入一個稱為安全模式的特殊狀態(tài)。處于安全模式的Namenode是不會進行數(shù)據(jù)塊的復(fù)制的。Namenode從所有的 Datanode接收心跳信號和塊狀態(tài)報告。塊狀態(tài)報告包括了某個Datanode所有的數(shù)據(jù)塊列表。每個數(shù)據(jù)塊都有一個指定的最小副本數(shù)。當(dāng) Namenode檢測確認(rèn)某個數(shù)據(jù)塊的副本數(shù)目達到這個最小值,那么該數(shù)據(jù)塊就會被認(rèn)為是副本安全(safely replicated)的;在一定百分比(這個參數(shù)可配置)的數(shù)據(jù)塊被Namenode檢測確認(rèn)是安全之后(加上一個額外的30秒等待時 間),Namenode將退出安全模式狀態(tài)。接下來它會確定還有哪些數(shù)據(jù)塊的副本沒有達到指定數(shù)目,并將這些數(shù)據(jù)塊復(fù)制到其他Datanode上。

          文件系統(tǒng)元數(shù)據(jù)的持久化

          Namenode上保存著HDFS的名字空間。對于任何對文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作,Namenode都會使用一種稱為EditLog的事務(wù)日志記錄 下來。例如,在HDFS中創(chuàng)建一個文件,Namenode就會在Editlog中插入一條記錄來表示;同樣地,修改文件的副本系數(shù)也將往Editlog插 入一條記錄。Namenode在本地操作系統(tǒng)的文件系統(tǒng)中存儲這個Editlog。整個文件系統(tǒng)的名字空間,包括數(shù)據(jù)塊到文件的映射、文件的屬性等,都存 儲在一個稱為FsImage的文件中,這個文件也是放在Namenode所在的本地文件系統(tǒng)上。

          Namenode在內(nèi)存中保存著整個文件系統(tǒng)的名字空間和文件數(shù)據(jù)塊映射(Blockmap)的映像。這個關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu)設(shè)計得很緊湊,因而一個有4G 內(nèi)存的Namenode足夠支撐大量的文件和目錄。當(dāng)Namenode啟動時,它從硬盤中讀取Editlog和FsImage,將所有Editlog中的 事務(wù)作用在內(nèi)存中的FsImage上,并將這個新版本的FsImage從內(nèi)存中保存到本地磁盤上,然后刪除舊的Editlog,因為這個舊的 Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個過程稱為一個檢查點(checkpoint)。在當(dāng)前實現(xiàn)中,檢查點只發(fā)生在Namenode 啟動時,在不久的將來將實現(xiàn)支持周期性的檢查點。

          Datanode將HDFS數(shù)據(jù)以文件的形式存儲在本地的文件系統(tǒng)中,它并不知道有關(guān)HDFS文件的信息。它把每個HDFS數(shù)據(jù)塊存儲在本地文件系統(tǒng)的一 個單獨的文件中。Datanode并不在同一個目錄創(chuàng)建所有的文件,實際上,它用試探的方法來確定每個目錄的最佳文件數(shù)目,并且在適當(dāng)?shù)臅r候創(chuàng)建子目錄。 在同一個目錄中創(chuàng)建所有的本地文件并不是最優(yōu)的選擇,這是因為本地文件系統(tǒng)可能無法高效地在單個目錄中支持大量的文件。當(dāng)一個Datanode啟動時,它 會掃描本地文件系統(tǒng),產(chǎn)生一個這些本地文件對應(yīng)的所有HDFS數(shù)據(jù)塊的列表,然后作為報告發(fā)送到Namenode,這個報告就是塊狀態(tài)報告。

          通訊協(xié)議

          所有的HDFS通訊協(xié)議都是建立在TCP/IP協(xié)議之上??蛻舳送ㄟ^一個可配置的TCP端口連接到Namenode,通過ClientProtocol協(xié)議與Namenode交互。而Datanode使用DatanodeProtocol協(xié)議與Namenode交互。一個遠程過程調(diào)用(RPC)模型被抽象出來封裝ClientProtocol和Datanodeprotocol協(xié)議。在設(shè)計上,Namenode不會主動發(fā)起RPC,而是響應(yīng)來自客戶端或 Datanode 的RPC請求。

          健壯性

          HDFS的主要目標(biāo)就是即使在出錯的情況下也要保證數(shù)據(jù)存儲的可靠性。常見的三種出錯情況是:Namenode出錯, Datanode出錯和網(wǎng)絡(luò)割裂(network partitions)。

          磁盤數(shù)據(jù)錯誤,心跳檢測和重新復(fù)制

          每個Datanode節(jié)點周期性地向Namenode發(fā)送心跳信號。網(wǎng)絡(luò)割裂可能導(dǎo)致一部分Datanode跟Namenode失去聯(lián)系。 Namenode通過心跳信號的缺失來檢測這一情況,并將這些近期不再發(fā)送心跳信號Datanode標(biāo)記為宕機,不會再將新的IO請 求發(fā)給它們。任何存儲在宕機Datanode上的數(shù)據(jù)將不再有效。Datanode的宕機可能會引起一些數(shù)據(jù)塊的副本系數(shù)低于指定值,Namenode不 斷地檢測這些需要復(fù)制的數(shù)據(jù)塊,一旦發(fā)現(xiàn)就啟動復(fù)制操作。在下列情況下,可能需要重新復(fù)制:某個Datanode節(jié)點失效,某個副本遭到損 壞,Datanode上的硬盤錯誤,或者文件的副本系數(shù)增大。

          集群均衡

          HDFS的架構(gòu)支持?jǐn)?shù)據(jù)均衡策略。如果某個Datanode節(jié)點上的空閑空間低于特定的臨界點,按照均衡策略系統(tǒng)就會自動地將數(shù)據(jù)從這個Datanode 移動到其他空閑的Datanode。當(dāng)對某個文件的請求突然增加,那么也可能啟動一個計劃創(chuàng)建該文件新的副本,并且同時重新平衡集群中的其他數(shù)據(jù)。這些均 衡策略目前還沒有實現(xiàn)。

          數(shù)據(jù)完整性

          從某個Datanode獲取的數(shù)據(jù)塊有可能是損壞的,損壞可能是由Datanode的存儲設(shè)備錯誤、網(wǎng)絡(luò)錯誤或者軟件bug造成的。HDFS客戶端軟件實 現(xiàn)了對HDFS文件內(nèi)容的校驗和(checksum)檢查。當(dāng)客戶端創(chuàng)建一個新的HDFS文件,會計算這個文件每個數(shù)據(jù)塊的校驗和,并將校驗和作為一個單 獨的隱藏文件保存在同一個HDFS名字空間下。當(dāng)客戶端獲取文件內(nèi)容后,它會檢驗從Datanode獲取的數(shù)據(jù)跟相應(yīng)的校驗和文件中的校驗和是否匹配,如 果不匹配,客戶端可以選擇從其他Datanode獲取該數(shù)據(jù)塊的副本。

          元數(shù)據(jù)磁盤錯誤

          FsImage和Editlog是HDFS的核心數(shù)據(jù)結(jié)構(gòu)。如果這些文件損壞了,整個HDFS實例都將失效。因而,Namenode可以配置成支持維護多 個FsImage和Editlog的副本。任何對FsImage或者Editlog的修改,都將同步到它們的副本上。這種多副本的同步操作可能會降低 Namenode每秒處理的名字空間事務(wù)數(shù)量。然而這個代價是可以接受的,因為即使HDFS的應(yīng)用是數(shù)據(jù)密集的,它們也非元數(shù)據(jù)密集的。當(dāng) Namenode重啟的時候,它會選取最近的完整的FsImage和Editlog來使用。

          Namenode是HDFS集群中的單點故障(single point of failure)所在。如果Namenode機器故障,是需要手工干預(yù)的。目前,自動重啟或在另一臺機器上做Namenode故障轉(zhuǎn)移的功能還沒實現(xiàn)。

          快照

          快照支持某一特定時刻的數(shù)據(jù)的復(fù)制備份。利用快照,可以讓HDFS在數(shù)據(jù)損壞時恢復(fù)到過去一個已知正確的時間點。HDFS目前還不支持快照功能,但計劃在將來的版本進行支持。

          數(shù)據(jù)組織

          數(shù)據(jù)塊

          HDFS被設(shè)計成支持大文件,適用HDFS的是那些需要處理大規(guī)模的數(shù)據(jù)集的應(yīng)用。這些應(yīng)用都是只寫入數(shù)據(jù)一次,但卻讀取一次或多次,并且讀取速度應(yīng)能滿 足流式讀取的需要。HDFS支持文件的“一次寫入多次讀取”語義。一個典型的數(shù)據(jù)塊大小是64MB。因而,HDFS中的文件總是按照64M被切分成不同的 塊,每個塊盡可能地存儲于不同的Datanode中。

          Staging

          客戶端創(chuàng)建文件的請求其實并沒有立即發(fā)送給Namenode,事實上,在剛開始階段HDFS客戶端會先將文件數(shù)據(jù)緩存到本地的一個臨時文件。應(yīng)用程序的寫 操作被透明地重定向到這個臨時文件。當(dāng)這個臨時文件累積的數(shù)據(jù)量超過一個數(shù)據(jù)塊的大小,客戶端才會聯(lián)系Namenode。Namenode將文件名插入文 件系統(tǒng)的層次結(jié)構(gòu)中,并且分配一個數(shù)據(jù)塊給它。然后返回Datanode的標(biāo)識符和目標(biāo)數(shù)據(jù)塊給客戶端。接著客戶端將這塊數(shù)據(jù)從本地臨時文件上傳到指定的 Datanode上。當(dāng)文件關(guān)閉時,在臨時文件中剩余的沒有上傳的數(shù)據(jù)也會傳輸?shù)街付ǖ腄atanode上。然后客戶端告訴Namenode文件已經(jīng)關(guān) 閉。此時Namenode才將文件創(chuàng)建操作提交到日志里進行存儲。如果Namenode在文件關(guān)閉前宕機了,則該文件將丟失。

          上述方法是對在HDFS上運行的目標(biāo)應(yīng)用進行認(rèn)真考慮后得到的結(jié)果。這些應(yīng)用需要進行文件的流式寫入。如果不采用客戶端緩存,由于網(wǎng)絡(luò)速度和網(wǎng)絡(luò)堵塞會對吞估量造成比較大的影響。這種方法并不是沒有先例的,早期的文件系統(tǒng),比如AFS,就用客戶端緩存來提高性能。為了達到更高的數(shù)據(jù)上傳效率,已經(jīng)放松了POSIX標(biāo)準(zhǔn)的要求。

          流水線復(fù)制

          當(dāng)客戶端向HDFS文件寫入數(shù)據(jù)的時候,一開始是寫到本地臨時文件中。假設(shè)該文件的副本系數(shù)設(shè)置為3,當(dāng)本地臨時文件累積到一個數(shù)據(jù)塊的大小時,客戶端會 從Namenode獲取一個Datanode列表用于存放副本。然后客戶端開始向第一個Datanode傳輸數(shù)據(jù),第一個Datanode一小部分一小部 分(4 KB)地接收數(shù)據(jù),將每一部分寫入本地倉庫,并同時傳輸該部分到列表中第二個Datanode節(jié)點。第二個Datanode也是這樣,一小部分一小部分地 接收數(shù)據(jù),寫入本地倉庫,并同時傳給第三個Datanode。最后,第三個Datanode接收數(shù)據(jù)并存儲在本地。因此,Datanode能流水線式地從 前一個節(jié)點接收數(shù)據(jù),并在同時轉(zhuǎn)發(fā)給下一個節(jié)點,數(shù)據(jù)以流水線的方式從前一個Datanode復(fù)制到下一個。

          可訪問性

          HDFS給應(yīng)用提供了多種訪問方式。用戶可以通過Java API接口訪問,也可以通過C語言的封裝API訪問,還可以通過瀏覽器的方式訪問HDFS中的文件。通過WebDAV協(xié)議訪問的方式正在開發(fā)中。

          DFSShell

          HDFS以文件和目錄的形式組織用戶數(shù)據(jù)。它提供了一個命令行的接口(DFSShell)讓用戶與HDFS中的數(shù)據(jù)進行交互。命令的語法和用戶熟悉的其他shell(例如 bash, csh)工具類似。下面是一些動作/命令的示例:

          動作 命令
          創(chuàng)建一個名為/foodir的目錄 bin/hadoop dfs -mkdir /foodir
          創(chuàng)建一個名為/foodir的目錄 bin/hadoop dfs -mkdir /foodir
          查看名為/foodir/myfile.txt的文件內(nèi)容 bin/hadoop dfs -cat /foodir/myfile.txt

          DFSShell 可以用在那些通過腳本語言和文件系統(tǒng)進行交互的應(yīng)用程序上。

          DFSAdmin

          DFSAdmin 命令用來管理HDFS集群。這些命令只有HDSF的管理員才能使用。下面是一些動作/命令的示例:

          動作 命令
          將集群置于安全模式 bin/hadoop dfsadmin -safemode enter
          顯示Datanode列表 bin/hadoop dfsadmin -report
          使Datanode節(jié)點datanodename退役 bin/hadoop dfsadmin -decommission datanodename

          瀏覽器接口

          一個典型的HDFS安裝會在一個可配置的TCP端口開啟一個Web服務(wù)器用于暴露HDFS的名字空間。用戶可以用瀏覽器來瀏覽HDFS的名字空間和查看文件的內(nèi)容。

          存儲空間回收

          文件的刪除和恢復(fù)

          當(dāng)用戶或應(yīng)用程序刪除某個文件時,這個文件并沒有立刻從HDFS中刪除。實際上,HDFS會將這個文件重命名轉(zhuǎn)移到/trash目錄。只要文件還在/trash目錄中,該文件就可以被迅速地恢復(fù)。文件在/trash中保存的時間是可配置的,當(dāng)超過這個時間時,Namenode就會將該文件從名字空間中刪除。刪除文件會使得該文件相關(guān)的數(shù)據(jù)塊被釋放。注意,從用戶刪除文件到HDFS空閑空間的增加之間會有一定時間的延遲。

          只要被刪除的文件還在/trash目錄中,用戶就可以恢復(fù)這個文件。如果用戶想恢復(fù)被刪除的文件,他/她可以瀏覽/trash目錄找回該文件。/trash目錄僅僅保存被刪除文件的最后副本。/trash目錄與其他的目錄沒有什么區(qū)別,除了一點:在該目錄上HDFS會應(yīng)用一個特殊策略來自動刪除文件。目前的默認(rèn)策略是刪除/trash中保留時間超過6小時的文件。將來,這個策略可以通過一個被良好定義的接口配置。

          減少副本系數(shù)

          當(dāng)一個文件的副本系數(shù)被減小后,Namenode會選擇過剩的副本刪除。下次心跳檢測時會將該信息傳遞給Datanode。Datanode遂即移除相應(yīng)的數(shù)據(jù)塊,集群中的空閑空間加大。同樣,在調(diào)用setReplicationAPI結(jié)束和集群中空閑空間增加間會有一定的延遲。

          參考資料

          posted @ 2011-08-24 12:59 jadmin 閱讀(133) | 評論 (0)編輯 收藏

          function is_email($email) {
          ?? ??? ?$exp = "^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
          ?? ??? ?if(eregi($exp,$email)) {
          ?? ??? ??? ?return true;
          ?? ??? ?}
          ?? ??? ?return false;
          ?}


          posted @ 2011-08-22 19:37 jadmin 閱讀(102) | 評論 (0)編輯 收藏

          function remove_quote(&$str) {
          ?? ??? ?if (preg_match("/^\"/",$str)){
          ?? ??? ??? ?$str = substr($str, 1, strlen($str) - 1);
          ?? ??? ?}
          ?? ??? ?//判斷字符串是否以'"'結(jié)束
          ?? ??? ?if (preg_match("/\"$/",$str)){
          ?? ??? ??? ?$str = substr($str, 0, strlen($str) - 1);;
          ?? ??? ?}
          ?? ??? ?return $str;
          ? }

          posted @ 2011-08-22 19:36 jadmin 閱讀(429) | 評論 (0)編輯 收藏

          function is_chinese($s){
          ??????? $allen = preg_match("/^[^\x80-\xff]+$/", $s);?? //判斷是否是英文
          ??????? $allcn = preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/",$s);? //判斷是否是中文
          ??????? if($allen){ ?
          ????????????? return 'allen'; ?
          ??????? }else{ ?
          ????????????? if($allcn){ ?
          ?????????????????? return 'allcn'; ?
          ????????????? }else{ ?
          ?????????????????? return 'encn'; ?
          ????????????? } ?
          ??????? }?
          ?? }

          posted @ 2011-08-22 10:14 jadmin 閱讀(220) | 評論 (0)編輯 收藏

          DML(data manipulation language):
          ?????? 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對數(shù)據(jù)庫里的數(shù)據(jù)進行操作的語言
          DDL(data definition language):
          ?????? DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)的結(jié)構(gòu),數(shù)據(jù)類型,表之間的鏈接和約束等初始化工作上,他們大多在建立表時使用
          DCL(Data Control Language):
          ?????? 是數(shù)據(jù)庫控制功能。是用來設(shè)置或更改數(shù)據(jù)庫用戶或角色權(quán)限的語句,包括(grant,deny,revoke等)語句。在默認(rèn)狀態(tài)下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人員才有權(quán)力執(zhí)行DCL

          詳細解釋:
          一、DDL is Data Definition Language statements. Some examples:數(shù)據(jù)定義語言,用于定義和管理 SQL 數(shù)據(jù)庫中的所有對象的語言
          ????? 1.CREATE - to create objects in the database?? 創(chuàng)建
          ????? 2.ALTER - alters the structure of the database?? 修改
          ????? 3.DROP - delete objects from the database?? 刪除
          ????? 4.TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed
          ????? TRUNCATE TABLE [Table Name]。
            下面是對Truncate語句在MSSQLServer2000中用法和原理的說明:
            Truncate table 表名 速度快,而且效率高,因為:
            TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少。
            DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。
            TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識所用的計數(shù)值重置為該列的種子。如果想保留標(biāo)識計數(shù)值,請改用 DELETE。如果要刪除表定義及其數(shù)據(jù),請使用 DROP TABLE 語句。
            對于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。
            TRUNCATE TABLE 不能用于參與了索引視圖的表。
          ?????? 5.COMMENT - add comments to the data dictionary 注釋
          ?????? 6.GRANT - gives user's access privileges to database 授權(quán)
          ?????? 7.REVOKE - withdraw access privileges given with the GRANT command?? 收回已經(jīng)授予的權(quán)限

          二、DML is Data Manipulation Language statements. Some examples:數(shù)據(jù)操作語言,SQL中處理數(shù)據(jù)等操作統(tǒng)稱為數(shù)據(jù)操縱語言
          ?????? 1.SELECT - retrieve data from the a database?????????? 查詢
          ?????? 2.INSERT - insert data into a table??????????????????? 添加
          ?????? 3.UPDATE - updates existing data within a table??? 更新
          ?????? 4.DELETE - deletes all records from a table, the space for the records remain?? 刪除
          ?????? 5.CALL - call a PL/SQL or Java subprogram
          ?????? 6.EXPLAIN PLAN - explain access path to data
          ?????? Oracle RDBMS執(zhí)行每一條SQL語句,都必須經(jīng)過Oracle優(yōu)化器的評估。所以,了解優(yōu)化器是如何選擇(搜索)路徑以及索引是如何被使用的,對優(yōu)化SQL語句有很大的幫助。Explain可以用來迅速方便地查出對于給定SQL語句中的查詢數(shù)據(jù)是如何得到的即搜索路徑(我們通常稱為Access Path)。從而使我們選擇最優(yōu)的查詢方式達到最大的優(yōu)化效果。
          ?????? 7.LOCK TABLE - control concurrency 鎖,用于控制并發(fā)

          三、DCL is Data Control Language statements. Some examples:數(shù)據(jù)控制語言,用來授予或回收訪問數(shù)據(jù)庫的某種特權(quán),并控制數(shù)據(jù)庫操縱事務(wù)發(fā)生的時間及效果,對數(shù)據(jù)庫實行監(jiān)視等
          ?????? 1.COMMIT - save work done 提交
          ?????? 2.SAVEPOINT - identify a point in a transaction to which you can later roll back 保存點
          ?????? 3.ROLLBACK - restore database to original since the last COMMIT?? 回滾
          ?????? 4.SET TRANSACTION - Change transaction options like what rollback segment to use?? 設(shè)置當(dāng)前事務(wù)的特性,它對后面的事務(wù)沒有影響.


          posted @ 2011-08-17 19:40 jadmin 閱讀(113) | 評論 (0)編輯 收藏
          僅列出標(biāo)題
          共50頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 灵台县| 屏南县| 洛南县| 乐清市| 河津市| 通辽市| 沁水县| 遂昌县| 沂南县| 洛宁县| 嘉荫县| 北宁市| 盘锦市| 安溪县| 调兵山市| 屏山县| 廉江市| 老河口市| 肇源县| 娱乐| 航空| 布拖县| 绍兴县| 乌拉特后旗| 英德市| 巨鹿县| 蒙山县| 兰溪市| 朝阳区| 汉寿县| 怀柔区| 宿松县| 天等县| 克东县| 鹰潭市| 江安县| 贵州省| 蓬安县| 思茅市| 达孜县| 合阳县|