2012年8月14日 星期二

MySQL 亂碼

其實這個問題應該是很common的~
多到~ 只要在google search bar打兩個字就自己幫你帶出一堆了...

不過因為很久沒有看到MySQL..總之~ 太久沒用就是會碰到鬼~
整理一下~ 解法大概就這幾個~

1. jdbc url加參數, 這個可以解掉九成的問題...
jdbc:mysql://{IP}:3306/epagedb?useUnicode=true&characterEncoding=utf8

2. JDBC換個版本的jar試試看
說瞎也不能說很瞎的XD...幾點幾版的jar是對到那一版的MySQL DB..是也有點道理...

3. 下SQL轉換...這是一切無解又無奈的時候...唉...Orz..這次就碰到這個了...
select convert(unhex(hex(convert(pt_name using latin1))) using utf8) as name from xxxtable

因為撈回來的資料是一半中文一半亂碼...
DB table的編碼用default:latin-1, 但是資料用utf-8的碼寫進去的天才...
狠著心用MySQL轉換就可以出來了...只是這個SQL好長長長....

不過發現一樣很慘的是~ 他的來源好像本來就有些是亂碼了~
應該是硬寫了一堆編碼內沒有的字~ 不過這~ 這我也沒辦法了...
系統是別人建的一_一"...

2012年8月10日 星期五

[Hadoop] 基本環境建立-3


Hadoop不能走IPv6...之後新版會不會支援偶就不知啦XD
ubuntu現在新版的default就是IPv6..記得要先關掉

[Cancel IPv6 on Ubuntu]
1. vim /etc/sysctl.conf
2. add code
  net.ipv6.conf.all.disable_ipv6 = 1
  net.ipv6.conf.default.disable_ipv6 = 1
  net.ipv6.conf.lo.disable_ipv6 = 1
3. execute setting
  sudo sysctl -p
4. Test result(It should be empty)
   ip a | grep inet6


//為了方便~ 我把hadoop相關套件一律裝到/etc/hadoop下~ hdfs檔案位置放在HADOOP_HOME/tmp下
//另外也為了操作方便~ 先把那邊的路徑owner改給hadoop user..省著一直問sudo超麻煩
//先做單機測試與安裝

[Hadoop]
1. Download/SFTP tar.gz to /home/hadoop
2. Copy and unzip
   cd /etc
   sudo mkdir hadoop
   sudo chown -R hadoop hadoop
   cd hadoop
   cp /home/hadoop/hadoop-0.20.2.tar.gz .
   tar -zxv -f hadoop-0.20.2.tar.gz
3. setting
   cd hadoop-0.20.2
   vim conf/hadoop-env.sh
     //SUN-JDK路徑
     JAVA_HOME=/etc/jdk/jdk1.6.0_32/
   Test hadoop cmd
     bin/hadoop
4. setting core-site.xml
   vim conf/core-site.xml
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/etc/hadoop/hadoop-0.20.2/tmp</value>
  </property>
    mkdir tmp
5. setting hdfs-site.xml
   vim conf/hdfs-site.xml
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
6.setting mapred-site.xml
  vim conf/mapred-site.xml
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
  </property>
7. ssh localhost without accept key
   #test
   ssh localhost
   #set
   ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
   cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
8. Download Master ssh key to store
9. Run Single Node
   bin/hadoop namenode -format
   bin/start-all.sh

10. Check status //他起來到網頁看到一個會活的node或jobnode..要很久(尤其多個node時)...可以先做別的事再來看
   http://{hadoop ip}:50070/  (DataNode is count of slaves)
   http://{hadoop ip}:50030/

[Hadoop Exception Handle]
//datanode有問題~ 通常rm砍掉後重新format就會過

NOTE: if Incompatible namespaceIDs
      rm -R tmp
      mkdir tmp
      bin/hadoop namenode -format
