2013年1月23日 星期三

NOSQL

NOSQL筆記

ACID
Atomicity 原子性
Consistency 一致性
Isolation 隔離性
Durability 持久性

CAP
Consistency 一致性
Availability 可用性
Partition 容錯性
CA:RMDB
AP:Key-Value


SNS Social Networking Services  網路社群服務

因為一致性沒那麼重要,A看C的資料 和B看C的資料差幾秒是沒有感覺的。




2013年1月14日 星期一

Hadoop 實作

開機注意事情:

顯然 755的權限不夠於 hadoop.tmp.dir 資料夾
chmod -R 777 /tmp/hadoop*

hadoop 0.20 以後:設定在 core-site.xml 內的 hadoop.tmp.dir 到 /var/hadoop
sudo mkdir /var/hadoop
sudo chown USERNAME:USERNAME /var/hadoop
sudo chmod 777 /var/hadoop


通常hadoop 遇到問題而開不起來,通常只好重新namenode -format ,然而還是會遇到問題
/opt/hadoop/bin/stop-all.sh
rm -rf /var/hadoop/*
rm -rf /tmp/hadoop*
rm -rf /opt/hadoop/logs/*


/opt/hadoop/bin/hadoop namenode -format

/opt/hadoop/bin/hadoop start-all.sh
/opt/hadoop/bin/hadoop stop-all.sh
--------

在CentOS實作Hadoop單機..
設定登入免密碼(因為如果要多台運算,每台都必須輸入密碼。)
安裝Java-JDK(已包含JDE),把預設的Open-JDK改成Sun-JDK。
//修改預設JDK
#alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_22/bin/java 1
#alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_22/bin/javac 1
//檢查指令
java -version
//有無正確執行
java or javac
下載安裝hadoop(使用0.20.2)
修改三個設定檔。(hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml)
提供最簡單的設定檔。
//hadoop-env.sh
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/var/hadoop/hadoop-\${user.name}</value>
  </property>
</configuration>

//core-site.xml
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/var/hadoop/hadoop-\${user.name}</value>
  </property>
</configuration>

//hdfs-site.xml
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

//mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
  </property>
</configuration>

format namenode, secondnamenode, tasktracker
./opt/hadoop/bin/hadoop namenode -format
//啟動Hadoop
./opt/hadoop/bin/start-all.sh
//檢查運作狀態
http://localhost:50030 50060 50070 看結果。

真是惡夢~
修了10幾個錯誤才能執行,從昨天下午到現在花了一天的時間,我晚點整理在放上來!



1.localhost:50030 50060跑不出來~

2.Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
Hadoop Common HADOOP-6766  apache pacth
https://issues.apache.org/jira/browse/HADOOP-6766

3.INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:54310. Already tried 0 time(s).

4.file could only be replicated to 0 nodes, instead of 1' in hadoop?

5.ERROR org.apache.hadoop.hdfs.ser:ver.datanode.DataNode: java.io.IOException:

Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist:
沒有把檔案傳進去hdfs
hadoop fs -rmr input

2013年1月9日 星期三

Hadoop使用教學(三)(Hbase介紹)

HBase:

  1. HBase是架構在HDFS上的分散式資料庫
  2. 使用row and column為索引存取資料值
  3. 每一筆資料都有timestamp,可以一不同時間存取多筆資料
table = row + column family
index = row key
一個column family就是column label的集合,label可以新增而不用重新設定table

舉例:
使用('row key', 'family:label', 'timestamp')
('ricky', 'score', 'T5')  得到  ricky, T5, Eng:30













特點:

  1. 可以將資料表分為許多region,region是由一到數列所組成,並存放在不同主機,存放region的主機就是region server
  2. 還有master server用來記錄每一個region對應的region server
  3. master server自動將不能工作的region重新分配到其他refion server
  4. 提供MapReduce的城市當做資料來源或儲存媒介,提供TableMapper/Reducer類別讓程式中的Mapper/Reducer類別繼承,可以把MapReduce中的Key,Value更方便從HBase取出存入。





NOSQL

Hadoop使用教學(二)(Hadoop架構)

Hadoop架構:
MapReduce
簡單說MapReduce是一個分散式程式框架,運算工作可以分成兩個部分,Map和Reduce,開始的時候,會被系統轉換成一組組Key,Value的序對並切割成許多部分,分別丟給Mapper處理,Mapper處理完後將運算結果整理成一組組的Key,Value序對,再傳給Reducer整合Mapper的結果,將結果輸出。

MapReduce詳細介紹:
map: [1,2,3,4] - (*2) -> [2,4,6,8]
reduce: [1,2,3,4] - (sum) -> 10
對應Divide and conquer演算法,將問題分解成很多個小問題,再做總和。

  1. JobTracker跟NameNode取得需要運算的blocks
  2. JobTracker選數個TaskTracker來做Map運算
  3. JobTracker將中間檔案整合排序後,複製到需要的TaskTracker
  4. JobTracker派遣TaskTracker作reduce
  5. reduce完成後通知JobTracker與Namenode以產生output

  1. 建立一個JobConf類別的物件
  2. 設定MapperClass/ReducerClass的類別
  3. 設定輸入輸出資料的格式
  4. 設定輸出資料的類型
  5. 提交運算工作
  6. 依據InputFormat的設定取得資料,並分割轉換為Key,Value
  7. 交由Mapper運算
  8. Mapper將運算結果輸出為Key,Value序對,也稱為intermediate資料
  9. 系統將暫時的結果排序暫存起來
  10. 所有Mapper工作結束
  11. 依照不同的Key值傳送給不同的Reducer彙整
  12. 相同Key值會放在container裡傳給同一個Reducer處理
  13. Reducer利用values.next()依序取得value值
  14. 結果整理
  15. 依OutputFormat設定輸出檔案
運算資源會由JobTracker分配到TaskTracker,並指派不同的節點擔任Mapper和Reducer

HDFS
Hadoop專案中的檔案系統。實作Google File System。
  1. 硬體錯誤容忍能力 - 可自行處理錯誤,不需人工來修理
  2. 串流式的資料資料存取 - Goolge搜尋,高Latency(等待時間)
  3. 大規模資料 - 支援Perabytes等級
  4. 一致性模型 - 一次寫入(收集的東西),多次存取(結果),比如說搜尋引擎 - 去全球的網頁拉資料,一起進去算,算出來存下結果,讓使用者讀取。
  5. 在地運算 - 資料在哪裡就用那一台運算,如果沒資料會找最近的資料copy
  6. 異質平台移植性 - 不同硬體可以擴充
讀取運作的方式:client 跟namenode講說我要(查/寫)資料,namenode去查他的
Metadata ( name, path, copies, blocks ),然後要求datanodes抓出來。

副本備份機制:
可靠性機制:
  1. 資料完整性 - (透過CRC32 和 用副本取代出錯資料)
  2. Datanode壞掉 - 定期送heartbeat送Namenode透過證明自己存在
  3. FSImage(核心映像檔)、Editlog(日誌檔),當Namoenode掛掉,Secondarynamenode啟動。管理者要用FSImage和Editlog載入給Secondarynamenode。Secondary可以有好幾台。
Namenode
  1. 易於擴充的分散式檔案系統
  2. 運作於廉價的普通硬體上
  3. 容錯功能
  4. 提供大量的用戶總體性能教高的服務
HDFS詳細介紹:
Hadoop Distributed File System
將分散的儲存資源整合成一個具容錯能力、高效率且超大容量的環境。
Hadoop運算產生的資料都是存放在HDFS。
HDFS是master/slave架構,由兩種角色組成。Namenode + Datanodes
Namenode負責各檔案的屬性權限管理及儲存。記錄Datanodes檔案存放位置。
Datanodes由切割成數個Block區塊儲存在不同的Datanodes,每一區塊還會有副本存在不同節點。

名詞介紹:
Job - 任務。
Task - 工作。
JobTracker - 任務分派者。
TaskTracker - 工作執行者。
Map - 對應。
Reduce - 彙整。
Namenode - 名稱節點。
Datanode - 資料節點。
Replication - 副本。
Blocks - 檔案區塊(64M)。
Metadata - 屬性資料。

HDFS Layer - 管理資料
Namenode
  1. Master
  2. 管理HDFS的名稱空間
  3. 控制對檔案的讀寫
  4. 配置副本策略(如果有Datanode節點損壞,進行資料搬遷與複製)
  5. 對名稱空間做檢查及記錄
  6. 一個
Datanode
  1. Workers
  2. 執行讀 / 寫動作
  3. 執行Namonode的副本策略(負責執行)
  4. 多個
MapReduce Layer - 分派程序
Jobtracker
  1. Master
  2. 使用者發起工作
  3. 指派工作給Tasktrackers
  4. 排成決策、工作分配、錯誤處理
  5. 一個
Tasktrackers
  1. Workers
  2. 運作Map與Reduce的工作
  3. 管理儲存;回覆運算結果
  4. 多個
Hadoop安裝個資料夾置放的代表意義:
bin/ 
各項執行檔,包括start-all.sh,stop-all.sh,hadoop
conf/ 
設定檔。hadoop-env.sh,hadoop-site.conf
docs/ 
Hadoop api與說明文件
contrib/ 
eclipse外掛
lib/ 
Hadoop函式庫
src/ 
Hadoop原始碼
build/ 
Hadoop編譯後資料夾 
logs/ 
日誌

Hadoop使用教學(一)(歷史簡介)

Hadoop是什麼?
是一個讓使用者簡易撰寫並執行處理海量資料應用程式的軟體平台

比喻:
處理海量資料的生產線,只需學會定義 map 跟 reduce 工作站該做哪些事情。

特色:

  1. 海量:擁有儲存與處理大量資料的能力。
  2. 經濟:可以用在一般PC所架設的叢集環境內。
  3. 效率:透過分散式檔案系統的幫助,可以得到快速回應。
  4. 可靠:節點發生錯誤,即時自動取得備份資料與部屬運算資源。
軟體創辦人:Doug Cutting
















Hadoop軟體歷史起源:
Hadoop是由Apache Lucene的建立者Doug Cutting所開發維護。
2003年 - Google發表雲端運算論文 (GFS/Bigtable/MapReduce)
2004年 - Doug Cutting 開放原始碼實作,NDFS
2004年 - Google發佈MapReduce的架構
2005年 - Doug Cutting實作MapReduce
2006年 - Doug Cutting將Nutch改名為Hadoop,並加入Yahoo團隊。
2006年 - MapReduce和NDFS分別被納入Hadoop的項目中。
2008年 - Yahoo宣布達成 10000-core Hadoop cluster
2009年 - Yahoo破了世界紀錄1T的資料分析(62秒),打敗Google的68秒。

其他事件:

  1. Nutch後來遇到儲存大量網站資料的瓶頸。
  2. Google在會議分享他們的三大關鍵技術。 (GFS/Bigtable/MapReduce)
  3. Hadoop創辦人曾經參考Google的設計。
  4. 原本的Nutch Distributed File System 變成了 Hadoop DFS (HDFS)

名詞解釋:
Lucene:用Java設計的高效能文件索引引擎API,索引文件中的每一字,讓搜尋的效率比傳統逐字比較還要高很多。

Nutch:是一個開放原始碼(自Nutch 0.8開始),以Java來實作的搜尋引擎,利用Lucene為函式庫。