2015/12/09

php7 vs. GO lang vs. C on CentOS 7 Linux 速度比較


php7 vs. GO lang vs. C on CentOS 7 Linux 速度比較

繼上一篇後,想說 php7 已經很快了,但是到底和原生 C 差多少.....
所以就抓了php7 , GO 及 C 三種語言來比較看看氣泡演算法, 12 各項目排序 90萬次花費的時間。

結論:
PHP7 ==>  5.9242088794708 s
GO  ==>  0.228.885223 s
C ==> 0.174889 s
換算一下, ms, us 的單位,結論是 php7 連 GO 和 C 的車尾燈都看不到...
GO 還可以看得到C 的車尾燈!!!!!且 GO 比 C 好寫多了,我可以接受這一點點的微小差距。
有圖有真相....



C bubble sort 演算法  http://www.programmingsimplified.com/c/source-code/c-program-bubble-sort
C 計算時間差 http://www.binarytides.com/get-time-difference-in-microtime-in-c/
php 及 go 的程式碼 https://jaxbot.me/articles/benchmarks_nodejs_vs_go_vs_php_3_14_2013
別人做的 php vs go https://www.ransona.com/blog/2014/11/06/go-vs-php-performance-restful-service/

2015/12/08

升級 php7 可以不用急著換電腦.....!!!! on CentOS 7


升級 php7 可以不用急著換電腦.....!!!! on CentOS 7 Linux

先講結論:
升級前  2.767 sec
升級後  0.88 sec
----------------------
速度增加了 3.14 倍 ,這台是 Intel Core I5 CPU, RAM 4GB 的個人PC。






更新可以參考這篇文章, CentOS 6 OR CentOS 7 都可以更新。
https://webtatic.com/packages/php70/ 
但是要注意,如果你的 Linux 系統已經有安裝第三方套件,或手動安裝的請小心更新後會毀掉。我的是都用官方的套件及 EPEL更新,直接上去沒有發生大的問題資料也都存在。
另外如果你有自行開發的程式,也需要注意套件的相容性,再行安裝。

測試程式,我是抓  http://www.php-benchmark-script.com/ 這個測試程式。
程式沒有針對平行化、I/O 這些評估,但已經明顯看得出差異。





2015/11/22

感謝這個時代有手機及社群網站這樣方便的東西


因為社群網站,讓以前可能只有少數人得到的驚喜,透過社群的傳播讓大家都可以看到



JJ Lin 和友人在信義區逛街,聽到人在唱他的歌,主動上前與對方合唱《江南》後半段。



這個影片把兩個時間軸放在一起,就可知道社群媒體是傳播成功很大的主因,一下子就爆炸開了!!




紅髮艾德在拜訪加拿大商場時,聽到有個女生唱他的歌,決定加入那個女生唱的正是紅髮艾德的成名曲之一「放聲思考」(Thinking out loud)






Steven Tyler,史密斯樂團(Aerosmith) 主唱在莫斯科街頭和街頭藝人合唱他的成名曲之一 I Don't Want To Miss A Thing (我不願錯過這一切)




但是這樣的亂入要有幾個條件,

  1. 第一要件是一定要是原唱者
  2. 歌聲要能有第一句就能夠吸引聽眾
  3. 再來是,街頭上的這個人不能太弱,否則會完全被搶掉
  4. 最好在加上個故事,可以讓這個事蹟快速發酵傳播
  5. 最後最重要的是,環境不能太糟糕,否則即使是 Steven Tyler 這種等級的,一樣弱掉。


這個也是 Steven Tyler 亂入,但是環境條件不是很好所以效果不是很好。


另外,不要只發在 FB 因為它不容易分享,用 youtube or 其他不限制的影音平台才可以方便的分享。另外,多看幾個影片發現手機等級差很多。有的手機畫面還真棒.....


2015/10/18

Apache Spark 測試 FPGrowth(傳統C語言與Spark 的簡易測試)


因為剛剛把 Apache 的 Spark 設定好,順便驗證測試看看效能如何?
剛好發現 Spark 的 MLLIB 內有內建的 FPGrowth 演算法,剛好跟它有點熟所以就用這個演算法加上網路上的資料來測試看看。

先講結論:資料量小,不利於使用巨量資料工具。


關於 fpgrowth 演算法請先參考這篇:
http://blog.jangmt.com/2015/10/fpgrowth-algorithm.html

底下紀錄測試的過程,及使用的參數。

測試運算資料來源:http://fimi.ua.ac.be/data/ Frequent Itemset Mining Dataset Repository---

LAB (1)
Christian Borgelt 寫的 C 語言程式 FPGrowth 對上 Spark scala fpgrowth 程式
---
# FPGrowth 先把 -m1 同時出現的SET設為1個,支持度 5 ,信任度為 80%(default)
# 這個案例花費了 0.09s 運算了 0.01s
[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m1 -s5 T10I4D100K.dat T10I4D100K.out.txt
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading T10I4D100K.dat ... [870 item(s), 100000 transaction(s)] done [0.09s].
filtering, sorting and recoding items ... [10 item(s)] done [0.00s].
sorting and reducing transactions ... [281/100000 transaction(s)] done [0.01s].
writing T10I4D100K.out.txt ... [10 set(s)] done [0.00s].
[hadoop@hnamenode FrequentItemset]$ cat T10I4D100K.out.txt
368 (7.828)
529 (7.057)
829 (6.81)
766 (6.265)
722 (5.845)
354 (5.835)
684 (5.408)
217 (5.375)
494 (5.102)
419 (5.057)

----
上面這個 fp-growth 程式是以 同一台機器的 masternode 跑的,但是沒有 20 台 SlaveNode。
----
底下這個案例參考官方網站的範例:scala 語言的 fp-growth 程式
http://spark.apache.org/docs/latest/mllib-frequent-pattern-mining.html#fp-growth 
FPgrowth MLIB
https://spark.apache.org/docs/latest/mllib-frequent-pattern-mining.html

使用 spark 用 standalone 模式,啟動 spark-shell
spark-shell  --master spark://192.168.1.100:7077
這套 spark 有1台 masternode 以及 20 台 slavenode,

首先把檔案放到 hadoop HDFS 內
[hadoop@hnamenode FrequentItemset]$ hdfs dfs -ls /public/FrequentItemset
Found 4 items
-rw-r--r--   3 hadoop supergroup    4022055 2015-10-17 21:39 /public/FrequentItemset/T10I4D100K.dat
-rw-r--r--   3 hadoop supergroup   15478113 2015-10-17 21:39 /public/FrequentItemset/T40I10D100K.dat
-rw-r--r--   3 hadoop supergroup         68 2015-10-17 21:42 /public/FrequentItemset/sample_fpgrowth.txt
-rw-r--r--   3 hadoop supergroup 1481890176 2015-10-17 23:13 /public/FrequentItemset/webdocs.dat

---
Apache Spark scala FPGrowth 並將支持度、出現數量設定為一樣。
---
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.fpm.FPGrowth

val data = sc.textFile("/public/FrequentItemset/T10I4D100K.dat")

val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' '))

# setMinSupport(0.05) 為./fpgrowth程式的 -s5
val fpg = new FPGrowth().setMinSupport(0.05).setNumPartitions(10)
val model = fpg.run(transactions)

model.freqItemsets.collect().foreach { itemset =>
  println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}


# 這是信任度 80%,可以忽略不計
val minConfidence = 0.8
model.generateAssociationRules(minConfidence).collect().foreach { rule =>
  println(
    rule.antecedent.mkString("[", ",", "]")
      + " => " + rule.consequent .mkString("[", ",", "]")
      + ", " + rule.confidence)
}
----
時間:約 40s
----
[368], 7828
[529], 7057
[829], 6810
[766], 6265
[722], 5845
[354], 5835
[684], 5408
[217], 5375
[494], 5102
[419], 5057

----
LAB(1)結果:
不用比了,Christian Borgelt 寫的 C 語言程式 FPGrowth  狂勝。
Spark 跑了快約 40 - 50 秒因為在分散資料及 I/O 的時間浪費太多了...
但這例子先確認正確的這樣產生的結果是一樣的,後續的比對才可以繼續下去。
----


