2014年2月20日 星期四

網址前的icon favicon.ico

這個好像也是萬年問題~
要怎麼放google一下應該超多的~

一般就是放各web server 根目錄下的favicon.ico

不過倒霉的很多時候還是不出來~
其實重點是~ 先看看你圖檔的格式有迷有對啦!!!
每次別人拿圖來~十次有九次都是錯的!!!
(我習慣使用tomcat.ico做對照組比對XD)
ico檔可不是png, jpg改副檔名就好...

不過常常要用時~ 會找不到工具轉...
剛發現一個不錯的網站~ 可線上傳檔案, 再幫你export~ 
http://xiconeditor.com/

另外補充apache 幫的路徑自動加ico的做法~

conf/httpd 底下加
AddType image/x-icon .ico

重起apache...

2014年2月18日 星期二

hive 指令

hive都是打打一串很長的cmd在處理~

要注意的是~ 若沒有做程序控管~ 同時做HIVE指令可能會出事~
(因為是使用"一個"檔案當DB資料~ 檔案本來就無法同時多個程序寫入!!~ 讀取分析可能又卡在hadoop分散式檔案系統~又麻煩了點~~)
hadoop的檔案系統~ 基本上只有put, rmr(新增, 刪除), 沒有"更新"這件事!!!!!!
(我也很希望有T__T)
更新這件事~只能先砍掉~ 再新增...但是因為通常Hadoop又喊自己是Big Data...幾G甚至到T的資料在那邊一直copy...I/O會到極限就算了
(I/O在OS效能上~算很容易跑到100%CPU, 也容易影響到其他工作)~

反正Hadoop不會是Fast Data的最好選擇就是了!!!頂多是搭配使用~
總之偶覺得很難用啦~ 看很多solution都寫的多好用一樣~ 那都是要配很多東西~ 再加上特定條件才成立的!

這邊列一些有用到hive指令~
另外執行cmd的方式~
僅量使用bin/hive -e 的方式執行~
而不是用bin/hive進console....
但是因為bin/hive -e, 會受到"引號的限制~ 可能會有某些情況無法全擠進同一個句子裡...還是得用bin/hive解....(有點爛~__~|||)

匯入資料時要注意~ 該內容只支援UTF-8...中文常會GG的~~
(要匯之前還要先去把原csv整個轉檔~ 又是個坑一_一||||)

select語法建議就看文件囉~跟SQL有點像~但又不太一樣~

###顯示table列表
(其實一個table就等於是一個hadoop file~有興趣去hadoop裡面純看hadoop檔案,  /user/hive/warehouse下就會有個名字和table name一樣的檔)
show tables;



###顯示table
decribe test_csv;

###刪除
DROP TABLE test_csv;