//status 網頁開不起來時~檢查該聽的port有沒有問題
NOTE: if Connection Fail
      Check hosts and ip in the xml
      netstat -l (on Master u can see the port bind vm1)


//HBase只是裝來給sqoop reference用的~沒設定也沒差

[HBase]
0. download version: hbase-0.92.1.tar.gz
   FTP to host

1. cd /etc/hadoop
   cp /home/hadoop/hbase-0.92.1.tar.gz .
   tar -zxv -f hbase-0.92.1.tar.gz

[Sqoop]
0. download version: sqoop-1.4.1-incubating__hadoop-0.20.tar.gz
   FTP to host, chg name to short name-->sqoop-1.4.1.tar.gz
 
1. cd /etc/hadoop
   cp /home/hadoop/sqoop-1.4.1.tar.gz .
   tar -zxv -f sqoop-1.4.1.tar.gz
   #cp -R sqoop-1.4.1-incubating__hadoop-0.20/. hadoop-0.20.2/sqoop-1.4.1/

2. set PATH
   vim bin/configure-sqoop
   #add on top
   #notice hadoop must use sun java jdk!!
   HADOOP_HOME=/etc/hadoop/hadoop-0.20.2/
   HBASE_HOME=/etc/hadoop/hbase-0.92.1/
   JAVA_HOME=/etc/jdk/jdk1.6.0_32/

//等這些單機裝好測好後~ 就可以將目前的VM做樣本~ 接著就是複雜N份~
//是也可以順便先把Hadoop實做出來的先copy過去啦~不過就~嗯=_="總是會改的~之後還是每一台要上
//ssh without key這件事~ 只要master跟其他的sync完就可以了~ 簡單的說只要讓master可以ssh免pwd去下指令就可以了~~
//masters和slaves我記得是~ master那台兩個檔都要改~ slaves只要去改master就可以~ 不過為了統一~一起都改一樣是也沒差一"一a

[Hadoop Multi PC]
0. Save Basic VM Img
{for each VM}
1. Create New VM..Deploy Basic VM Img..start
2. sync time oclock
   sudo ntpdate time.stdtime.gov.tw
3. Modify PC HostName
   sudo vim /etc/hostname
   sudo vim /etc/hosts
   sudo reboot
   #Remember the VM IP
4. hosts add all ip/hostname
   sudo vim /etc/hosts
   (Notice..remove 127.0.1.1, use outer ip with hostname of master)
5. ssh all without key..(ssh localhost and ssh h1~hN) <--do this only on the Master
   ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
   cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys (ssh localhost need it)
   ssh-copy-id -i ~/.ssh/id_dsa.pub hadoop@h2  (@h1~@hN)
6. set conf again (only Master need to reset masters and slaves)
   cd /etc/hadoop/hadoop-1.0.0
   vim conf/masters  (key in hostname of Master)
     h0
   vim conf/slaves  (add all host include self)
     h1
     h2
     h3
   vim conf/core-site.xml  (update hostname)
     <value>http://h0:9000</value>
   vim conf/hdfs-site.xml (update hostname)
     <value>2<value>
   vim conf/mapred-site.xml
     <value>http://h0:9001</value>
7. Start Hadoop on Master
   bin/stop-all.sh
   bin/hadoop namenode -format
   bin/start-all.sh
8. Check status
   http://192.168.22.111:50070/  (DataNode is count of slaves)
   http://192.168.22.111:50030/
9. #test1
   //bin/hadoop jar hadoop-examples-1.0.0.jar pi 10 5000000
   bin/hadoop jar hadoop-0.20.2-examples.jar pi 10 500
   #test2
   bin/hadoop dfs -ls output
   (if output exists)
      bin/hadoop fs -rmr output
   bin/hadoop dfs -put ./wordcount input
   bin/hadoop jar hadoop-examples-1.0.0.jar wordcount input output

