總網頁瀏覽量

2013年6月29日 星期六

Hadoop安裝(初步完成) hadoop 1.1.2版

共有三台VM機器,一台Master,兩台Slave
所有過程都由名稱為hadoop的帳號完成
以確保建立的資料擁有者一致

Ubuntu 12.04 LTS版本  32bit(如果是64bit 很有可能遇到unable to load hadoop native lib 要重新去抓hadoop原始碼重新編譯成jar包)
JDK6
hadoop 1.1.2


前言

安裝hadoop 步驟很繁瑣


安裝前

關閉防火牆
 sudo ufw disable,關閉ufw

第一步安裝JDK6

(過程寫在另外文章  標題是寫安裝jdk7  不過最好安裝jdk6)

(有些文章在.bashrc
加上export HADOOP_HOME = /usr/local/hadoop
主要目的是之後要加上
export $HADOOP_HOME/bin
想要使用bin之下的.sh檔案
)

第二步安裝ssh-server並設定不用密碼可登入ssh
(過程寫在另外文章)
hadoop使用ssh來實現cluster中各node的登錄認證



第三步新增網卡 static
(過程寫在另外文章)



第四步安裝hadoop
安裝穩定版本
1.1.X - current stable version, 1.1 release

下載hadoop
hadoop-1.1.2.tar.gz
放在home目錄

解壓縮
tar zxvf hadoop-1.1.2.tar.gz
更改資料夾名稱,好方便管理
mv hadoop-1.1.2 hadoop
將資料夾搬到/usr/local/之下
mv hadoop /usr/local/   (使用者安裝程式都放這裡)


第五步:
1.
在/usr/local/底下新增一個存放紀錄hadoop運作過程的file
(待確認這資料夾功能)
sudo mkdir hadoopDir
因為建立之後檔案擁有者是root,所以要更改檔案擁有者
sudo chown -R hadoop:hadoop hadoopDir
(sudo chown -R 帳號名稱:帳號名稱  資料夾名稱,-R是連同裡面檔案通通變更擁有者)


2.
在/opt底下新增一個存放hadoop備份資料的資料夾
sudo mkdir hadoopDir
sudo chown -R hadoop:hadoop hadoopDir
(sudo chown -R 帳號名稱:帳號名稱  資料夾名稱,-R是連同裡面檔案通通變更擁有者)



第六步:修改部署檔案

1. 修改家目錄之下的.bashrc
在export PATH=.....這行添加上 :/usr/local/hadoop/bin
這樣終端機可以恣意使用usr/local/hadoop/bin的指令惹

2.修改/usr/local/hadoop/conf/hadoop-env.sh(Hadoop運行時所用到的環境變數)
加入java路徑
         找到#export JAVA_HOME=........,改上java的路徑
         改後結果應為:
         export JAVA_HOME=/usr/lib/jvm/jdk7

3.修改/usr/local/hadoop/conf/core-site.xml: Hadoop核心的組態設定,例如HDFS和MapReduce共通的I/O設定


 <configuration>
     <property>  
        <name>fs.default.name</name>  
        <value>hdfs://HadoopNameNode1:9000</value>    (HadoopNameNode1主機名稱,9000是port碼)
     </property>  
 <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoopDir/hadoop-${user.name}</value>
  </property>
(暫存資料夾)
     </configuration>


4.
hdfs-site.xml: HDFS背景服務的組態設定:namenode,datanodes,secondary namenode

<configuration>

<property>
<name>dfs.name.dir</name>
<value></value>
</property>

<property>
<name>dfs.data.dir</name>
<value></value>
</property>

<property>
<name>fs.checkpoint.dir</name>
<value></value>  #默认是3份
</property>


</configuration>

5.mapred-site.xml: MapReduce的背景服務的組態設定:jobtracker,tasktrackers

<configuration>  
          <property>  
            <name>mapred.job.tracker</name>  
            <value>HadoopNameNode1:9001</value>(HadoopNameNode1是主機名稱,9001是埠號)  
          </property>  
          <property>  
            <name>mapred.local.dir</name>
 <value>/usr/local/hadoopDir/mapred/local,
/opt/hadoopDir/mapred/local</value></property>

          <property>  
            <name>mapred.system.dir</name>
            <value>/usr/local/hadoopDir/mapred/system,
/opt/hadoopDir/mapred/system</value>
          </property>


        </configuration>

6.master:一行代表一個運行namenode的主機清單,可以設定多個
(表示secondary namenode)
將localhost改為linux自己的主機名稱