###notices row format must!
CREATE TABLE test_csv (id STRING, sn INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

###sync data with csv localfile (overwrite)
load data local inpath '/XXXXX/hadoop/files/aa.txt' overwrite into table test_csv;
###insert(append data with csv)
load data local inpath '/XXXX/hadoop/files/aa.txt' into table test_csv;

###create_idx
CREATE INDEX idx_date
ON TABLE xxx_data (date_str)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD;

###select sample
SELECT * FROM xxxxxx WHERE yyyyMMdd = '2013AUG16' order by num;

hadoop1.2 + hive0.11

hive安裝其實算很簡單~
而且只要裝一台(就是只能呼叫那一台啦, 我為了統一管理~ 都是一起在master下)~

其實hive的跟本還是hadoop...
但是提供了幾個方便的前置與控制~
像偶有用到的~ 匯入csv, 用類sql語法操作~ 這些都只要下cmd就可以完成
(不用自己在那邊刻Java, 刻個半死~還有bug...)

聽起來好像很好用!!?不過hive本身也有很多限制!!!!!!
像我發現的有~
hive匯入只能"新增內容"~ 不會依KEY更新, 也不能刪除!!
----> 除非每次都重新匯入資料~ 不然無法保證資料同步的正確性
----> 不適合做資料異動~ 只能做一直新增的(一直新增的還不能跑兩次~會變兩倍量, 當然如果你的系統能做到100%差異~只做一次~而且保證成功那就沒問題~~)
當然也可以說每次都重匯~ 但是重匯的I/O量遠大於差異量...
最近發現~ 其實大檔案運算的瓶頸會卡在I/O...(而不是算太慢(算太慢是看演算法~除非科學影像計算~不然一般商業還是以加減成除+各種情況判斷特例為主~都算很快低))

另外hive的程序有限制(不能多工同時下兩個hive的指令跑)
會發生這事的原因~ 是因為我用java跑hive cmd, 然後又開著hive的console在查資料情況~
接著就發現~ 當你在console時~ java的hive cmd怎麼都不會寫資料進來!!?...console開著閒閒沒做事~ 外面call也裝死~
之後就推論出~hive只能單工執行~ 這和我們常用DB SQL的想法很不一樣~
DB都是大家拼命寫~ 拼命讀也還好(除了某些太頻繁沒搞好整個爛掉之外)~ 只是慢了點~ 還是會動~資料也正確~
所以想把HIVE當DB用的話是非常不合適的~~(聽同事說用HBase比較合適~ 但HBase是走Map的資料結構~而且偶迷有研究XD)

如果要把HIVE做更好的應用~ 聽說要多架ZooKeeper..還是其他動物的~ 總之可能要搞個動物園才會比較能用...單純HIVE的應用~ 我覺得就是定期匯出"完整資料"然後做單純的類DB SQL分析~
當然速度不會快(因為卡在總資料的I/O大小上)~ 也不適合做長期儲存~
優點當然就是支援CSV~TXT~檔案~ 如果是跨系統整合(很多台~很多OS~很多不同的DB)~用CSV做資料交換就挺方便的~


0. 先裝好hadoop, 並將hive解壓縮放好
    cd XXXXX
    tar -zxv -f hive-0.11.0.tar.gz

1. setting
   ##vim bin/hive
   ##add
HIVE_HOME=/XXXXX/hadoop/hive-0.11.0
HADOOP_HOME=/XXXXX/hadoop/hadoop-1.2.1
JAVA_HOME=/usr/java/jdk1.6.0_45

   2. create hdfs
cd /XXXXX/hadoop/hadoop-1.2.1
bin/hadoop fs -mkdir /tmp
bin/hadoop fs -mkdir /user/hive/warehouse
bin/hadoop fs -chmod g+w /tmp
bin/hadoop fs -chmod g+w /user/hive/warehouse
 
   3. use hive cmd(sql)
 

2014年2月12日 星期三

hadoop 問題排除-start/stop不運作

在try&error建置時~
可能在那邊上上下下~

然後常常就會發現~ 怎麼startAll, stopAll都沒用了!!

這時候當然是先看log...
三成是網路問題~
(網路不通...發生在網管很嚴的~ 同一網段也鎖來鎖去Orz)

兩成是有人豬頭用了不同user跑hadoop指令
為了debug, sudo/su一般user切來切去~ 結果就發生慘事了Orz..
因權限不同~寫出的檔案無法被access就會GG

兩成是Java程序問題
(之前的程序活著沒死, 新的起不來, 或是port被咬了)

一成是pid問題~
會到這邊通常是因為其他問題生出來的孩子Orz...

還有一成~
我也不知道XD...

hadoop在run時~ 會啟用java的程序(datanode, tasktracker之類的)
要看程序是否活著
ps aux | grep datanode
ps aux | grep tasktracker

理論上當你stop後~ 這些程序就grep不到了~
不過因為hadoop在stop時~ 它會去找pid檔, pid檔裡面會寫它所屬的pid
 datanode一個pid檔, tasktracker一個, 好像master還有多secondary..bala忘了XD...


總之~hadoop在stop時~ 會依這些實體檔內寫的pid值去kill process
但是~ 這些實體檔的pid值並不一定真的等於現在存在的process...
hadoop在run時, 用ps aux去抓~ 看pid與實體檔的pid~ 應該就會很清楚的發現...

若有hadoop 指令kill失敗時~ 它還是會叫新的起來跑...順便更新pid實體檔...
就會發生...新的跑不起來(因為舊的沒死~咬住port/服務)
然後pid實體檔是寫新的pid...
之後再怎麼stop..都是stop不了的!!
(解法當然就是~~ps aux..然後kill -9...XD)

在叢集上又更囉嗦了點, startAll, stopAll也會對slave下指令...
但可能失敗是在slave..但是master並不知道~ 接著漸漸的你就會感覺很奇怪XD...
所以全部重起, 最好要乖乖的去每一台上check...

權限問題應該比較好理解~ 基本上就是萬一用了root或更大權限的user, 開檔寫檔後...
(hadoop很多暫存或是資料都是寫檔....)
之後權限小的user就寫不進去了~ 或無法讀取--> GG...
這個算手殘~ 不過後續要解其實有點痛苦~
因為暫存檔位置太多>_<~還不知道生去那裡了~ change owner後好像也不太正常(因為hadoop有些檔又卡access權限)
當時解法~ 就只好很害怕的砍檔~ 然後重新format...(還好他只是slave...)


最慘的大概是就玩到完全不知道花生什麼事了~ 解法就是一_一...ps aux把全部有hadoop的java 程序全找出來~, 全部全砍了...slave好像就兩個還三個, master會比較多~
然後照標準SOP一步一步重來, 再看看log吧|||Orz...
這招應該是有用的~ 玩過後有正常log, 正常運作~ 目前沒發現後遺症...
(至少不是重裝啦~ )

有想過reboot...但是還有其他服務在跑..reboot風險太高阿阿阿Orz..
很多機器是平常沒事~ 一關機就GG的~ 囧rz...

hadoop 問題排除-storge_id error


這問題還蠻常見的~
在某些啟動失敗, 或結束(shutdown)失敗~
(可能是設定有誤或網路不通...之類造成的後遺症)

我覺得主因是pid不一致, hadoop的pid都是在特定地方寫一個檔案做判別~
但是有可能pid檔寫了~ 但程序其實沒跑起來(若之前的process沒kill乾淨就會)
要shutdown時~ 去找pid檔~ 殺也殺不掉~ 就會發生一些有的沒的問題....
(有點像問題會自己生孩子XD|||...但是又找不到這孩子從那裡來的...所以...)

解問題~ 就是看log檔...如果有看到storge_id error
解法就是~ 去看tmpdir, 和datadir下的pid, 然後手動改檔案讓他對起來就解了
至於改那個檔~ 我記得log上寫的很清楚XD~ 它有說它應該要讀到的ID是xxxx, 但是那裡是oooo...所以不符合~

實務上就是hadoop log+ datadir/current/VERSION
怕改錯整個GG~ 就是...先把原始檔備份起來~XD|||
基本上改好後~ 重起~ 再RUN~ 沒錯就不會有錯了~

當然最低級的解法就是重新format, 但是有很大風險跟後續處理~
當然要看系統內的檔案有沒有用...
(偶之前有做過只用"分散式運算"的專案~完全沒存資料的~就可以直接format...XD)

###storge_id error, cat/vim ID from log
   /home/OOOOO/datadir: namenode namespaceID = 1281580305; datanode namespaceID = 1985552196
   cat /home/OOOOO/datadir/current/VERSION
namespaceID=1985552196
storageID=DS-17766262-192.168.3.185-50010-1383819150104
cTime=0
storageType=DATA_NODE
layoutVersion=-41
    vim /home/OOOOO/datadir/current/VERSION
update namespaceID --> 1281580305
    bin/hadoop-daemon.sh --config ./conf start datanode
    bin/hadoop-daemon.sh --config ./conf start jobtracker
---> OK   

hadoop 問題排除-增加slave

使用版本為hadoop1.2 + JDK1.6 + centOS 6

因為專案取向不同~ 加上各種情況也不同~ 所以備註一些有碰到的問題與排除

增加slave, 我都master/slave使用同一個accout(一般user), 設定比較一致

0. slave 已安裝完hadoop與hadoop相關設定(hadoop conf, 環境變數, 網管/防火牆通, datanode format完成)

1. copy ssh key(on Master host)
   ##ssh localhost without accept key
   #test
   ssh localhost
   #set (h0<master>)
   ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
   cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
   chmod 600 ~/.ssh/authorized_keys
   scp -r ~/.ssh localhost:~/
   #master host add slave key
   ssh-copy-id -i /home/forest/.ssh/id_dsa account@slave1

2.  ssh slave1
     若有正常設定成功~ ssh過去應該不會叫你輸pwd了~

3.單獨啟動node運作
    cd hadoop工作資料夾
   #啟用data node, job
   bin/hadoop-daemon.sh --config ./conf start datanode
   bin/hadoop-daemon.sh --config ./conf start tasktracker

4. 看看log, slave有沒有怪怪的...

5. 回到master確認掛載情況, 因為這案很可憐,
    沒有GUI(網管很嚴QQ)...都用cmd指令在看Orz...
    bin/hadoop dfsadmin -report

6. 若slave啟動有問題~或要下下來~在slave使用指令
     bin/hadoop-daemon.sh --config ./conf stop datanode
     bin/hadoop-daemon.sh --config ./conf stop tasktracker


   

hadoop hdfs配置

最近的專案有用了hadoop1.2...

先說感想就是~ 啟動速度變快了!!(和0.23比有"有感"的進步XD)..

另外這次專案是主要做資料儲存~ 所以對於分散式檔案系統做了比較多的設定~
大概簡單說明如下:

OS硬體配置注意:
因OS使用centos, 先確認一下硬碟空間!!因為安裝時會做硬碟切割~ 我這邊都用預設的~ 硬碟上他會自己切系統碟和一般碟(系統碟好像50G而已, home會在一般碟, 比較大)
指令: df

記得要先規劃好檔案放置位置(設定datadir, 和tmpdir)~ 以免到時候發現怎麼空間很小XD...偶就是在跑了測試資料在看hadoop資訊時才發現~ 怎麼hadoop總空間小的可憐...(因為這次隨便一台單機做完raid後都至少3T...很奢侈阿阿阿~~~)

另外因為hadoop有點怪~ 他要使用的folder權限要755...766那種的也會抗議XD...就記得配合資料夾權限755可執行

hadoop設定檔~與之前的版本基本上相同~
這次微調的部分設定在最底下

 要注意的是~
block size會影響到硬碟的使用量~ 因為被切割的檔案~ 會以block size為單位儲存佔實體硬碟空間~ 因這案的檔案有大(上百M)有小(幾十K)...預設是64M還多少~ 後來我決定用1M就好...

replication 若設定大於1的話~
hadoop會在啟動時~ 確認有大於1個data node活著連接~ 他才會正常運作~ 若只有一個data node在(只有一個master時), 會報錯然後就不啟用複本機制~ 所以要記得salve搞定後再來改複本參數...

設定tmp資料夾(755)
vim conf/core-site.xml  
<property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/home/OOOOO/tmpdir</value>
</property>

設定datadir資料夾(755)+block size(1M)
vim conf/hdfs-site.xml
<property>
   <name>dfs.replication</name>
   <value>2</value>
</property>
<property>
    <name>dfs.block.size</name>
    <value>1048576</value>
</property>
<property>
    <name>dfs.data.dir</name>
    <value>/home/OOOOO/datadir</value>
</property>