最後就是測試啦~可以用現成的範例檔測就好了~
多個node有成功時~ 可以在50030那邊去看~也會有進度~
看log可以多利用50070的logs/~ 比cmd上的黑白mode好看好選多了(名字很長又很像=_=")

話說偶最早是用Hadoop 1.0去裝~但是他有個網路問題不知道是怎樣~ 當時不知道是他開發的bug還怎樣(那時候看到1.0剛出很開心的去抓~就當白老鼠了...)...多台的溝通就是跑不起來只能單台...這樣很有問題Orz...
最後降級至穩定版..至少0.20~照著文件跟網路文章做就很順~

看到example程式沒啥問題的跑完後~ 就可以開始開發應用了!!

 




[Hadoop] 基本環境建立-2


[Sun JDK6]
0. download jdk file from sun: jdk-6u32-linux-x64.bin
   FTP to host 
1. #create jdk folder
   cd /etc
   sudo mkdir jdk
   cd jdk
   sudo cp /home/hadoop/jdk-6u32-linux-x64.bin .
2. #install
   chmod 755 jdk-6u32-linux-x64.bin
   sudo -s ./jdk-6u32-linux-x64.bin


[Tomcat7]雖然後來沒用~ 不過都已經試完了就記錄一下Orz...
1. Download/SFTP tar.gz to /home/hadoop
2. #move and unzip files
   cd /etc
   sudo mkdir tomcat
   sudo chown -R hadoop tomcat
   cd tomcat7
   cp /home/hadoop/apache-tomcat-7.0.26.tar.gz .
   tar -zxv -f apache-tomcat-7.0.26.tar.gz
3. #tomcat setting
   change to port80 vim server.xml
   open manager user vim tomcat-users.xml
   envir var sudo vim environment
    //有裝Sun-JDK也可以指過去~
     JAVA_HOME="/usr/lib/jvm/java-6-openjdk"
     JRE_HOME="/usr/lib/jvm/java-6-openjdk/jre"
     PATH="...(other path):$JAVA_HOME:$JRE_HOME"
   #notice port server
   cat /etc/services
4. #test single startup server
   bin/startup.sh
   bin/shupdown.sh
5. #start on boot
   #create file script into init.d/tomcat.sh, notice +x and notice path
   export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
   export JAVA_JRE=/usr/lib/jvm/java-6-openjdk/jre

   cd /etc/tomcat7/apache-tomcat-7.0.26
   bin/startup.sh
   #add shell into init.d
   update-rc.d -f tomcat defaults

//看到這我突然想起來~用apt-get的postgres owner比較不會有問題~ Option install的那個會好像沒辦法su~ 還是沒有postgres那個user..忘了XD..反正是apt-get安裝的比較正常...
不過apt-get都只會找最新版的~看他apt-get怎麼看~ 如果要指定某一版就要找一下指令位置
//另從9開始~ 他預設的語系並不是UTF-8..會"很有問題"~ 所以請在一開始對DB整個砍掉-->2
//預設的super user是沒有密碼的樣子~ 先處理之後才不會有管理問題

[PostgreSQL (DON'T use server disk install..user strange)]
1. #Install postgresql (You will get the newest 9.1)
   #bin locate=/usr/lib/postgresql/9.1/bin/
   #conf locate=/etc/postgresql/9.1/main/
   sudo apt-get install postgresql
2. #create new Server to change encoding!!
   cd /usr/lib/postgresql/9.1/bin/
   sudo pg_dropcluster --stop 9.1 main
   sudo pg_createcluster --start -e UTF-8 9.1 main    
2. #Reset Password
   sudo -u postgres psql postgres
   \password postgres 
   \q
3. #allow ip access
   cd /etc/postgresql/9.1/main/
   sudo vim pg_hba.conf
   #Add
   host    all         all         192.168.{net}.1/24       trust
   #listen for all
   sudo vim postgresql.conf
   #Update
   listen_addresses='*'
4. #reStart Server
   sudo /etc/init.d/postgresql restart
5. Use GUI Access..Check


[PostGIS]
0. #slove locale bug if needed
   sudo locale-gen
   sudo locale-gen --lang zh_TW.UTF-8
1. Install PostgreSQL down..
2. #apt-get install, according version of the postgreSQL
   sudo apt-get install postgresql-9.1-postgis
   # install path=/usr/share/postgresql/9.1/contrib
3. #crate template db
   sudo su postgres
   createdb template_postgis
   createlang plpgsql template_postgis
   psql -U postgres -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql
   psql -U postgres -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_ref_sys.sql
4. #check database
   select postgis_lib_version();


//要養成好習慣~ 反正先建個其他帳號來ACCESS...如果有GUI可以用gui玩比較順~當時是因為只有黑白畫面Orz...
[DB create]
1. #create a new database(roadinfo) and owner is {user}/{pwd}
   sudo su postgres
   psql postgres
   CREATE USER  {user}  WITH PASSWORD ' {pwd} ' CREATEDB;
   CREATE DATABASE  {db}  OWNER  {user} ;
   #or DB support postGIS
   CREATE DATABASE  {db}  OWNER {user} TEMPLATE template_postgis;
2. dump DB from testing/dev
   #move path into backup path
   cd /etc/hadoop
   #dump
   pg_dump --host {ip} --username {user} {db2} > {db2 name}.backup
3. restore DB to database    
   psql {db} < {db2 name}.backup
4. If owner errors.. change table owner to its
   psql {user}
   ALTER TABLE {table} OWNER TO {user};


[Hadoop] 基本環境建立-1

碎碎念後~ 開始筆記正文...
Hadoop基本上是linux平台的專案~ 除了省錢之外~ WIN上的支援討論也太少了~
所以就先選個os來~ 因為我有聽過的很少~ 就選ubuntu...

一開始想裝ubuntu desktop..結果好樣的HyperV就是裝不起來~ 所以最後是裝server version..這對我來說是沒什麼差就是...

server version有個方便的地方~ 預設就可以選裝ssh...另外DB雖然有我要用的postgreSQL~但是後來發現怪怪的~ 所以後來還是用apt-get的比較穩

內建可安裝裡面有個Tomcat...裝起來發現他Folder亂生~ 建議Tomcat若要用還是zip方式安裝會比較好管理~我專案到最後是沒用~

基本環境選擇...
ubuntu server 11.10
SSH Server(內建Option安裝)
PostgreSQL 9.1(apt-get安裝)+PostGis 1.5(apt-get安裝)
Sun JDK 1.6(sun/oracle官網bin檔安裝)
Hadoop 0.20.2
Sqoop 1.4 for Hadoop 0.20.2(sqoop要求SUN JDK, 不吃OpenJDK..不過我就是需要他QQ)
HBase 0.92(sqoop會要求HBASE_PATH, 沒用不過就配合著裝)

使用工具...
pietty --> ssh連線管理..我記得putty好像不能顯示中文~而且還可以貼上文字..反正pietty比較powerful就是了
FileZille Client --> 選用SFTP就可以上傳下載檔案~

應該要會的基本操作(或者說我只會這幾樣=_="還常常要去鳥哥那邊查範例)...
vim  --> 嗯~超級重要的編輯檔案~ vim比vi簡單一點點點喔~
tail  --> 看檔案尾巴的內容~ 看log檔好用~
cat --> 也是看檔案~ 適合小檔小設定顯示..
ls/mkdir/cp/mv/rm... --> 檔案基本操作很基本吧Orz..
tar --> 壓縮解壓縮檔
netstat --> 網路狀態~ ㄜ~ 有時候要看他有沒有跑起來看PORT
ifconfig --> 看自己的網路狀態..IP是多少很重要QQ..
reboot/halt... --> 重開機/關機指令

底下是相關指令與cmd...就平常台式英文加後來再補充的筆記...

[Ubuntu]

Linex Basic Evir(Use ubuntu 11.10 64bit server)
1. Append ISO in DVD
2. Install ubnutu OS Language: 台灣繁體
    //pc name之後還可以改
    set pc name:
    //sudo user/pwd很重要~錯了就沒人能用了XD
    set default user name/pwd:
    //proxy不設定之後去系統改也一樣~
    proxy setting(intranet): http://{proxy ip}:{proxy port}
    //Option安裝~ 要管理記得開ssh~可pietty..FTP一次搞定
    Install Project: OpenSSH
3. Network Setting: ifconfig to get IP
   #DHCP(intranet) 在hyperV下他是有問題的~ 要自己加自動取得DHCP IP(Vmware沒事QQ)加完後重開機才有用~另hosts在hyperV下有問題記得去check有沒有看到奇怪的東西~
   ls /etc/network
   sudo vim interfaces
   #add
       auto eth0
       iface eth0 inet dhcp
   sudo reboot
   vim /etc/hosts   remove .(null)
     127.0.1.1       h0  
4. SSH Host and Test upload Files
5. sudo apt-get update (Wait for install)
   #proxy setting (if b4 fail?)
   sudo gedit /etc/apt/apt.conf.d/02proxy
   Acquire::http::Proxy "http://{ip}:{port}";
   wq!
6. Install JDK6 (Wait for While) (See [Sun JDK 6])
   which java (/usr/lib/jvm/java-6-openjdk/)
7. Install Hadoop (See [Hadoop])
8. Date Time Sync
    //同步時間有兩個原因~ 一是當VM複製後或停止再重起~ 時間不會動~ 所以要對時~ 另外是我覺得那個時間真的過一段時間超不準的QQ~ 要是懶的話就是把他寫成crontab去對吧
    sudo ntpdate time.stdtime.gov.tw
    //看時間的指令印象中好像是
    date



2012年8月9日 星期四

[Hadoop]碎碎念

講起Hadoop...恩~ 好吧~ 現在好像正紅~ 趁著實驗案剛結束~
比較悠閒又還有點記憶時~ 來碎碎念一下...

首先~ 配合目前正紅的VM技術~

開發用windows server 2008內建的hyperV..是那個誰叫偶要練習做Template+硬碟用固定大小的~ 然後小小的測試機硬碟就爆了(早期的Server~硬碟都很小才80..100G)..

Production也是沒經驗~ 開了個規格出去...業務也隨便買就...每個server 1.2T...但是連storage也是1.2T..就超搞笑...
再做raid0/raid5...就看到一堆人搶著硬碟要用...

另外VmWare要做HA的話~要額外購買vCenter...vCenter原則上是建議獨立機器~ 不過後來因為各式各樣的原因還是裝在VM裡面~另外要被HA的VM一定要裝在storeage上~還得搭配有G以上的Switch做支援~ 這種東西說真的~ 隨便一樣就貴到死=.=a..還有那個要跟那個配~這些硬體商也不管你會不會懂不懂(說不定他們自己也不懂哩~只會報價而已=.=")~還真是見招拆招~一整個很刺激阿~囧rz

這故事說~ 一個Server有多少實力~ 要切幾個VM..配多少效能~放那~ 真的要有計劃~ 不然結果常常超乾尬...不懂的話~ 去上個原廠課程~ ㄜ~有沒有用我沒上是不知道啦~但應該還是有用吧Orz...


Hadoop本來就是linux專案~ 先是被ubuntu狠狠的電一個月...
受win苦毒很深的人進cmd黑白世界真的要多抓點時間...pietty和Google是你最好的朋友...

XX的hyperV和ubuntu是世仇嗎~ ubuntu在上面一堆基本設定有問題~連apt-get的東西都還裝不起來是那來的鬼...
還好Production上用的VMware有付大錢的就是不一樣~ 一路順到底~ 連clone多台時設定轉換他也有做得很好~


接下來是Hadoop特性的問題~ Hadoop是一很穩重的單線程架構...
一起來就是20s..(沒做事也是20s..我猜大概是在溝通跟CHECK可用資源...)
所以原本不用算到20s的用這跟本效能馬上大輸...
(我無聊寫了一個類似流程但不是Hadoop...說實在話~ 不用10秒就做完了...另一原因是真實情況量就不大...上面也原本打算是做實驗性質...但大家沒想到差這麼多~囧")

他很老實的~ 一定要全部分完(Map)..然後等到全部的結果都算回來後才結算(Reduce)..
其實他這樣子是沒什麼問題的~ 但是~很不幸的這案子的目標是要即時運算~ 即時傳回資料...
所以為了反應時間的關係~ 只好把他改成了非正常一般的Hadoop運作模式...

最大的困擾是在實做驗證時~ 不斷的被長官質疑為什麼Hadoop運算比較慢...還慢那麼久...
在報告時~ 每次都要花一半以上的時間~ 做Hadoop原理架構教學...
全部的人~包含PM也都去上課了...還好最後大家也認同~ 嗯~ 解題方向錯誤=_="...不過計劃書都寫白了要Hadoop..只好給他Hadoop下去~ 還好KPI很寬鬆可以過...


另外關於Hadoop的學習資源~ 嗯~ 套句朋友的老話~ 上官網吧~ 囧rz...
一堆中文書很多只是翻譯官方文件內容而已~ 結果那些書最大的用處是老板拿去抄前幾章的序跟介紹到計劃報告書裡用的...

歐來禮的翻譯書還是有保障一點~ 但是我覺得實務上還是很難解答我的問題~
只是他可以提供一些關鍵字給我問Google大神是也不能說他沒有用Orz...


公司有請資策會的人來上幾堂跟這有關的課~ 不過我的心得是~ 目前台灣在這領域的人很少...
真正應用到實做上的很少少少...老師也只能講講理論面的...可以當做補充知識~ 但實做還是靠自己吧~ 囧rz...


另一點是因為~ 這案子真的是解題方式不好~ 所以相關資源也很少...
都用奧步Orz...


不過實驗麻~ 有取得經驗值還是比較重要的~ 至少長官們下次選解題方式時~ 就不會只喊著要雲端運算~ 要Hadoop...
進步最多的~ 大概就是嘴砲功力吧XD|||...

soapui

在做網站介接最麻煩的之一~
就是有一堆莫名其妙的Web Service...

REST的當然最好解決~文字簡單parse就好~
但是SOAP就機車了...

不貼心就算了~ 幾乎每一種都還要找特定的寫法針對...
(誰叫這些說起來好像照規矩又不照規矩~跟那堆Browser一樣一_一")


有時候也搞不清楚到底是我錯還是對方錯~
最近看到了一個Open Source..soapui~ 可以快速建立request..還可以gen code..還可以做service..
就來試了一下~~

講一下我個人覺得OK的點就是~

單純當client測試很方便~ 只要輸入WSDL網址就出來了...

他request會直接顯示出soap request所需要的xml內容(自己去貼一貼值很快)與回傳內容~ 對於我這種實作上不愛肥胖套件喜愛純文字處理的人很友善!!

另外有gen code~目前是還不需要用到~ 但是support的項目包山包海...java主力的axis1,2..cfx...Net..還有很多我沒看過的東西=.="...也許那天可以方便用也很好~

官網
http://www.soapui.org/

download就是在sourceforge下
http://sourceforge.net/projects/soapui/files/

他主要有一個應用程式~SoapUI..11xM左右~ 小肥但還好下載很快~
也有IDE的plugin...不過大家都知道plugin有版本相容問題(這又是一個很無言的事情就是)

所以就直接用應用程式就好了(有趕上時代的64bit版本喔XD)

操作畫面有興趣可以參考我在網路上看到的網路文章~
http://ejvyas.blogspot.tw/2010/05/create-axis-web-service-stubsartifacts.html