7.slaves:一行代表一個運行datanode和tasktracker的主機清單
將localhost拿掉(如果NameNode也想兼任DataNode的話就改成主機名字)
加上DataNode主機名稱
HadoopDataNode1
HadoopDataNode2



第七步:建立其他的node
因為ssh公鑰匙同一把
且hadoop環境設定一致
所以採用複製方式建立node

複製HadoopNameNode1虛擬硬碟
建立HadoopDataNode1與HadoopDataNode2
(筆者使用VirtualBox所以複製時必須更替uuid)
建立之後網卡設定跟HadoopNameNode1衝突
所以更改HadoopDataNode1與HadoopDataNode2的網卡設定
ssh測試看看互相能否登入
以及確保ping的到8.8.8.8

第八步:

hadoop namenode -format
格式化

(好像只有NameNode需要format而已)

















第九步:
NameNode啟動hadoop
指令:start-all.sh
之後會依序啟動NameNode與DataNode


第十步:驗證
1.分別在NameNode與DataNode打上jps
(可以在NameNode使用ssh登入DataNode後再打jps)
查看啟動什麼服務







2.
在NameNode打上
hadoop dfsadmin -report
看看有多少個datanode在運行



3.
在NameNode主機打開browser
打上localhost:50070/dfshealth.jsp
進入hadoop管理介面


4.
在NameNode主機打上
localhost:50030/jobtracker.jsp
進入mapreduce網頁管理介面


ubuntu 更改主機名稱


gedit /etc/hostname
將原本的yyp-VirtualBox改為
HadoopNameNode1

新增網域內的主機清單
gedit /etc/hosts
192.168.0.168 HadoopNameNode1
192.168.0.169 HadoopDataNode1
192.168.0.170 HadoopDataNode2

將/etc/hosts上頭的
127.0.0.1 xxxxx  (不是localhost)
改成主機符合的身分
例如第一台HadoopNameNode1
就改為
127.0.0.1 HadoopNameNode1
這樣命令提示字元就會
yyp@HadoopNameNode1:#












ubuntu12.04新增網卡--VirturlBox

記得在virtualbox開啟網路卡
這樣ubuntu才會抓地到網卡

本例子是新增"僅限主機介面卡"

登入root權限

gedit /etc/network/interfaces


 auto eth1  //網卡名稱
iface eth1 inet static
address 192.168.0.168
netmask 255.255.0.0
gateway 192.168.0.10
network 192.168.0.0

broadcast 192.168.0.255
=======================================================

auto lo # 啟用 lookback 設備。
iface lo inet loopback # 設定 lookback 設備。

#DHCP 設定方式:

auto eth0
iface eth0 inet dhcp

#Static 設定方式:

  auto eth0
  iface eth0 inet static
  address 192.168.0.6
  netmask 255.255.255.0
  gateway 192.168.0.1 
  #gateway會視Router設定而變。
  dns-nameservers 8.8.8.8

設定ssh登入免密碼

前提:

如果出現ssh connection port 22 refuesed訊息
那可能是沒先安裝ssh

1.
安裝ssh:

sudo apt-get update
(如果這行失靈那表示提供服務的網站掛了,請更換軟體來源中心)
sudo apt-get install  openssh-server

2.
啟動ssh:
service ssh start



3.設定ssh免登入密碼
$ ssh-keygen -t rsa  -f ~/.ssh/id_rsa -P ''      
# 產生 RSA 金鑰,也可使用 DSA
P的後面是兩個單引號

$ cp ~/.ssh/id_rsa.pub  ~/.ssh/authorized_keys
# 將產生出來的 public key 設為合法


4.試試看登入localhost
ssh localhost

最後出現Last login :時間 from localhost表示登入成功
(第一次登入沒出現 Last login)

2013年6月28日 星期五

在ubuntu安裝 jdk7 or jdk6

兩年前裝過一次jdk
又忘了怎樣安裝再筆記一次吧

0.
去oracle官網下載
linux版的jdk

1.
首先sudo passwd root
啟動root帳號
接著su -
取得root權限

2.
將JDK安裝在/usr/lib/jvm底下

cd /usr/lib
 mkdir jvm

3.
解壓縮jdk  並且將jdk放在/usr/lib/jvm之下
tar zxvf ./jdk-7u25-linux-i586.tar.gz  -C /usr/lib/jvm
cd /usr/lib/jvm
更改資料夾名稱,方便管理
 mv jdk1.7.0_25/ jdk7