----
LAB (2) 資料檔案更換為  http://fimi.ua.ac.be/data/webdocs.dat.gz 來測試
webdocs.dat 檔案約 1.4GB 
----
# 花費 39.75 + 2.02 + 1.57 = 43.34 秒
[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m1 -s50 webdocs.dat webdocs.out
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading webdocs.dat ... [5267656 item(s), 1692082 transaction(s)] done [39.75s].
filtering, sorting and recoding items ... [5 item(s)] done [2.02s].
sorting and reducing transactions ... [32/1692082 transaction(s)] done [1.57s].
writing webdocs.out ... [10 set(s)] done [0.00s].

[hadoop@hnamenode FrequentItemset]$ more webdocs.out
122 (84.4832)
8 122 (72.566)
8 (77.4013)
49 122 (65.9012)
49 8 122 (61.1858)
49 8 (63.1131)
49 (69.6349)
124 122 (50.2531)
124 (52.4418)
516 (50.7154)

---
scala FPGrowth
---
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.fpm.FPGrowth

# 檔案放到 HDFS 內
val data = sc.textFile("/public/FrequentItemset/webdocs.dat")

val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' '))

val fpg = new FPGrowth().setMinSupport(0.5).setNumPartitions(10)
val model = fpg.run(transactions)

model.freqItemsets.collect().foreach { itemset =>
  println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}

val minConfidence = 0.8
model.generateAssociationRules(minConfidence).collect().foreach { rule =>
  println(
    rule.antecedent.mkString("[", ",", "]")
      + " => " + rule.consequent .mkString("[", ",", "]")
      + ", " + rule.confidence)
}

----
15/10/18 02:48:47
15/10/18 02:49:34  共花費 47秒
----
[122], 1429525
[8], 1309694
[8,122], 1227876
[49], 1178279
[49,8], 1067926
[49,8,122], 1035314
[49,122], 1115102
[124], 887358
[124,122], 850323
[516], 858146
----
LAB(2) 結果:
47 > 43 仍是傳統作法獲勝,但是時間上已經相差不多。資料量確實影響了計算的速度。
----


----
LAB (3) 
----
接著繼續把檔案放大,這個 webdocs.dat 檔案放大 *2 , *4 , * 10 的倍數來測試。
-rw-rw-r--. 1 hadoop hadoop  14G Oct 18 00:29 webdocs10.dat
-rw-rw-r--. 1 hadoop hadoop 2.8G Oct 18 00:29 webdocs2.dat
-rw-rw-r--. 1 hadoop hadoop 5.6G Oct 18 00:29 webdocs4.dat
-rw-rw-r--. 1 hadoop hadoop 1.4G Oct 14  2010 webdocs.dat

-----
此處以 webdocs10.dat 這個 14G 的檔案來說,如果以傳統的方法會遇到巨大的困難
光是 load 資料到記憶體就花了 436.84s ,運算 8.30s + 15.03s 約計 460 秒
-----
[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m1 -s50 webdocs10.dat webdocs10.out
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading webdocs10.dat ... [5267656 item(s), 16920820 transaction(s)] done [436.84s].
filtering, sorting and recoding items ... [5 item(s)] done [8.30s].
sorting and reducing transactions ... [32/16920820 transaction(s)] done [15.03s].
writing webdocs10.out ... [10 set(s)] done [0.00s].
----
[hadoop@hnamenode FrequentItemset]$ cat webdocs10.out 
122 (84.4832)
8 122 (72.566)
8 (77.4013)
49 122 (65.9012)
49 8 122 (61.1858)
49 8 (63.1131)
49 (69.6349)
124 122 (50.2531)
124 (52.4418)
516 (50.7154)

-----
如果以 Spark Scala FPGrowth 運算,它透過分散運算到 20 台 pc 配合 hdfs 分散存取
spark-shell  --master spark://192.168.1.100:7077
----
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.fpm.FPGrowth

# 更換檔案為 /public/FrequentItemset/webdocs10.dat (在 HDFS內)
val data = sc.textFile("/public/FrequentItemset/webdocs10.dat")

val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' '))

# 條件一樣
val fpg = new FPGrowth().setMinSupport(0.5).setNumPartitions(10)
val model = fpg.run(transactions)

model.freqItemsets.collect().foreach { itemset =>
  println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}
----
15/10/18 02:18:29 開始
15/10/18 02:20:28 結束,約 119 秒
[122], 14295250
[8], 13096940
[8,122], 12278760
[49], 11782790
[49,8], 10679260
[49,8,122], 10353140
[49,122], 11151020
[124], 8873580
[124,122], 8503230
[516], 8581460
----

Spark 工作流程
Spark 運算流程 https://spark.apache.org/docs/1.5.1/img/cluster-overview.png 

----
心得:
* 使用 Hadoop or Spark 這類的 big data 運算工具,初期消耗的運算成本很高,當資料量大到超過一般機器無法處理的程度時,才能顯示它和傳統運算的差異。

* 就這陣子測試的心得,如果你的資料量大於 1GB 後才有使用巨量運算的價值。

* 不過,兩種方式本來就是不一樣,硬是拿來比較不是很妥當。在適當的資料量,選擇適合的工具,才是比較正確的作法。


關聯規則--用來發現資料中屬性具有高度關聯的樣式(fpgrowth algorithm)


這篇不是要講很艱深的東西,簡單解釋一下啥事關聯規則。


基本上上面這張購物欄交易資料,透過底下的 apriori 演算法程式,可以找到啤酒和尿布具有很大的相關性,他的支持度高達 50 。故事請看這裡。這是個範例,只是說明關聯規則程式可發覺這樣形式的規則關聯樣式。



在網路上有個人 Christian Borgelt 寫了很多程式,其中有 apriori 和 fpgrowth ,基本上這兩個程式做的工作差不多,但是 fpgrowth 有效率多了。

所以今天用這個 fpgrowth 程式來跑跑看數據。

我從:http://fimi.ua.ac.be/data/ Frequent Itemset Mining Dataset Repository 抓了很多資料
http://fimi.ua.ac.be/data/T10I4D100K.dat
http://fimi.ua.ac.be/data/T40I10D100K.dat
http://fimi.ua.ac.be/data/webdocs.dat.gz

放到我的電腦內,然後去找 Christian Borgelt http://www.borgelt.net/fpgrowth.html 抓了一些程式。
大概長的這樣:
[hadoop@hnamenode FrequentItemset]$ ls -la
-rwxrwxr-x. 1 hadoop hadoop      486760 Sep  5 05:17 fpgrowth
-rw-rw-r--. 1 hadoop hadoop     4022055 Oct 14  2010 T10I4D100K.dat
-rw-rw-r--. 1 hadoop hadoop    15478113 Oct 14  2010 T40I10D100K.dat
-rw-rw-r--. 1 hadoop hadoop         151 Oct 17 23:15 webdocs.out

有個很簡單的檔案  sample_fpgrowth.txt

[hadoop@hnamenode FrequentItemset]$ cat sample_fpgrowth.txt 
r z h k p
z y x w v u t s
s x o n r
x z y m t s q e
z
x z y r q t p