4.
開啟bashrc設定環境變量
bashrc是隱藏檔案,之後再補充他是幹啥吃的
gedit ~/.bashrc

在bashrc最後面加上
export JAVA_HOME=/usr/lib/jvm/jdk7
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

5.
讓bashrc的指令生效
source ~/.bashrc

6.
測試一下
java -version

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode)

上面Clent VM意思是JVM會看使用者電腦
的CPU與記憶體判斷這是Server還是Client等級的電腦


我原本用root帳號去設定環境變數
因此使用者帳號yyp的home目錄的.bashrc沒有設定環境變數
所以當利用yyp帳號登入時候
打上java指令,系統不認得

在使用者帳號目錄之下設定.bashrc環境變數之後
即可生效





安裝Jdk6 :

1.下載
jdk-6u45-linux-i586.bin

2.將bin檔案變成可執行黨

sudo chmod u+x jdk-6u45-linux-i586.bin

3.
其餘步驟與上面一樣









2013年6月12日 星期三

[面試] X品科技

連續面試三關
面試完整個人累癱


第二關是經理兼任資深工程師面試
我猜如果進去工作,未來主管就是他吧?
因為他講了很多工作內容與型態
RD工作一天怎樣過
問很多東西網路 密碼學 程式語言
很多東西忘了所以一直被他糾正
問到密碼學相關問題時感覺他好像很滿意我的回答的樣子
雖然一臉嚴肅,過程中不斷隱約露出笑容
這位RD人很好,在他底下工作應該可以成長更快


第三關董事長面試
這時已經有點疲倦又緊張
所以自介講的零零落落
之後拿著成績單一一詢問
問一堆數學課程有沒有實作程式語言
網路七層,七層有哪些協定、七層在幹嘛的............



兩題程式題目分別是:
青蛙的約會
八皇后問題(英文版)

回家查了一下 青蛙的約會也是ACM的問題。

最後!
斟酌一下,雖然薪水比家鄉開的高4k保十四
但是衡量一下吃的住的跟交通費,還有生涯規劃
就留在家鄉吧
原本最終目的想在家鄉工作

2013年6月6日 星期四

刪掉程式碼註解的code

/*
 * erase.cpp
 *
 *  Created on: 2013/6/6
 *      Author: YYP
 */

#include <iostream>
#include <io.h>
#include <stdio.h>
#include<fcntl.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

void remove_comment(char *buf, size_t size) {
char *p, *end, c;
char* sq_start, *dq_start;
//single qote單引號開始
//double qoute雙引號開始
char* lc_start, *bc_start;
//lc_start:(//)狀況用,指向斜線當作標記
//bc_start:(/*)狀況用,指向斜線當作標記
size_t len;

p = buf;
//檔案初始位置
end = p + size;
//檔案結尾=檔案初始+檔案大小

sq_start = NULL; //單引號 single quote
dq_start = NULL; //雙引號 double quote
lc_start = NULL;
bc_start = NULL;

while (p < end) {
c = *p; //p指向的字元assign給c

switch (c) {
case '\'': //單引號
if (dq_start || lc_start || bc_start) {
//忽略字串與注視中的單引號
p++; //不做任何事,指標移動到下一個
continue;
}
if (sq_start == NULL) {
sq_start = p++;
} else {

len = p++ - sq_start;
if (len == 2 && *(sq_start + 1) == '\\') { //忽略字元中的單引號
continue;

}
sq_start = NULL;
}
break;

case '\"': //遇到雙引號
if (sq_start || lc_start || bc_start) {
p++;
continue;
}
if (dq_start == NULL) {

dq_start = p++;//dq_start指向第一個引號(標記起來),
//之後p往後移動
} else {

if (*(p++ - 1) == '\\') {
//p-1若是斜線
//忽略字串中的雙引號
continue;
}
dq_start = NULL;//在這邊p已經指到第2n個雙引號
//在code裡面雙引號表示字串 雙雙城隊
//所以這裡要將dq_start=NULL
}
break;

case '/':  //遇見斜杠
if (sq_start || dq_start || lc_start || bc_start) {
//會進入這裡表示目前的斜線是被包在字元字串注釋之中
//忽略自串字元或注釋中的斜線
p++;
continue;
}
c = *(p + 1);//斜線的下一個字元,丟給C
if (c == '/') {//如果c是斜線
//有進入這裡就表示雙斜線了

lc_start = p;
//標記第一個斜線
p += 2;
//指標移動兩字元,指向雙斜線之後的字元

} else if (c == '*') {
bc_start = p;
//標記斜線
p += 2;

} else {
//進入這裡就表示該斜線是除號
p++;
}
break;
case '*'://遇到星號
if(sq_start|| dq_start||lc_start||bc_start==NULL)
{ //bc_start不為NULL表示目前p已經指向區塊註解的第一個斜線
//忽略字元、字串或行注釋的星號 還有忽略乘號
p++;
continue;
}

if(*(p+1)!='/')//下一個字元不是斜線"/",也就是說現在的星號不是區塊註解尾端
{
//游標繼續移動,這個星號並非刪除的標的物
//可能是乘號或指標
p++;
continue;
}
p+=2;//p往後移動兩個字元,跳過星號與反斜線(*)
//這樣做是因為要連同將區塊註解符號刪掉

memset(bc_start,' ',p - bc_start);
//將bc_start之後的p-bc_start區塊,全部變成空白自原
bc_start=NULL;
//恢復原狀



break;
case '\n': //遇到分行符號
if(lc_start == NULL){
//lc_start專門指向單行註解,雙斜線之後的第一個字元
//如果遇到單行註解,那麼lc_start不會是NULL
p++;
continue;
}

c=*(p-1);// 反斜線n(\n)的前面是哪個字元

memset(lc_start,' ',(c=='\r'?(p++ -1 ):p++)-lc_start);
//從lc_start開始之後的(c=='\r'?(p++ -1 ):p++)-lc_start字元換成空白字元
//因為windows與linux文字文件換行字元布一樣所以要c=='\r'?(p++ -1 ):p++)

lc_start=NULL;
//清掉註解之後,lc_start就不用標記斜線了

break;

default:
p++;
break;

}

}//while

if(lc_start){
memset(lc_start,' ',p - lc_start);
}


}

int main() {

int fd, n;
char buf[102400];
//裝載102400個字元,讀取檔案太大,會執行不完
fd = open("D:\\uuu.txt", _O_RDONLY, 0);
//open是fcntl.h裡面的東西
//open回傳檔案代號,如果沒有檔案則回傳-1
if (fd == -1) {
cout << "file not open" << endl;
return -1;
}

n = read(fd, buf, sizeof(buf));
//read(檔案,存放點,讀進多少個字元);
//read()回傳讀進多少字元

if (n == -1 || n == 0) {
close(fd);
return -1;
}

remove_comment(buf, n);

*(buf + n) = '\0';
//在buf最末端加上\0以示檔案結束
//不加上此行,printf(buf)會印出,刪掉註解前的部分檔案資訊

printf(buf);
close(fd);

// cout << "file open" << endl;
return 0;

}

2013年6月3日 星期一

java多媒體

去oracle官網下在jmf安裝檔案
且重新開機


在eclipse專案點下右鍵選properties→java build path→新增jre
將jmf2.1.1e/lib底下的jre匯入。
如此一來可以使用jmf的API了

2013年6月2日 星期日

oracle 建立表格,更改table欄位資料型態,新增刪除table欄位

建立表格跟其他SQL一樣

建立表格emp
create table emp
( empID varchar2(10),
empName varchar2(10),
empAdd varchar2(20),
empPhone varchar2(12),
email varchar2(20));

表格名稱:emp

查看table結構:
describe tableName;

describe emp;

 名稱                                      空值?    類型
 ----------------------------------------- -------- --------------

 EMPID                                              VARCHAR2(10)
 EMPNAME                                            VARCHAR2(10)
 EMPADD                                             VARCHAR2(20)
 EMPPHONE                                           VARCHAR2(12)
 EMAIL                                              VARCHAR2(20)

更改table資料欄位型態
alter table 表格名稱 modify (  欄位  資料型態(10));

將empadd欄位資料型態從varchar2改為char
SQL> alter table emp modify (empadd char(11));

驗證一下:
SQL> describe emp;
 名稱                                      空值?    類型
 ----------------------------------------- -------- ----------------

 EMPID                                              VARCHAR2(10)
 EMPNAME                                            VARCHAR2(10)
 EMPADD                                             CHAR(11)
 EMPPHONE                                           VARCHAR2(12)
 EMAIL                                              VARCHAR2(20)


新增table欄位:
給table emp新增enote欄位

SQL> alter table emp add (enote char(20));

SQL> describe emp;
 名稱                                      空值?    類型
 ----------------------------------------- -------- ---------------

 EMPID                                              VARCHAR2(10)
 EMPNAME                                            VARCHAR2(10)
 EMPADD                                             CHAR(11)
 EMPPHONE                                           VARCHAR2(12)
 EMAIL                                              VARCHAR2(20)
 ENOTE                                              CHAR(20)