# -m3 為找出三個元素在一起 , -s50 支持度 50  , 預設信任度為 80%
[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m3 -s50 sample_fpgrowth.txt sample_fpgrowth.out
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading sample_fpgrowth.txt ... [17 item(s), 6 transaction(s)] done [0.00s].
filtering, sorting and recoding items ... [6 item(s)] done [0.00s].
sorting and reducing transactions ... [4/6 transaction(s)] done [0.00s].
writing sample_fpgrowth.out ... [5 set(s)] done [0.00s].

[hadoop@hnamenode FrequentItemset]$ cat sample_fpgrowth.out 
y x z (50)
t z x y (50)
t z x (50)
t z y (50)
t x y (50)

可以知道上面這五個組合,是 sample_fpgrowth.txt 這裡最常出現的組合。

後來繼續用 fpgrowth 依序分析底下這些檔案,做了一些範例。
[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m2 -s1 T10I4D100K.dat T10I4D100K.out.txt
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading T10I4D100K.dat ... [870 item(s), 100000 transaction(s)] done [0.09s].
filtering, sorting and recoding items ... [375 item(s)] done [0.01s].
sorting and reducing transactions ... [87314/100000 transaction(s)] done [0.02s].
writing T10I4D100K.out.txt ... [10 set(s)] done [0.09s].
[hadoop@hnamenode FrequentItemset]$ cat T10I4D100K.out.txt
829 368 (1.194)
789 829 (1.194)
682 368 (1.193)
346 217 (1.336)
825 39 (1.187)
390 722 (1.042)
227 390 (1.049)
704 39 (1.107)
704 825 39 (1.035)
704 825 (1.102)

[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m3 -s2 T40I10D100K.dat T40I10D100K.out.txt
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading T40I10D100K.dat ... [942 item(s), 100000 transaction(s)] done [0.29s].
filtering, sorting and recoding items ... [610 item(s)] done [0.01s].
sorting and reducing transactions ... [99929/100000 transaction(s)] done [0.13s].
writing T40I10D100K.out.txt ... [6 set(s)] done [1.81s].

[hadoop@hnamenode FrequentItemset]$ cat T40I10D100K.out.txt
829 529 368 (2.288)
217 529 368 (2.181)
682 489 368 (2.42)
692 529 368 (2.373)
895 937 368 (2.081)
198 937 368 (2.099)


[hadoop@hnamenode FrequentItemset]$ ./fpgrowth -m6 -s23 webdocs.dat webdocs.out.txt
./fpgrowth - find frequent item sets with the fpgrowth algorithm
version 6.7 (2015.08.18)         (c) 2004-2015   Christian Borgelt
reading webdocs.dat ... [5267656 item(s), 1692082 transaction(s)] done [40.53s].
filtering, sorting and recoding items ... [39 item(s)] done [2.25s].
sorting and reducing transactions ... [959755/1692082 transaction(s)] done [3.50s].
writing webdocs.out.txt ... [13 set(s)] done [1.47s].

[hadoop@hnamenode FrequentItemset]$ cat webdocs.out.txt
171 124 516 49 8 122 (24.2785)
51 124 516 49 8 122 (26.1091)
51 171 516 49 8 122 (23.7428)
121 124 516 49 8 122 (26.9704)
121 51 516 49 8 122 (26.0395)
121 51 124 49 8 122 (24.6961)
121 51 124 516 8 122 (23.2243)
121 171 516 49 8 122 (24.2021)
121 171 124 49 8 122 (23.0385)
60 124 516 49 8 122 (24.0302)
60 121 516 49 8 122 (24.4904)
60 121 124 49 8 122 (23.5529)
60 51 516 49 8 122 (23.2219)

如果仔細看可以得知,這幾個檔案容量大小差很多。可以仔細觀察它門的執行時間。
-rw-r--r--. 1 hadoop hadoop   68 Oct 17 22:12 sample_fpgrowth.txt
-rw-rw-r--. 1 hadoop hadoop 3.9M Oct 14  2010 T10I4D100K.dat
-rw-rw-r--. 1 hadoop hadoop  15M Oct 14  2010 T40I10D100K.dat
-rw-rw-r--. 1 hadoop hadoop 1.4G Oct 14  2010 webdocs.dat

除了 webdocs.dat 這個檔案,跑比較久外,其他都很快。
講這多,就是剛有機會用 apache spark 來跑   fpgrowth algorithm 想要知道揪竟 big data 要多大才有他的效益。

延伸閱讀:
Apache Spark 測試 FPGrowth(傳統C語言與Spark 的簡易測試)http://blog.jangmt.com/2015/10/apache-spark-fpgrowthcspark.html

2015/10/17

Hadoop HDFS 上傳檔案速度測試


因為不太清楚 Hadoop HDFS 在傳輸檔案的速度,所以寫了一個小程式來測試 HDFS 上傳檔案的速度。

先講結論:hdfs 大概會花3秒的時間做協調的傳輸工作,所以大約 1MB 左右的時間都是 3 秒。傳輸的檔案越大,速度越快。

結果整理如下:

容量      傳輸時間  平均速度(MBytes)
110K 3 36KB/S
1.1MB 3 375KB/S
10.7MB   4 2739.2KB/S --> 2.675MB
107.1MB   9   11.9MB/S
1.0GB   23 44.521MB/S
11GB   216 52.148MB/S

過程及程式測試 shell script
[hadoop@hnamenode input]$ cat run_put.sh
#!/bin/bash
ARGC1='input.txt'
ARGC1=$1
if [ "ARGC1" != "" ]; then
PROG_START=$(date +%s)
hdfs dfs -put ${ARGC1} /public/data/
PROG_END=$(date +%s)
PROG_DURING=$(expr $PROG_END - $PROG_START)
echo "上傳 ${ARGC1} 檔案到 HDFS:/public/data/ 目錄下"
echo "花費時間: ${PROG_DURING} 秒"
hdfs dfs -ls -h /public/data/${ARGC1}
fi

[hadoop@hnamenode input]$ ls -alh
total 12G
drwxrwxr-x. 2 hadoop hadoop 4.0K Oct 17 13:23 .
drwxrwxr-x. 4 hadoop hadoop 4.0K Oct  4 00:26 ..
-rw-rw-r--. 1 hadoop hadoop  11G Oct  1 22:33 input100K.txt
-rw-rw-r--. 1 hadoop hadoop  11M Oct  1 22:31 input100.txt
-rw-rw-r--. 1 hadoop hadoop 1.1G Oct  1 22:32 input10K.txt
-rw-rw-r--. 1 hadoop hadoop 1.1M Oct  1 22:30 input10.txt
-rw-rw-r--. 1 hadoop hadoop 108M Oct  1 22:31 input1K.txt
-rw-r--r--. 1 hadoop hadoop 110K Oct  1 22:18 input.txt
-rwxrwxr-x. 1 hadoop hadoop  343 Oct 17 13:23 run_put.sh

[hadoop@hnamenode input]$ ./run_put.sh input.txt
上傳 input.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 3 秒
-rw-r--r--   3 hadoop supergroup    109.7 K 2015-10-17 13:32 /public/data/input.txt
[hadoop@hnamenode input]$ ./run_put.sh input10.txt
上傳 input10.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 3 秒
-rw-r--r--   3 hadoop supergroup      1.1 M 2015-10-17 13:24 /public/data/input10.txt
[hadoop@hnamenode input]$ ./run_put.sh input100.txt
上傳 input100.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 4 秒
-rw-r--r--   3 hadoop supergroup     10.7 M 2015-10-17 13:25 /public/data/input100.txt
[hadoop@hnamenode input]$ ./run_put.sh input1K.txt
上傳 input1K.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 9 秒
-rw-r--r--   3 hadoop supergroup    107.1 M 2015-10-17 13:25 /public/data/input1K.txt
[hadoop@hnamenode input]$ ./run_put.sh input10K.txt
上傳 input10K.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 23 秒
-rw-r--r--   3 hadoop supergroup      1.0 G 2015-10-17 13:26 /public/data/input10K.txt
[hadoop@hnamenode input]$ ./run_put.sh input100K.txt
上傳 input100K.txt 檔案到 HDFS:/public/data/ 目錄下
花費時間: 216 秒
-rw-r--r--   3 hadoop supergroup      10.5 G 2015-10-17 13:31 /public/data/input100K.txt


2015/10/11

chrony 網路對時服務


----
chrony 網路對時服務
----
NTPd 套件在 CentOS 7 以後,逐漸被棄用了。改成 chrony 套件提供服務

# 安裝 chrony 移除 ntp ,並啟動服務
yum remove -y ntp
yum install -y chrony
systemctl start chronyd.service
systemctl enable chronyd.service

# 驗證程序是否工作
[root@hnamenode ~]# systemctl status chronyd.service
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since Sat 2015-10-10 15:57:08 CST; 23h ago
 Main PID: 886 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─886 /usr/sbin/chronyd -u chrony

Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw systemd[1]: Starting NTP client/server...
Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw chronyd[886]: chronyd version 1.29.1 starting
Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw chronyd[886]: Linux kernel major=3 minor=10 patch=0
Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw chronyd[886]: hz=100 shift_hz=7 freq_scale=1.00000000 nominal...l=2
Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw chronyd[886]: Frequency -21.302 +/- 0.046 ppm read from /var/...ift
Oct 10 15:57:08 hnamenode.cm.nsysu.edu.tw systemd[1]: Started NTP client/server.
Oct 10 15:57:22 hnamenode.cm.nsysu.edu.tw chronyd[886]: Selected source 120.119.31.1
Oct 10 16:02:32 hnamenode.cm.nsysu.edu.tw chronyd[886]: Selected source 140.117.69.1
Oct 11 15:36:00 hnamenode.cm.nsysu.edu.tw systemd[1]: Started NTP client/server.
Hint: Some lines were ellipsized, use -l to show in full.

# 觀看目前的同步狀態
[root@hnamenode ~]# chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||                                                /   xxxx = adjusted offset,
||         Log2(Polling interval) -.             |    yyyy = measured offset,
||                                  \            |    zzzz = estimated error.
||                                   |           |                        
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* cm.nsysu.edu.tw               3  10   377   903  +7941ns[  +35us] +/-   22ms
^- atelieralica.idv.tw           3   9   135   410    -52ms[  -52ms] +/-  426ms
^- venus.stu.edu.tw              2  10   377    63  -3401us[-3401us] +/-   71ms
^- edm.butyshop.com              3   9   337   398  -3305us[-3305us] +/-   66ms

R in HADOOP - install


R in HADOOP - install
----------------

就是再 R 透過 lib 呼叫 HADOOP 的 api 跑 hdfs 及 mapreduce 程式

------
Step 0 : 先把 hadoop 的系統環境變數確認,可以用 env 看到底下設定的環境變數
------
# 底下為我設定的範例,請以你的 hadoop env 路徑修改
[root@hdatanode17 ~]# cat .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi


# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

# ----------------------------------------------
# HADOOP ENV
# ----------------------------------------------
#JAVA
export JAVA_HOME=/usr/java/latest
export JRE_HOME=/usr/java/latest/jre

# HADOOP
export HADOOP_PREFIX=/home/hadoop/hadoop
export HADOOP_HOME=$HADOOP_PREFIX
export HADOOP_COMMON_HOME=$HADOOP_PREFIX
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HADOOP_HDFS_HOME=$HADOOP_PREFIX
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
export HADOOP_YARN_HOME=$HADOOP_PREFIX
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx1g"

export YARN_HOME=$HADOOP_HOME
#export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
#export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

# mapreduce app
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

# R-HADOOP
export HADOOP_CMD=$HADOOP_PREFIX/bin/hadoop
export HADOOP_STREAMING="$HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar"

# HIVE
export HIVE_HOME=/home/hadoop/apache-hive

# ANT
export ANT_LIB=/usr/java/ant/lib
export ANT_HOME=/usr/java/ant/

# Maven
export MAVEN_HOME=/usr/java/maven/
export MAVEN_LIB=/usr/java/maven/lib

# PIG
export PIG_HOME=/home/hadoop/apache-pig

# SCALA
export SCALA_HOME=/usr/local/scala/scala-2.11.7

# SPARK
export SPARK_HOME=/home/hadoop/apache-spark/

# APP ENV
export PATH=$PATH:$PIG_HOME/bin:$HIVE_HOME/bin:$HADOOP_PREFIX/sbin:$HADOOP_PREFIX/bin:$ANT_HOME/bin:$MAVEN_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin

# JAVA ENV
export PATH=$PATH:$HADOOP_PREFIX/sbin:$HADOOP_PREFIX/bin:$JAVA_HOME/bin:$JRE_HOME/bin

# 重新 load .bash_profile  設定檔,讓目前的環境變數可以動作生效
[root@hdatanode17 ~]# source .bash_profile
# env 指令可以驗證
[root@hdatanode17 ~]# env

------
Step 1 :先執行做 R javareconf 確定預設的 javareconf 路徑是正確的才進行後續的安裝,不對的話請修正 java 路徑
------
[root@hdatanode17 ~]# echo $JAVA_HOME
/usr/java/latest

[root@hdatanode17 dl]# java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

[root@hdatanode17 ~]#  R CMD javareconf
Java interpreter : /usr/java/latest/jre/bin/java
Java version     : 1.8.0_51
Java home path   : /usr/java/latest
Java compiler    : /usr/java/latest/bin/javac
Java headers gen.: /usr/java/latest/bin/javah
Java archive tool: /usr/java/latest/bin/jar
Java archive tool: /usr/java/latest/bin/jar

trying to compile and link a JNI program
detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -m64 -std=gnu99 -I/usr/include/R -DNDEBUG -I/usr/java/latest/include -I/usr/java/latest/include/linux -I/usr/local/include    -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic  -c conftest.c -o conftest.o
gcc -m64 -std=gnu99 -shared -L/usr/lib64/R/lib -Wl,-z,relro -o conftest.so conftest.o -L/usr/java/latest/jre/lib/amd64/server -ljvm -L/usr/lib64/R/lib -lR


JAVA_HOME        : /usr/java/latest
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib64/R
Done.

------
Step 2 : 安裝更新 R base
------
[root@hdatanode17 ~]# yum install R -y

------
Step 3 : 用 Root 進入 R 安裝 rmr2 所需要的libs ,先從 CRAN 抓檔案,沒有的再抓檔案編譯。
------
[root@hdatanode17 ~]#  R
# 自動化步驟:(底下你可以直接複製貼入 R 內)
chooseCRANmirror(ind=83);
install.packages(c("codetools","R","Rcpp","RJSONIO","bitops","digest","functional","stringr","plyr","reshape2","rJava","caTools"));

------
Step 4: 安裝 rmr2 and rhdfs 套件
------
軟體可以到這裡抓: https://github.com/RevolutionAnalytics/RHadoop/wiki
以 rmr2 (3.3.0) 為例,抓取檔案:
wget --no-check-certificate https://raw.github.com/RevolutionAnalytics/rmr2/3.3.1/build/rmr2_3.3.1.tar.gz
命令列安裝:
R CMD INSTALL rmr2_3.3.1.tar.gz

以rhdfs (1.0.8) 為例,抓取檔案:
wget --no-check-certificate  https://raw.github.com/RevolutionAnalytics/rhdfs/master/build/rhdfs_1.0.8.tar.gz
命令列安裝:
R CMD INSTALL rhdfs_1.0.8.tar.gz

如果寫批次命令,如下列,可以直接貼到命令列安裝:
R CMD INSTALL bitops_1.0-6.tar.gz
R CMD INSTALL caTools_1.17.1.tar.gz
R CMD INSTALL digest_0.6.8.tar.gz
R CMD INSTALL functional_0.6.tar.gz
R CMD INSTALL magrittr_1.5.tar.gz
R CMD INSTALL plyr_1.8.3.tar.gz
R CMD INSTALL Rcpp_0.12.0.tar.gz
R CMD INSTALL reshape2_1.4.1.tar.gz
R CMD INSTALL rJava_0.9-7.tar.gz
R CMD INSTALL RJSONIO_1.3-0.tar.gz
R CMD INSTALL stringi_0.5-5.tar.gz
R CMD INSTALL stringr_1.0.0.tar.gz
R CMD INSTALL rhdfs_1.0.8.tar.gz
R CMD INSTALL rmr2_3.3.1.tar.gz

------
Step 5 :驗證安裝是否正確, rmr2 and rhdfs 是否可以工作?
------
[root@hdatanode20 R]# R
Sys.getenv()
Sys.setenv(HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop")
Sys.setenv(JAVA_HOME="/usr/java/latest")
Sys.setenv(HADOOP_STREAMING="/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar")
library(rhdfs)
library(rmr2)
hdfs.init()
hdfs.ls("/")
q()

執行的過程大概是這樣結果,主要看 rmr2 及 rhdfs 的 lib load 過程:
[root@hdatanode20 R]# R

..略 ...

> Sys.setenv(HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop")
> Sys.setenv(JAVA_HOME="/usr/java/latest")
> Sys.setenv(HADOOP_STREAMING="/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar")
> library(rhdfs)
Loading required package: rJava

HADOOP_CMD=/home/hadoop/hadoop/bin/hadoop

Be sure to run hdfs.init()
> library(rmr2)
Please review your hadoop settings. See help(hadoop.settings)
Warning message:
S3 methods ‘gorder.default’, ‘gorder.factor’, ‘gorder.data.frame’, ‘gorder.matrix’, ‘gorder.raw’ were declared in NAMESPACE but not found
> hdfs.init()
15/10/11 00:46:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
> hdfs.ls("/")
  permission  owner      group size          modtime    file
1 drwxr-xr-x hadoop supergroup    0 2015-10-01 11:10   /home
2 drwxr-xr-x hadoop supergroup    0 2015-09-29 14:03 /public
3 drwxrwxrwx hadoop supergroup    0 2015-10-02 12:57    /tmp
4 drwxr-xr-x hadoop supergroup    0 2015-10-01 14:10   /user
> q()
Save workspace image? [y/n/c]: n
[root@hdatanode20 R]#


REF:
https://bigdatastudy.hackpad.com/ep/pad/static/IADMBeqF0vV
https://github.com/RevolutionAnalytics/RHadoop/wiki

-----------------------------------
install OK
-----------------------------------


----
以上可以寫成批次檔案執行:
----

1.建立檔案: install_pack.R
[root@hdatanode19 R]# cat install_pack.R
chooseCRANmirror(ind=83);
install.packages(c("codetools","R","Rcpp","RJSONIO","bitops","digest","functional","stringr","plyr","reshape2","rJava","caTools"));
install.packages(c("arules"));

2.建立檔案: install_check.R
[root@hdatanode19 R]# cat install_check.R
Sys.getenv()
Sys.setenv(HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop")
Sys.setenv(JAVA_HOME="/usr/java/latest")
Sys.setenv(HADOOP_STREAMING="/home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar")
library(rhdfs)
library(rmr2)
hdfs.init()
hdfs.ls("/")

3.建立檔案: install_lib.sh
[root@hdatanode19 R]# cat install_lib.sh 
#/bin/bash
P='/root/dl/R/'
R CMD javareconf
R CMD BATCH ${P}install_pack.R
R CMD INSTALL ${P}bitops_1.0-6.tar.gz
R CMD INSTALL ${P}caTools_1.17.1.tar.gz
R CMD INSTALL ${P}digest_0.6.8.tar.gz
R CMD INSTALL ${P}functional_0.6.tar.gz
R CMD INSTALL ${P}magrittr_1.5.tar.gz
R CMD INSTALL ${P}plyr_1.8.3.tar.gz
R CMD INSTALL ${P}Rcpp_0.12.0.tar.gz
R CMD INSTALL ${P}reshape2_1.4.1.tar.gz
R CMD INSTALL ${P}rJava_0.9-7.tar.gz
R CMD INSTALL ${P}RJSONIO_1.3-0.tar.gz
R CMD INSTALL ${P}stringi_0.5-5.tar.gz
R CMD INSTALL ${P}stringr_1.0.0.tar.gz
R CMD INSTALL ${P}rhdfs_1.0.8.tar.gz
R CMD INSTALL ${P}rmr2_3.3.1.tar.gz
R CMD javareconf
R CMD BATCH ${P}install_check.R 

4. 把會用到的檔案都先抓下來
[root@hdatanode19 R]# ls -la *.tar.gz
-rw-r--r--. 1 hadoop hadoop    8734 Sep 10 21:10 bitops_1.0-6.tar.gz
-rw-r--r--. 1 hadoop hadoop   63358 Sep 10 21:10 caTools_1.17.1.tar.gz
-rw-r--r--. 1 root   root     36464 Jun 25 00:01 chron_2.3-47.tar.gz
-rw-rw-r--. 1 hadoop hadoop  949746 Oct  2  2014 data.table_1.9.4.tar.gz
-rw-r--r--. 1 hadoop hadoop   97985 Sep 10 21:10 digest_0.6.8.tar.gz
-rw-r--r--. 1 hadoop hadoop    2794 Sep 10 21:10 functional_0.6.tar.gz
-rw-r--r--. 1 hadoop hadoop  200504 Sep 10 21:10 magrittr_1.5.tar.gz
-rw-r--r--. 1 hadoop hadoop  392337 Sep 10 21:10 plyr_1.8.3.tar.gz
-rw-r--r--. 1 hadoop hadoop 2297548 Sep 10 21:10 Rcpp_0.12.0.tar.gz
-rw-r--r--. 1 hadoop hadoop   34693 Sep 10 21:10 reshape2_1.4.1.tar.gz
-rw-rw-r--. 1 hadoop hadoop   25105 Sep  7 22:48 rhdfs_1.0.8.tar.gz
-rw-r--r--. 1 hadoop hadoop  711181 Sep 10 21:10 rJava_0.9-7.tar.gz
-rw-r--r--. 1 hadoop hadoop 1148375 Sep 10 21:10 RJSONIO_1.3-0.tar.gz
-rw-rw-r--. 1 hadoop hadoop   63137 Sep  7 22:49 rmr2_3.3.1.tar.gz
-rw-rw-r--. 1 hadoop hadoop   29205 Nov  7  2014 sqldf_0.4-10.tar.gz
-rw-r--r--. 1 hadoop hadoop 3639183 Sep 10 21:10 stringi_0.5-5.tar.gz
-rw-r--r--. 1 hadoop hadoop   34880 Sep 10 21:10 stringr_1.0.0.tar.gz

5.命令列批次執行, Rout 附檔名為執行後的結果
[root@hdatanode19 R]#./install_lib.sh
[root@hdatanode19 R]# cat install_pack.Rout
[root@hdatanode19 R]# cat install_check.Rout



2015/10/03

Linux Bash Shell for and loop (迴圈)


Linux Shell 上常用的 for in 迴圈結構,可以幫忙很多工作。

----
for in 迴圈及結構
----
# 帶入變數內容的迴圈,自訂字串
[mtchang@c7 linux_shell]$ vim for.sh
#!/bin/bash
for VAR in file1 file2 file3
do
echo $VAR
done

# 設定可以執行權
[mtchang@c7 linux_shell]$ chmod +x for.sh 

# 執行
[mtchang@c7 linux_shell]$ ./for.sh 
file1
file2
file3

----
for in 迴圈及結構,搭配程式執行結果
----
# 將某個檔案或是程式執行的結果,帶入 for 迴圈內。
[mtchang@c7 linux_shell]$ head /etc/passwd | cut -f 1 -d:
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

$ 使用 $() 將程式結果變成變數內容
[mtchang@c7 linux_shell]$ cat for_fileread.sh 
#!/bin/bash
for VAR in $(head /etc/passwd | cut -f 1 -d:)
do
echo $VAR
done

# 執行
[mtchang@c7 linux_shell]$ ./for_fileread.sh 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

----
for in 進階的新功能
----
# 程式
[mtchang@c7 linux_shell]$ cat for_adv.sh 
#!/bin/bash
for i in {1..5}
do
   echo "for loop 產生 1-5 目前內容為 $i "
done

echo 'Bash V4.0+ 功能 {START..END..INCREMENT} '
echo "Bash 版本 ${BASH_VERSION}"
for i in {1..12..2}
do
   echo "for loop 產生 1-12 目前內容為 $i 間隔為 2"
done

[mtchang@c7 linux_shell]$ chmod +x for_adv.sh 

# 執行
[mtchang@c7 linux_shell]$ ./for_adv.sh 
for loop 產生 1-5 目前內容為 1 
for loop 產生 1-5 目前內容為 2 
for loop 產生 1-5 目前內容為 3 
for loop 產生 1-5 目前內容為 4 
for loop 產生 1-5 目前內容為 5 
Bash V4.0+ 功能 {START..END..INCREMENT} 
Bash 版本 4.2.46(1)-release
for loop 產生 1-12 目前內容為 1 間隔為 2
for loop 產生 1-12 目前內容為 3 間隔為 2
for loop 產生 1-12 目前內容為 5 間隔為 2
for loop 產生 1-12 目前內容為 7 間隔為 2
for loop 產生 1-12 目前內容為 9 間隔為 2
for loop 產生 1-12 目前內容為 11 間隔為 2


我覺的這個 for in 就可以解決大部份的問題了,其他詳細的可以看這一邊 http://www.cyberciti.biz/faq/bash-for-loop/

2015/09/28

使用 Spine 加速 Cacti 的輪循裝置速度

----
使用 Spine 加速 Cacti 的輪循裝置速度
----
http://www.cacti.net/spine_info.php
Spine, formerly Cactid, is a poller for Cacti that primarily strives to be as fast as possible. For this reason it is written in native C, makes use of POSIX threads, and is linked directly against the net-snmp library for minmumal SNMP polling overhead. Spine is a replacement for the default cmd.php poller so you must decide if using Spine makes sense for your installation.

Spine 是 Cacti 用來加入輪循的程式,使用原生的 C 及支援 POSIX 的 threads 來加入輪循主機的效率。在 Cacti 預設是使用 cmd.php 來當成 poller ,如果你有 poller 時間過長的問題可以考慮使用 spine 來處理。

你可以透過, log 檔來判斷你是否需要 spine
Console -> Utilities -> View Cacti Log File

底下例子是 cmd.php 使用了 190 秒的時間,離上限 300 秒很接近了。
09/28/2015 08:25:12 PM - SYSTEM STATS: Time:190.7159 Method:cmd.php Processes:100 Threads:N/A Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
這個案例就有改善的必要。

----
spine 的安裝
----
http://www.cacti.net/spine_install_unix.php
Spine 需要底下這些 lib 如果沒裝的話,可以再補上去。

net-snmp utilities and development libraries
mysql utilities, server and development libraries
openssl development libraries

例如:mysql 的 lib
yum install mysql++-devel -y

spine 沒有現成的 binary 檔案,請自行編譯
----
wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.8f.tar.gz
tar zxvf cacti-spine-0.8.8f.tar.gz 
cd cacti-spine-0.8.8f
./configure 
make
sudo make install

# 找一下 spine 安裝去那了
[root@mail ~]# whereis spine
spine: /usr/local/spine

# 建立 spine 的設定檔,用來直接存取 mysql DB , 請設定和你的 cacti 一樣
[root@mail spine]# cat /usr/local/spine/etc/spine.conf 
DB_Host         localhost
DB_Database     cacti
DB_User         cactiuser
DB_Pass         cactiuser
DB_Port         3306

# spine 的路徑
[root@mail spine]# /usr/local/spine/bin/spine --help
SPINE 0.8.8f  Copyright 2002-2015 by The Cacti Group
Usage: spine [options] [[firstid lastid] || [-H/--hostlist='hostid1,hostid2,...,hostidn']]
... skip ...


----
spine 設定在 cacti 內
----

填入 spine 的程式路徑,讓 cacti 找到它
填入 spine 的程式路徑,讓 cacti 找到它

修改 poller type 為 spine 並設定 porcess 及 threads 的數量
修改 poller type 為 spine 並設定 porcess 及 threads 的數量


觀察 log 看看 poller 時間的變化
觀察 log 看看 poller 時間的變化

以這個案例而言,更換以後效能突飛猛進....差了快 10 倍。
09/28/2015 09:12:16 PM - SYSTEM STATS: Time:15.2687 Method:spine Processes:100 Threads:10 Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 09:07:21 PM - SYSTEM STATS: Time:20.1201 Method:spine Processes:100 Threads:10 Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 09:02:25 PM - SYSTEM STATS: Time:23.3930 Method:spine Processes:100 Threads:10 Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 08:57:17 PM - SYSTEM STATS: Time:15.7469 Method:spine Processes:100 Threads:60 Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 08:52:20 PM - SYSTEM STATS: Time:18.7691 Method:spine Processes:100 Threads:60 Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 08:50:16 PM - SYSTEM STATS: Time:194.3420 Method:cmd.php Processes:100 Threads:N/A Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1877
09/28/2015 08:43:43 PM - SYSTEM STATS: Time:100.7800 Method:cmd.php Processes:100 Threads:N/A Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 08:38:34 PM - SYSTEM STATS: Time:92.6313 Method:cmd.php Processes:100 Threads:N/A Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433
09/28/2015 08:34:33 PM - SYSTEM STATS: Time:151.5439 Method:cmd.php Processes:100 Threads:N/A Hosts:68 HostsPerProcess:1 DataSources:3003 RRDsProcessed:1433



REF:
http://blog.jangmt.com/2015/09/centos-7-cacti.html  CACTI 安裝 ni Centos 7

Apache HADOOP 安裝多主機(cluster)模式在 CentOS Linux 7

HADOOP 安裝多主機(cluster)模式,
首先建議你要有4台電腦以上,才會好工作。

(0) 把 OS 安裝好
此範例為 CentOS Linux 7
namenode 使用 server with GUI 的安裝選項
datanode 使用 @base @core @development 的選項
/home 目錄獨立一個分割區或硬碟,給 datanode or namenode 使用。

(1) 把所有主機的 dns name 及 hostname 設定好
[hadoop@namenode ~]$ host namenode
namenode.jangmt.com has address 192.168.1.100
[hadoop@namenode ~]$ host datanode1
datanode1.jangmt.com has address 192.168.1.1
[hadoop@namenode ~]$ host datanode2
datanode2.jangmt.com has address 192.168.1.2
[hadoop@namenode ~]$ host datanode3
datanode3.jangmt.com has address 192.168.1.3

為了方便識別主機,建議將主機的名稱修改為設定的名稱
修改方式可以透過 hostnamectl 指令修改。
可以參考 http://blog.jangmt.com/2015/06/centos7-rhel7-runlevel.html 
(在 CENTOS 7 的版本可以使用 hostnamectl 來改變系統 hostname)

(2) 先達成每台主機可以 ssh key 認證
可以參考
http://blog.jangmt.com/2015/09/ssh-key-linux.html
基本上建議建立一個 hadoop 帳號,這個使用者為主要放置程式的使用者,同時也是 HDFS 的管理員。
然後 hadoop 可以登入 root , root 可以登入 hadoop 都無須密碼,這樣交換資料也相較容易。

[hadoop@namenode ~]$ ssh root@datanode1 ifconfig enp2s0
enp2s0: flags=4163  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::922b:34ff:fe24:e0c6  prefixlen 64  scopeid 0x20
        ether 90:2b:34:24:e0:c6  txqueuelen 1000  (Ethernet)
        RX packets 897188  bytes 1331862037 (1.2 GiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 191894  bytes 14979844 (14.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 1  collisions 0

[hadoop@namenode ~]$ ssh hadoop@datanode1 /sbin/ifconfig enp2s0
enp2s0: flags=4163  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::922b:34ff:fe24:e0c6  prefixlen 64  scopeid 0x20
        ether 90:2b:34:24:e0:c6  txqueuelen 1000  (Ethernet)
        RX packets 897238  bytes 1331869640 (1.2 GiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 191949  bytes 14988692 (14.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 1  collisions 0

[hadoop@namenode ~]$ ssh root@datanode1
Last login: Mon Sep 28 00:58:31 2015 from namenode.jangmt.com
[root@datanode1 ~]# ssh hadoop@localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is 15:e4:e7:62:cc:59:71:7d:2d:54:7d:6a:ba:9a:6f:10.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Last login: Mon Sep 28 00:58:21 2015 from namenode.jangmt.com

並建議在使用前都登入一次,讓  known_hosts 擁有所有主機的 key 。
做好後每一台主機的 hadoop 及 root 目錄 .ssh 類似如下:
[hadoop@namenode ~]$ ls .ssh/ -l
total 16
-rw-r--r--. 1 hadoop hadoop  391 Sep 24 17:20 authorized_keys
-rw-------. 1 hadoop hadoop 1675 Sep 24 17:20 id_rsa
-rw-r--r--. 1 hadoop hadoop  391 Sep 24 17:20 id_rsa.pub
-rw-r--r--. 1 hadoop hadoop 1943 Sep 28 00:06 known_hosts


(3) 先安裝 oracle java
可以參考這一篇:
http://blog.jangmt.com/2015/09/oracle-java-centos-linux-7.html 
僅留下 oracle 版本的 java ,移除 openjdk 檔案

[hadoop@namenode ~]$ rpm -qa | grep openjdk
[hadoop@namenode ~]$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

環境變數可於後面在一起設定好
[hadoop@namenode ~]$ env | grep JAVA
JAVA_HOME=/usr/java/latest

(4) 下載 hadoop 安裝檔及文件內容參考
hadoop 官方文件網站 2.7.1 版本
http://hadoop.apache.org/docs/r2.7.1/
單主機的安裝說明
http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html
叢集主機的安裝說明,這篇教學文件以這篇修改而來
http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/ClusterSetup.html
命令詳解
http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/CommandsManual.html
hdfs shell
http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/FileSystemShell.html

檔案下載
http://hadoop.apache.org/releases.html


(5) 更改設定檔案的內容

(5.1) namenode (主要的 master 機器)
# HDFS 的設定檔
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/hdfs-site.xml 


# 核心的主機交換資料位址
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/core-site.xml 
# 使用 yarn 管理
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/mapred-site.xml
# yarn-site 的資源管理員設定
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/yarn-site.xml 

# 設定 slave 主機,啟動後會呼叫別台主機的程式}
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/slaves
datanode1
datanode2
datanode3

# hadoop 的預設 env 變數,其中這行需要 export JAVA_HOME=/usr/java/latest 否則抓不到變數。
[hadoop@namenode ~]$ cat /home/hadoop/hadoop/etc/hadoop/hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/java/latest



(5.2) datanode 資料主機,每台都要設定。
# 問題一樣 java 變數就是找不到
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/java/latest

# yarn-site 設定
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/yarn-site.xml
# mapred 由 yarn 管管理
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/mapred-site.xml
# HDFS 設定
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/hdfs-site.xml
# 核心主機
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/core-site.xml
# slave 本機設定
[hadoop@datanode1 ~]$ cat /home/hadoop/hadoop/etc/hadoop/slaves
localhost




(5.3) 啟動環境變數

# 修改系統的 .bash_profile 檔案
[hadoop@namenode ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

# HADOOP
export HADOOP_PREFIX=/home/hadoop/hadoop
export HADOOP_HOME=$HADOOP_PREFIX
export HADOOP_COMMON_HOME=$HADOOP_PREFIX
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HADOOP_HDFS_HOME=$HADOOP_PREFIX
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
export HADOOP_YARN_HOME=$HADOOP_PREFIX
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx1g"

# mapreduce app
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

# R-HADOOP
export HADOOP_CMD=$HADOOP_PREFIX/bin/hadoop
export HADOOP_STREAMING="$HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar"

# HIVE
export HIVE_HOME=/home/hadoop/apache-hive

# ANT
export ANT_LIB=/usr/java/ant/lib
export ANT_HOME=/usr/java/ant/

# Maven
export MAVEN_HOME=/usr/java/maven/
export MAVEN_LIB=/usr/java/maven/lib

#JAVA
export JAVA_HOME=/usr/java/latest
export JRE_HOME=/usr/java/latest/jre

# PIG
export PIG_HOME=/home/hadoop/apache-pig
export PATH=$PATH:$PIG_HOME/bin:$HIVE_HOME/bin:$HADOOP_PREFIX/sbin:$HADOOP_PREFIX/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$ANT_HOME/bin:$MAVEN_HOME/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin:$HADOOP_PREFIX/bin:$JAVA_HOME/bin:$JRE_HOME/bin

[hadoop@namenode ~]$ source .bash_profile


(6) 格式化 hdfs 檔案系統
# in namenode 機器上
rm -rf /home/hadoop/namenode
mkdir /home/hadoop/namenode

# in remote datanode 1,2,3 機器上
rm -rf /home/hadoop/datanode
mkdir /home/hadoop/datanode

# 格式化
hdfs namenode -format"


(7) HDFS and YARN 啟動
# 啟動 HDFS and YARN
[hadoop@namenode happ]$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [namenode]
namenode: starting namenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-namenode.jangmt.com.out
datanode1: starting datanode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-datanode-datanode1.out
datanode2: starting datanode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-datanode-datanode2.out
datanode3: starting datanode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-datanode-datanode3.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/hadoop/hadoop/logs/hadoop-hadoop-secondarynamenode-namenode.jangmt.com.out
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-resourcemanager-namenode.jangmt.com.out
datanode2: starting nodemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-nodemanager-datanode2.out
datanode3: starting nodemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-nodemanager-datanode3.out
datanode1: starting nodemanager, logging to /home/hadoop/hadoop/logs/yarn-hadoop-nodemanager-datanode1.out

# 也可以關閉
[hadoop@namenode happ]$ stop-all.sh
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Stopping namenodes on [namenode]
namenode: stopping namenode
datanode1: stopping datanode
datanode2: stopping datanode
datanode3: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode
stopping yarn daemons
stopping resourcemanager
datanode2: no nodemanager to stop
datanode1: no nodemanager to stop
datanode3: no nodemanager to stop
no proxyserver to stop

(8) 觀看 HDFS 驗證
[hadoop@namenode happ]$ hdfs dfs -mkdir /home

[hadoop@namenode happ]$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-09-28 00:18 /home

[hadoop@namenode happ]$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-09-28 00:18 /home


(9) 使用 dfsadmin 觀看報表
[hadoop@namenode happ]$ hdfs dfsadmin -report
Configured Capacity: 932499226624 (868.46 GB)
Present Capacity: 923198201856 (859.80 GB)
DFS Remaining: 923198177280 (859.80 GB)
DFS Used: 24576 (24 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (3):

Name: 192.168.1.1:50010 (datanode1.jangmt.com)
Hostname: datanode1.jangmt.com
Decommission Status : Normal
Configured Capacity: 227524214784 (211.90 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 3100733440 (2.89 GB)
DFS Remaining: 224423473152 (209.01 GB)
DFS Used%: 0.00%
DFS Remaining%: 98.64%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon Sep 28 00:45:55 CST 2015


Name: 192.168.1.2:50010 (datanode2.jangmt.com)
Hostname: datanode2.jangmt.com
Decommission Status : Normal
Configured Capacity: 227524214784 (211.90 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 3100037120 (2.89 GB)
DFS Remaining: 224424169472 (209.01 GB)
DFS Used%: 0.00%
DFS Remaining%: 98.64%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon Sep 28 00:45:55 CST 2015


Name: 192.168.1.3:50010 (datanode3.jangmt.com)
Hostname: datanode3.jangmt.com
Decommission Status : Normal
Configured Capacity: 477450797056 (444.66 GB)
DFS Used: 8192 (8 KB)
Non DFS Used: 3100254208 (2.89 GB)
DFS Remaining: 474350534656 (441.77 GB)
DFS Used%: 0.00%
DFS Remaining%: 99.35%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon Sep 28 00:45:55 CST 2015

(10) 你可以用 jps 看服務有哪些在跑
[hadoop@namenode happ]$ pdsh_cmd jps
datanode2: 325 Jps
datanode1: 7063 Jps
datanode3: 15576 Jps
datanode2: 32555 DataNode
datanode1: 6825 DataNode
datanode2: 32667 NodeManager
datanode3: 15338 DataNode
datanode1: 6937 NodeManager
datanode3: 15451 NodeManager
namenode2: 10490 Jps
[hadoop@namenode happ]$ jps
19301 SecondaryNameNode
19959 Jps
19500 ResourceManager
19055 NameNode

(11) HDFS 圖形界面



(12) 驗證 yarn 是否工作

[hadoop@hnamenode ~]$ yarn node -list
15/09/29 12:52:55 INFO client.RMProxy: Connecting to ResourceManager at hnamenode/192.168.1.100:8050
Total Nodes:16
         Node-Id     Node-State Node-Http-Address Number-of-Running-Containers
hdatanode5.cm.nsysu.edu.tw:36921        RUNNING hdatanode5.cm.nsysu.edu.tw:8042                           0
hdatanode8.cm.nsysu.edu.tw:56617        RUNNING hdatanode8.cm.nsysu.edu.tw:8042                           0
hdatanode15.cm.nsysu.edu.tw:45558        RUNNING hdatanode15.cm.nsysu.edu.tw:8042                           0
hdatanode6.cm.nsysu.edu.tw:45475        RUNNING hdatanode6.cm.nsysu.edu.tw:8042                           0
hdatanode1.cm.nsysu.edu.tw:56762        RUNNING hdatanode1.cm.nsysu.edu.tw:8042                           0
hdatanode14.cm.nsysu.edu.tw:38758        RUNNING hdatanode14.cm.nsysu.edu.tw:8042                           0
hdatanode9.cm.nsysu.edu.tw:57619        RUNNING hdatanode9.cm.nsysu.edu.tw:8042                           0
hdatanode3.cm.nsysu.edu.tw:32826        RUNNING hdatanode3.cm.nsysu.edu.tw:8042                           0
hdatanode10.cm.nsysu.edu.tw:51220        RUNNING hdatanode10.cm.nsysu.edu.tw:8042                           0
hdatanode11.cm.nsysu.edu.tw:32837        RUNNING hdatanode11.cm.nsysu.edu.tw:8042                           0
hdatanode4.cm.nsysu.edu.tw:43196        RUNNING hdatanode4.cm.nsysu.edu.tw:8042                           0
hdatanode13.cm.nsysu.edu.tw:47358        RUNNING hdatanode13.cm.nsysu.edu.tw:8042                           0
hdatanode2.cm.nsysu.edu.tw:48404        RUNNING hdatanode2.cm.nsysu.edu.tw:8042                           0
hdatanode12.cm.nsysu.edu.tw:37563        RUNNING hdatanode12.cm.nsysu.edu.tw:8042                           0
hdatanode16.cm.nsysu.edu.tw:41908        RUNNING hdatanode16.cm.nsysu.edu.tw:8042                           0
hdatanode7.cm.nsysu.edu.tw:54982        RUNNING hdatanode7.cm.nsysu.edu.tw:8042                           0




設定檔放這裡 https://github.com/mtchang/hadoop 有錯再來修!!
gist-it.appspot.com 真的很好用 – Embed files from a github repository like a gist
以上是簡易的設定過程。

延伸閱讀:
http://chaalpritam.blogspot.tw/2015/05/hadoop-270-multi-node-cluster-setup-on.html
http://chaalpritam.blogspot.tw/2015/05/hadoop-270-single-node-cluster-setup-on.html

2015/09/27

Linux Shell -- for 迴圈

Linux Shell -- for 迴圈

Linux shell 可以使用 for 迴圈傳遞固定的值內容給迴圈內部變數

基本格式為:

for  變數  in 值1  值2  值3  
do
  echo  變數 
done

執行結果會是:
 值1  值2  值3  

# 範例如下:複製 dl 目錄到每一台主機,主機已經先設定 ssh key 認證
[hadoop@namenode happ]$ cat sync_dl2_all.sh 
#!/bin/bash
ACTION=$1
if [ "$ACTION" == "all" ]; then
  for N in 1 2 3
  do
   echo "send to datanode${N}"
   RUN="rsync -av --delete-after /home/hadoop/happ/dl hadoop@datanode${N}:/home/hadoop/"
   echo $RUN
   #echo $RUN | sh
  done
  exit 0
else
  echo "usage:$0 all"
  exit 1
fi

[hadoop@namenode happ]$ ./sync_dl2_all.sh
usage:./sync_dl2_all.sh all

[hadoop@namenode happ]$ ./sync_dl2_all.sh all
send to datanode1
rsync -av --delete-after /home/hadoop/happ/dl hadoop@datanode1:/home/hadoop/
send to datanode2
rsync -av --delete-after /home/hadoop/happ/dl hadoop@datanode2:/home/hadoop/
send to datanode3
rsync -av --delete-after /home/hadoop/happ/dl hadoop@datanode3:/home/hadoop/


#echo $RUN | sh 
註解要去除,才會正式執行。

CentOS 7 上 cacti 流量報表管理系統的安裝

CACTI 是一個結合 snmp 及 rrdtool 的流量報表管理工具,可以大量監控所有的流量報表。

使用前請先安裝及設定好
1. MariaDB
http://blog.jangmt.com/2015/09/mariadb-root-in-centos-linux-7.html

2. httpd and phpmyadmin
http://blog.jangmt.com/2015/09/centos-7-phpmyadmin.html 

3. 主機的 snmpd 服務
http://blog.jangmt.com/2015/09/centos-7-snmpd-centos-7-snmp-install.html

----
CACTI install
----
# 直接使用 yum 安裝
[root@hnamenode2 snmp]# yum install cacti -y
[root@hnamenode2 cacti]# pwd
/etc/cacti

# 安裝號後,請觀看 db.php 的設定值,建立一個 cacti 帳號
[root@hnamenode2 cacti]# cat /etc/cacti/db.php
/* make sure these values refect your actual database/host/user/password */
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cacti";
$database_password = "cactiuser";
$database_port = "3306";
$database_ssl = false;

/*
   Edit this to point to the default URL of your Cacti install
   ex: if your cacti install as at http://serverip/cacti/ this
   would be set to /cacti/
*/
//$url_path = "/cacti/";

/* Default session name - Session name must contain alpha characters */
//$cacti_session_name = "Cacti";
?>

# 以上面 /etc/cacti/db.php 的資訊,透過 phpmyadmin 建立一個 cacti 帳號,不建議使用 root 帳號。
用 phpmyadmin 建立一個帳號
用 phpmyadmin 建立一個帳號


# 在 cacti 有個預設的 sql 檔
[root@hnamenode2 cacti]# cat /usr/share/doc/cacti-0.8.8b/cacti.sql

# 把它匯入 cacti DB 內
[root@hnamenode2 cacti]# mysql -u cacti -p cacti < /usr/share/doc/cacti-0.8.8b/cacti.sql
Enter password:

# 修改 apache cacti 的設定檔
[root@hnamenode2 conf.d]# cat /etc/httpd/conf.d/cacti.conf 

# httpd 2.4 因為 CentOS 7 是 2.4 以上的版本,所以請設定這裡。
Require host localhost
Require ip 111.22. 192.168. (加入你的 ip  預設只有本機可以登入系統)


# 登入驗證,過程中如有安裝畫面,因為都已經設定好了只要 next step 即可。
http://localhost/cacti/
登入驗證後的畫面
登入驗證後的畫面


# cacti 預設帳號及密碼
帳號:admin
密碼:admin
請進入後馬上修改

# cacti 的建立流量圖的方法,大致原則如下:
1. 建立一個 host 裝置的 snmp 資訊
2. 將這個 snmp 資訊建立圖表,這個圖表會 5 min 更新一次
3. 建立一個 tree 觀看界面,有分 host 和標題,可以自行安排顯示位置。
4. 使用上 tree 的觀看界面就是最後觀看結果的地方。

# 建立 host 選 DEVICES

請填入 host 的 snmp 等相關資訊
請填入 host 的 snmp 等相關資訊

觀察下面的Data Queries 是否有資料 ooo Items
觀察下面的Data Queries 是否有資料 ooo Items



有資料的裝置可以建立圖形 Create Graphs for this Host
有資料的裝置可以建立圖形 Create Graphs for this Host


勾選所有的 Data Query snmp 資訊建立圖形
勾選所有的 Data Query snmp 資訊建立圖形



# 建立 host tree view (選 Graph Trees)
產生 Graph Trees 的標題名稱
產生 Graph Trees 的標題名稱


從建立的標題名稱,產生一個 Host Item 選項。
從建立的標題名稱,產生一個 Host Item 選項。



產生的報表,因為還沒有 5min 所以圖形還沒產生。
產生的報表,因為還沒有 5min 所以圖形還沒產生。

# 系統預設使用 cron 排程執行 cacti 的 polling 輪循所有的裝置,需要手工啟用。
# 啟動 cacti 的排程
[root@hnamenode2 cron.d]# cat /etc/cron.d/cacti 
*/5 * * * * cacti /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1


# 啟用後,圖片就會產生了。

cron 啟用後,cacti 圖片就會產生了
cron 啟用後,cacti 圖片就會產生了


Q:  CACTI 裝好了,圖片也產生了。但是看不到流量可能的原因?

請檢查一下時間,Server 先對時,ntp 對時。時區確認。
[root@hnamenode2 ~]# date
一  9月 28 10:33:02 CST 2015
[root@hnamenode2 ~]# ntpdate clock.stdtime.gov.tw
28 Sep 10:33:33 ntpdate[5013]: adjust time server 211.22.103.158 offset -0.003425 sec

最後在檢查 php.ini 的設定,是否有設為同一個時區,如果沒有改一下並重新啟動 apache

[root@hnamenode2 ~]# cat /etc/php.ini  | grep timezone
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Taipei

[root@hnamenode2 ~]# systemctl  restart  httpd.service