刪除欄位:
alter table 表格名稱 drop column 欄位名稱;

SQL> alter table emp drop column enote;

已更改表格.

SQL> describe emp;
 名稱                                      空值?    類型
 ----------------------------------------- -------- -------------

 EMPID                                              VARCHAR2(10)
 EMPNAME                                            VARCHAR2(10)
 EMPADD                                             CHAR(11)
 EMPPHONE                                           VARCHAR2(12)
 EMAIL                                              VARCHAR2(20)





















將table建立在tablespace

建立表格空間

 create tablespace ts1 datafile 'D:\oracle\ts1.dbf' size 100m
 autoextend on next 200m maxsize 1024m
 default storage (initial 10m next 1m)
 permanent
 online
 logging;


 default storage (initial 10m next 1m)
系統自動產生預設
permanent:永久,固定的表格空間
online:連線狀態可以使用


建立表格

create table customer
(custID varchar2(10),
custName varchar2(22),
custAdd varchar2(20),
custPhone varchar2(12),
custFax varchar2(12))
tablespace ts1;

在最後指定tablespace 名稱就可以了
如果不指定tablespace名稱那麼就會將表格塞入預設的tablespace
一般在USERS
否則會出現錯誤

varchar2 相當於MSSQL的varchar
可變長度字元資料型態  最小是1  最大是4000bytes




2013年6月1日 星期六

oracle將指令記錄下來---spool

SQL> spool lab.txt

SQL> select sysdate from dual;

SYSDATE
--------------
02-06月-13

SQL> select 1+1 from dual;

       1+1
----------
         2

SQL> select user from dual;

USER
------------------------------------------------------------
SYSTEM

SQL> spool off


那麼會將以上指令,存成lab.txt
存放在C:\\Users\Administrator
(我登入windows用Administatror帳號)

TableSpace觀念與建立、更改、刪除

Oracle系統可以擁有多個資料庫
一個資料庫可以擁有多個Tablespace
一個Tablespace可以有多個table

Tablespace只能由隸屬的資料庫管理




 create tablespace ts1 datafile 'D:\oracle\test_db01.dbf' size 100m
 autoextend on next 100m maxsize 1024m
 default storage (initial 10m next 1m)
 online
 logging;

1.必須啟動資料庫才可以建立tablespace
2.路徑的資料夾必須存在才可建立檔案

更改表格空間屬性值
alter tablespace tablespace_Name  offline/online/nologging/logging


增加資料檔案到表格空間
 alter tablespace ts1 add datafile 'D:\oracle\test02.dbf' size 100m reuse au
toextend on next 100m maxsize unlimited;
會在目錄下新增檔案



刪除tablespace , 一併刪掉檔案
drop tablespace tablespaceName including contents and datafiles;

不想刪掉檔案則
drop tablespace tablespaceName ;
以圖形介面來說
建立資料庫、設定資料庫必須到"資料庫組態輔助程式"


oracle 啟動資料庫 關閉資料庫 設定資料庫

啟動資料庫真麻煩
換個角度來講oracle操作步驟真嚴謹

啟動資料庫與關閉資料庫指令有許多種類,
要看不同場合使用
本篇是在一般場合下使用


啟動資料庫必須用sys帳戶以sysdba腳色登入
(如何更改帳號以sys登入呢?  conn sys as sysdba)
打上指令
startup open databasename

如果以帳戶system登入
啟動資料庫的話會
出現權限不足的訊息
如果不先打上關閉資料庫指令
shutdown immediate
即使換上sys 帳戶啟動資料庫,則會出現
"無法啟動已執行中的oracle"的訊息


如果想啟動不存在的資料庫,則會出現
Total System Global Area  413372416 bytes
Fixed Size                  2176288 bytes
Variable Size             314575584 bytes
Database Buffers           88080384 bytes
Redo Buffers                8540160 bytes
ORA-01504: ????? 'ORC' ??? db_name 'first' ???

這是必須關閉資料庫
再重新啟動正確的資料庫




oracle忘記密碼、解鎖帳號

先去cmd:
打上
sqlplus / as sysdba

以系統資料庫管理師之姿進入資料庫


alter user system identified by 新密碼;
更改帳號system的密碼,修改為"新密碼"


alter user sys identified by newpassword;


解鎖指令
alter user system account unlock;
alter user scott account unlock;
將system 與scott解鎖


scott是測試oracle的帳號
密碼是tiger