paulwong

          #

          MINA資源

          socket 通信
          http://yaojialing.iteye.com/category/115609

          使用 Apache MINA 2 開發(fā)網(wǎng)絡(luò)應(yīng)用
          http://www.ibm.com/developerworks/cn/java/j-lo-mina2/

          直接操作mina的IoBuffer流
          http://autumnice.blog.163.com/blog/static/555200201011493410310/

          pache mina 學(xué)習(xí)(十一)-----狀態(tài)機(jī)(stateMachine)
          http://cages.iteye.com/blog/1530849

          運(yùn)用 Apache MINA 2 開發(fā)網(wǎng)絡(luò)運(yùn)用 [多圖]
          http://www.lj8lj8.com/chengxukaifa/Java/338853_13.html


          posted @ 2013-05-14 17:41 paulwong 閱讀(320) | 評(píng)論 (0)編輯 收藏

          Oracle數(shù)據(jù)庫備份與還原命令[轉(zhuǎn)]

          數(shù)據(jù)導(dǎo)出:

          1 將數(shù)據(jù)庫TEST完全導(dǎo)出,用戶名system 密碼manager 導(dǎo)出到D:\daochu.dmp中

          exp system/manager@TEST file=d:\daochu.dmp full=y

          2 將數(shù)據(jù)庫中system用戶與sys用戶的表導(dǎo)出

          exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)

          3 將數(shù)據(jù)庫中的表table1 、table2導(dǎo)出

          exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)

          4 將數(shù)據(jù)庫中的表table1中的字段filed1以"00"打頭的數(shù)據(jù)導(dǎo)出

          exp system/manager@TEST file=d:\daochu.dmp tables=(table1)query=\" where filed1 like '00%'\"

          上面是常用的導(dǎo)出,對(duì)于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。

          不過在上面命令后面 加上 compress=y 就可以了

          數(shù)據(jù)的導(dǎo)入

          1 將D:\daochu.dmp 中的數(shù)據(jù)導(dǎo)入 TEST數(shù)據(jù)庫中。

          imp system/manager@TEST file=d:\daochu.dmp

          上面可能有點(diǎn)問題,因?yàn)橛械谋硪呀?jīng)存在,然后它就報(bào)錯(cuò),對(duì)該表就不進(jìn)行導(dǎo)入。

          在后面加上 ignore=y 就可以了。

          2 將d:\daochu.dmp中的表table1 導(dǎo)入

          imp system/manager@TEST file=d:\daochu.dmp tables=(table1)

          基本上上面的導(dǎo)入導(dǎo)出夠用了。不少情況我是將表徹底刪除,然后導(dǎo)入。

          注意:

          你要有足夠的權(quán)限,權(quán)限不夠它會(huì)提示你。

          數(shù)據(jù)庫時(shí)可以連上的??梢杂胻nsping TEST 來獲得數(shù)據(jù)庫TEST能否連上

          附錄一:
          給用戶增加導(dǎo)入數(shù)據(jù)權(quán)限的操作
          第一,啟動(dòng)sql*puls
          第二,以system/manager登陸
          第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經(jīng)創(chuàng)建過用戶,這步可以省略)
          第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
          DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
          DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
          第五, 運(yùn)行-cmd-進(jìn)入dmp文件所在的目錄,
          imp userid=system/manager full=y file=*.dmp
          或者 imp userid=system/manager full=y file=filename.dmp



          安裝oracle9I
          Szportdb\szportdb\szportdb
          用sysdba 登錄建立用戶:szportdb 表空間可以自己設(shè)定,也可以Users
          倒入數(shù)據(jù)庫。

          Imp szportdb/szportdb@szportdb full=y C:\szportdb.dmp ignore=

          posted @ 2013-05-12 15:07 paulwong 閱讀(1797) | 評(píng)論 (0)編輯 收藏

          基于Apache Mina實(shí)現(xiàn)的TCP長連接和短連接實(shí)例

          1、前言

          Apache MINA是Apache組織的一個(gè)優(yōu)秀的項(xiàng)目。MINA是Multipurpose Infrastructure for NetworkApplications的縮寫。它是一個(gè)網(wǎng)絡(luò)應(yīng)用程序框架,用來幫助用戶非常方便地開發(fā)高性能和高可靠性的網(wǎng)絡(luò)應(yīng)用程序。在本文中介紹了 如何通過Apache Mina2.0來實(shí)現(xiàn)TCP協(xié)議長連接和短連接應(yīng)用。

          2、系統(tǒng)介紹

          2.1系統(tǒng)框架

          整個(gè)系統(tǒng)由兩個(gè)服務(wù)端程序和兩個(gè)客戶端程序組成。分別實(shí)現(xiàn)TCP長連接和短連接通信。

          系統(tǒng)業(yè)務(wù)邏輯是一個(gè)客戶端與服務(wù)端建立長連接,一個(gè)客戶端與服務(wù)端建立短連接。數(shù)據(jù)從短連接客戶端經(jīng)過服務(wù)端發(fā)送到長連接客戶端,并從長連接客戶端接收響應(yīng)數(shù)據(jù)。當(dāng)收到響應(yīng)數(shù)據(jù)后斷開連接。

          系統(tǒng)架構(gòu)圖如下:


          2.2處理流程

          系統(tǒng)處理流程如下:

          1) 啟動(dòng)服務(wù)端程序,監(jiān)聽8001和8002端口。

          2) 長連接客戶端向服務(wù)端8002端口建立連接,服務(wù)端將連接對(duì)象保存到共享內(nèi)存中。由于采用長連接方式,連接對(duì)象是唯一的。

          3) 短連接客戶端向服務(wù)端8001端口建立連接。建立連接后創(chuàng)建一個(gè)連接對(duì)象。

          4) 短連接客戶端連接成功后發(fā)送數(shù)據(jù)。服務(wù)端接收到數(shù)據(jù)后從共享內(nèi)存中得到長連接方式的連接對(duì)象,使用此對(duì)象向長連接客戶端發(fā)送數(shù)據(jù)。發(fā)送前將短連接對(duì)象設(shè)為長連接對(duì)象的屬性值。

          5) 長連接客戶端接收到數(shù)據(jù)后返回響應(yīng)數(shù)據(jù)。服務(wù)端從長連接對(duì)象的屬性中取得短連接對(duì)象,通過此對(duì)象將響應(yīng)數(shù)據(jù)發(fā)送給短連接客戶端。

          6) 短連接客戶端收到響應(yīng)數(shù)據(jù)后,關(guān)閉連接。

          3、服務(wù)端程序

          3.1長連接服務(wù)端

          服務(wù)啟動(dòng)

          public class MinaLongConnServer {

          private static final int PORT = 8002;



          public void start()throws IOException{

          IoAcceptor acceptor = new NioSocketAcceptor();



          acceptor.getFilterChain().addLast("logger", new LoggingFilter());

          acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



          acceptor.setHandler(new MinaLongConnServerHandler());

          acceptor.getSessionConfig().setReadBufferSize(2048);

          acceptor.bind(new InetSocketAddress(PORT));

          System.out.println("Listeningon port " + PORT);

          }

          }

          //消息處理

          public class MinaLongConnServerHandler extends IoHandlerAdapter {

          private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



          @Override

          public void sessionOpened(IoSession session) {

          InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

          String clientIp = remoteAddress.getAddress().getHostAddress();

          logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId()));

          logger.info("接收來自客戶端 :" + clientIp + "的連接.");

          Initialization init = Initialization.getInstance();

          HashMap<String, IoSession> clientMap =init.getClientMap();

          clientMap.put(clientIp, session);

          }



          @Override

          public void messageReceived(IoSession session, Object message) {

          logger.info("Messagereceived in the long connect server..");

          String expression = message.toString();

          logger.info("Message is:" + expression);

          IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession");

          logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId()));

          shortConnSession.write(expression);

          }



          @Override

          public void sessionIdle(IoSession session, IdleStatus status) {

          logger.info("Disconnectingthe idle.");

          // disconnect an idle client

          session.close(true);

          }



          @Override

          public void exceptionCaught(IoSession session, Throwable cause) {

          // close the connection onexceptional situation

          logger.warn(cause.getMessage(), cause);

          session.close(true);

          }

          }

          3.2短連接服務(wù)端

          服務(wù)啟動(dòng)

          public class MinaShortConnServer {

          private static final int PORT = 8001;



          public void start()throws IOException{

          IoAcceptor acceptor = new NioSocketAcceptor();



          acceptor.getFilterChain().addLast("logger", new LoggingFilter());

          acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



          acceptor.setHandler(new MinaShortConnServerHandler());

          acceptor.getSessionConfig().setReadBufferSize(2048);

          acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

          acceptor.bind(new InetSocketAddress(PORT));

          System.out.println("Listeningon port " + PORT);

          }

          }

          消息處理

          public class MinaShortConnServerHandler extends IoHandlerAdapter {

          private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



          @Override

          public void sessionOpened(IoSession session) {

          InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

          logger.info(remoteAddress.getAddress().getHostAddress());

          logger.info(String.valueOf(session.getId()));

          }



          @Override

          public void messageReceived(IoSession session, Object message) {

          logger.info("Messagereceived in the short connect server");

          String expression = message.toString();

          Initialization init = Initialization.getInstance();

          HashMap<String, IoSession> clientMap =init.getClientMap();

          if (clientMap == null || clientMap.size() == 0) {

          session.write("error");

          else {

          IoSession longConnSession = null;

          Iterator<String> iterator =clientMap.keySet().iterator();

          String key = "";

          while (iterator.hasNext()) {

          key = iterator.next();

          longConnSession = clientMap.get(key);

          }

          logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId()));

          logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId()));

          longConnSession.setAttribute("shortConnSession",session);

          longConnSession.write(expression);

          }

          }



          @Override

          public void sessionIdle(IoSession session, IdleStatus status) {

          logger.info("Disconnectingthe idle.");

          // disconnect an idle client

          session.close(true);

          }



          @Override

          public void exceptionCaught(IoSession session, Throwable cause) {

          // close the connection onexceptional situation

          logger.warn(cause.getMessage(), cause);

          session.close(true);

          }

          }



          4、客戶端程序

          4.1長連接客戶端

          使用java.net.Socket來實(shí)現(xiàn)向服務(wù)端建立連接。Socket建立后一直保持連接,從服務(wù)端接收到數(shù)據(jù)包后直接將原文返回。

          public class TcpKeepAliveClient {

          private String ip;

          private int port;

          private static Socket socket = null;

          private static int timeout = 50 * 1000;



          public TcpKeepAliveClient(String ip, int port) {

          this.ip = ip;

          this.port = port;

          }



          public void receiveAndSend() throws IOException {

          InputStream input = null;

          OutputStream output = null;



          try {

          if (socket == null || socket.isClosed() || !socket.isConnected()) {

          socket = new Socket();

          InetSocketAddress addr = new InetSocketAddress(ip, port);

          socket.connect(addr, timeout);

          socket.setSoTimeout(timeout);

          System.out.println("TcpKeepAliveClientnew ");

          }



          input = socket.getInputStream();

          output = socket.getOutputStream();



          // read body

          byte[] receiveBytes = {};// 收到的包字節(jié)數(shù)組

          while (true) {

          if (input.available() > 0) {

          receiveBytes = new byte[input.available()];

          input.read(receiveBytes);



          // send

          System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes));

          output.write(receiveBytes, 0, receiveBytes.length);

          output.flush();

          }

          }



          catch (Exception e) {

          e.printStackTrace();

          System.out.println("TcpClientnew socket error");

          }

          }



          public static void main(String[] args) throws Exception {

          TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);

          client.receiveAndSend();

          }



          }

          4.2短連接客戶端

          服務(wù)啟動(dòng)

          public class MinaShortClient {

          private static final int PORT = 8001;



          public static void main(String[] args) throws IOException,InterruptedException {

          IoConnector connector = new NioSocketConnector();

          connector.getSessionConfig().setReadBufferSize(2048);



          connector.getFilterChain().addLast("logger", new LoggingFilter());

          connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



          connector.setHandler(new MinaShortClientHandler());

          for (int i = 1; i <= 10; i++) {

          ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));

          future.awaitUninterruptibly();

          IoSession session =future.getSession();

          session.write(i);

          session.getCloseFuture().awaitUninterruptibly();



          System.out.println("result=" + session.getAttribute("result"));

          }

          connector.dispose();



          }

          }

          消息處理

          public class MinaShortClientHandler extends IoHandlerAdapter{

          private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



          public MinaShortClientHandler() {



          }



          @Override

          public void sessionOpened(IoSession session) {

          }



          @Override

          public void messageReceived(IoSession session, Object message) {

          logger.info("Messagereceived in the client..");

          logger.info("Message is:" + message.toString());

          session.setAttribute("result", message.toString());

          session.close(true);

          }



          @Override

          public void exceptionCaught(IoSession session, Throwable cause) {

          session.close(true);

          }

          }

          5、總結(jié)

          通過本文中的例子,Apache Mina在服務(wù)端可實(shí)現(xiàn)TCP協(xié)議長連接和短連接。在客戶端只實(shí)現(xiàn)了短連接模式,長連接模式也是可以實(shí)現(xiàn)的(在本文中還是采用傳統(tǒng)的java Socket方式)。兩個(gè)服務(wù)端之間通過共享內(nèi)存的方式來傳遞連接對(duì)象也許有更好的實(shí)現(xiàn)方式。

          posted @ 2013-05-11 21:56 paulwong 閱讀(559) | 評(píng)論 (0)編輯 收藏

          使用 Apache MINA 開發(fā)高性能網(wǎng)絡(luò)應(yīng)用程序[轉(zhuǎn)]

          本文將通過一個(gè)簡(jiǎn)單的問候程序 HelloServer 來介紹 MINA 的基礎(chǔ)架構(gòu)的同時(shí)演示如何使用 MINA 開發(fā)網(wǎng)絡(luò)應(yīng)用程序。
          Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個(gè)較新的項(xiàng)目,它為開發(fā)高性能和高可用性的網(wǎng)絡(luò)應(yīng)用程序提供了非常便利的框架。當(dāng)前發(fā)行的 MINA 版本支持基于 Java NIO 技術(shù)的 TCP/UDP 應(yīng)用程序開發(fā)、串口通訊程序(只在最新的預(yù)覽版中提供),MINA 所支持的功能也在進(jìn)一步的擴(kuò)展中。

          目前正在使用 MINA 的軟件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

          本文將通過一個(gè)簡(jiǎn)單的問候程序 HelloServer 來介紹 MINA 的基礎(chǔ)架構(gòu)的同時(shí)演示如何使用MINA 開發(fā)網(wǎng)絡(luò)應(yīng)用程序。

          環(huán)境準(zhǔn)備

          首先到官方網(wǎng)站下載最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下載之前先介紹一下 MINA 的兩個(gè)版本:1.0.x 適合運(yùn)行環(huán)境為 JDK1.4,1.1.x 適合 JDK1.5 的版本,兩者的編譯環(huán)境都需要 JDK1.5。JDK1.5 已經(jīng)是非常普遍了,本文中使用 1.1.5 版本的 MINA,編譯和運(yùn)行所需的文件是 mina-core-1.1.5.jar。
          下載 MINA 的依賴包 slf4j。MINA 使用此項(xiàng)目作為日志信息的輸出,而 MINA 本身并不附帶此項(xiàng)目包,請(qǐng)到http://www.slf4j.org/download.html 地址下載 slf4j 包,slf4j 項(xiàng)目解壓后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 這兩個(gè) jar 文件。如果沒有這兩個(gè)文件就會(huì)導(dǎo)致啟動(dòng)例子程序的時(shí)候報(bào) org/slf4j/LoggerFactory 類沒找到的錯(cuò)誤。
          當(dāng)然要求機(jī)器上必須裝有 1.5 或者更新版本的 JDK。
          最好你應(yīng)該選擇一個(gè)順手的 Java 開發(fā)環(huán)境例如 Eclipse 或者 NetBeans 之類的,可以更方便的編碼和調(diào)試,雖然我們的最低要求只是一個(gè)簡(jiǎn)單的文本編輯器而已。



          編寫代碼并執(zhí)行

          編寫代碼 HelloServer.java 如下

          package demo.mina.echo;

          import java.io.IOException;
          import java.net.InetSocketAddress;

          import org.apache.mina.common.*;
          import org.apache.mina.transport.socket.nio.*;
          import org.apache.mina.filter.codec.ProtocolCodecFilter;
          import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

          /**
           * HelloServer演示程序
           * 
          @author liudong (
                              
          http://www.dlog.cn/javayou
                          )
           
          */
          public class HelloServer {

              private static final int PORT = 8080;
          /**
           * 
          @param args
           * 
          @throws IOException 
           
          */
          public static void main(String[] args) throws IOException {
                  IoAcceptor acceptor = new SocketAcceptor();        
                  IoAcceptorConfig config = new SocketAcceptorConfig();
                  DefaultIoFilterChainBuilder chain = config.getFilterChain();
                  //使用字符串編碼
                  chain.addLast("codec", 
          new ProtocolCodecFilter(new TextLineCodecFactory()));
                  //啟動(dòng)HelloServer
                  acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);
                  System.out
          .println("HelloServer started on port " + 
          PORT);
              }
          }

          /**
           * HelloServer的處理邏輯
           * 
          @author liudong
           
          */
          class HelloHandler extends IoHandlerAdapter {
          /**
           * 當(dāng)有異常發(fā)生時(shí)觸發(fā)
           
          */
          @Override
              public void exceptionCaught(IoSession ssn, Throwable cause) {
                  cause.printStackTrace();
                  ssn.close();
              }

          /**
           * 有新連接時(shí)觸發(fā)
           
          */
          @Override
          public void sessionOpened(IoSession ssn) throws Exception {
              System.out.println("session open for " + ssn.getRemoteAddress());
              }

          /**
           * 連接被關(guān)閉時(shí)觸發(fā)
           
          */
          @Override
          public void sessionClosed(IoSession ssn) throws Exception {
              System.out.println("session closed from " + ssn.getRemoteAddress());
              }

          /**
           * 收到來自客戶端的消息
           
          */
          public void messageReceived(IoSession ssn, Object msg) throws Exception {    
              String ip = ssn.getRemoteAddress().toString();
          System.out.println("===> Message From " + ip +" : " + msg);    
              ssn.write("Hello " + msg);
              }
          }

          編譯執(zhí)行
          先不用試著去讀懂每一行代碼的具體意思,用你順手的編譯器編譯 HelloServer.java,如果報(bào)錯(cuò)請(qǐng)確認(rèn)是否已將前面提到的三個(gè) jar 文件添加至類路徑中。如果一切順利接著就可以啟動(dòng)HelloServer 程序,啟動(dòng)后提示:HelloServer started on port 8080 表示啟動(dòng)成功,如果啟動(dòng)失敗,問題無外乎是類沒找到或者端口占用。如果端口被占用的話,換一個(gè)羅,修改 PORT 常量值后再次編譯并啟動(dòng)。

          測(cè)試服務(wù)器
          打開命令行窗口,輸入 telnet localhost 8080 后,輸入您的英文名或者其他一些亂七八糟的字符后回車再去看看剛啟動(dòng)的服務(wù)程序有何反應(yīng)。我的反應(yīng)如下:

          HelloServer started on port 8080
          session open for /127.0.0.1:3023
          ===> Message From /127.0.0.1:3023 :hello
          ===> Message From /127.0.0.1:3023 :hello
          ===> Message From /127.0.0.1:3023 :liudong
          ===> Message From /127.0.0.1:3023 :Winter Lau



          好了,一切正常,恭喜你的第一個(gè)使用 MINA 開發(fā)的網(wǎng)絡(luò)程序已經(jīng)成功運(yùn)行了。




          MINA 基本類的描述

          在介紹架構(gòu)之前先認(rèn)識(shí)幾個(gè)接口:

          IoAccepter 相當(dāng)于網(wǎng)絡(luò)應(yīng)用程序中的服務(wù)器端

          IoConnector 相當(dāng)于客戶端

          IoSession 當(dāng)前客戶端到服務(wù)器端的一個(gè)連接實(shí)例

          IoHandler 業(yè)務(wù)處理邏輯

          IoFilter 過濾器用于懸接通訊層接口與業(yè)務(wù)層接口






          MINA 的基礎(chǔ)架構(gòu)

          下圖是 MINA 的架構(gòu)圖,


          圖 1:MINA 的架構(gòu)圖


          在圖中的模塊鏈中,IoService 便是應(yīng)用程序的入口,相當(dāng)于我們前面代碼中的 IoAccepter,IoAccepter 便是 IoService 的一個(gè)擴(kuò)展接口。IoService 接口可以用來添加多個(gè) IoFilter,這些 IoFilter 符合責(zé)任鏈模式并由 IoProcessor 線程負(fù)責(zé)調(diào)用。而 IoAccepter 在 ioService 接口的基礎(chǔ)上還提供綁定某個(gè)通訊端口以及取消綁定的接口。在上面的例子中,我們是這樣使用 IoAccepter 的:

          IoAcceptor acceptor = new SocketAcceptor();



          相當(dāng)于我們使用了 Socket 通訊方式作為服務(wù)的接入,當(dāng)前版本的 MINA 還提供了除 SocketAccepter 外的基于數(shù)據(jù)報(bào)文通訊的 DatagramAccepter 以及基于管道通訊的 VmPipeAccepter。另外還包括串口通訊接入方式,目前基于串口通訊的接入方式已經(jīng)在最新測(cè)試版的 MINA 中提供。你也可以自行實(shí)現(xiàn) IoService 接口來使用自己的通訊方式。

          而在上圖中最右端也就是 IoHandler,這便是業(yè)務(wù)處理模塊。相當(dāng)于前面例子中的 HelloHandler 類。在業(yè)務(wù)處理類中不需要去關(guān)心實(shí)際的通訊細(xì)節(jié),只管處理客戶端傳輸過來的信息即可。編寫 Handler 類就是使用 MINA 開發(fā)網(wǎng)絡(luò)應(yīng)用程序的重心所在,相當(dāng)于 MINA 已經(jīng)幫你處理了所有的通訊方面的細(xì)節(jié)問題。為了簡(jiǎn)化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實(shí)現(xiàn)了 IoHandler 接口,但并不做任何處理。

          一個(gè) IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文檔):

          void exceptionCaught(IoSession session, Throwable cause)
          當(dāng)接口中其他方法拋出異常未被捕獲時(shí)觸發(fā)此方法
          void messageReceived(IoSession session, Object message)
          當(dāng)接收到客戶端的請(qǐng)求信息后觸發(fā)此方法.
          void messageSent(IoSession session, Object message)
          當(dāng)信息已經(jīng)傳送給客戶端后觸發(fā)此方法.
          void sessionClosed(IoSession session)
          當(dāng)連接被關(guān)閉時(shí)觸發(fā),例如客戶端程序意外退出等等.
          void sessionCreated(IoSession session)
          當(dāng)一個(gè)新客戶端連接后觸發(fā)此方法.
          void sessionIdle(IoSession session, IdleStatus status)
          當(dāng)連接空閑時(shí)觸發(fā)此方法.
          void sessionOpened(IoSession session)
          當(dāng)連接后打開時(shí)觸發(fā)此方法,一般此方法與 sessionCreated 會(huì)被同時(shí)觸發(fā)


          前面我們提到 IoService 是負(fù)責(zé)底層通訊接入,而 IoHandler 是負(fù)責(zé)業(yè)務(wù)處理的。那么 MINA 架構(gòu)圖中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一個(gè)用途卻是必須的,那就是作為 IoService 和 IoHandler 之間的橋梁。IoHandler 接口中最重要的一個(gè)方法是 messageReceived,這個(gè)方法的第二個(gè)參數(shù)是一個(gè) Object 型的消息,總所周知,Object 是所有 Java 對(duì)象的基礎(chǔ),那到底誰來決定這個(gè)消息到底是什么類型呢?答案也就在這個(gè) IoFilter 中。在前面使用的例子中,我們添加了一個(gè) IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個(gè)過濾器的作用是將來自客戶端輸入的信息轉(zhuǎn)換成一行行的文本后傳遞給 IoHandler,因此我們可以在 messageReceived 中直接將 msg 對(duì)象強(qiáng)制轉(zhuǎn)換成 String 對(duì)象。

          而如果我們不提供任何過濾器的話,那么在 messageReceived 方法中的第二個(gè)參數(shù)類型就是一個(gè) byte 的緩沖區(qū),對(duì)應(yīng)的類是 org.apache.mina.common.ByteBuffer。雖然你也可以將解析客戶端信息放在 IoHandler 中來做,但這并不是推薦的做法,使原來清晰的模型又模糊起來,變得 IoHandler 不只是業(yè)務(wù)處理,還得充當(dāng)協(xié)議解析的任務(wù)。

          MINA自身帶有一些常用的過濾器,例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。



          其他

          MINA 不僅僅是用來開發(fā)網(wǎng)絡(luò)服務(wù)器端應(yīng)用程序,它一樣可以使用 IoConnector 來連接到各種各樣的網(wǎng)絡(luò)服務(wù)程序。

          通過本文中 HelloServer 這個(gè)例子,我們?cè)隗@嘆 MINA 可以帶來多么大便利的同時(shí),還不得不為其卓越的性能而驕傲,據(jù)稱使用MINA開發(fā)服務(wù)器程序的性能已經(jīng)逼近使用 C/C++ 語言開發(fā)的網(wǎng)絡(luò)服務(wù)。作為 MINA 的入門文章,性能問題不在本文討論范圍內(nèi)。

          另外在 MINA 壓縮包中附帶有不少比 HelloServer 要好得多的例子,通過這些例子可以進(jìn)一步的了解并掌握 MINA。




          參考資料

          http://mina.apache.org MINA 官方網(wǎng)站


          http://mina.apache.org/features.html 您可以在這里查看關(guān)于 MINA 的更多特性


          http://mina.apache.org/testimonials.html 看看別人是如何評(píng)價(jià) MINA 的 http://asyncweb.safehaus.org/使用 MINA 開發(fā)的高性能 WEB 服務(wù)器 

          posted @ 2013-05-11 21:41 paulwong 閱讀(307) | 評(píng)論 (0)編輯 收藏

          使用Sqoop實(shí)現(xiàn)HDFS與Mysql互轉(zhuǎn)


          簡(jiǎn)介
          Sqoop是一個(gè)用來將Hadoop和關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)相互轉(zhuǎn)移的工具,可以將一個(gè)關(guān)系型數(shù)據(jù)庫(例如 : MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導(dǎo)入到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)入到關(guān)系型數(shù)據(jù)庫中。

          http://sqoop.apache.org/

          環(huán)境
          當(dāng)調(diào)試過程出現(xiàn)IncompatibleClassChangeError一般都是版本兼容問題。

          為了保證hadoop和sqoop版本的兼容性,使用Cloudera,

          Cloudera簡(jiǎn)介:

          Cloudera為了讓Hadoop的配置標(biāo)準(zhǔn)化,可以幫助企業(yè)安裝,配置,運(yùn)行hadoop以達(dá)到大規(guī)模企業(yè)數(shù)據(jù)的處理和分析。

          http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDHTarballs/3.25.2013/CDH4-Downloadable-Tarballs/CDH4-Downloadable-Tarballs.html

          下載安裝hadoop-0.20.2-cdh3u6,sqoop-1.3.0-cdh3u6。

          安裝
          安裝比較簡(jiǎn)單,直接解壓即可

          唯一需要做的就是將mysql的jdbc適配包mysql-connector-java-5.0.7-bin.jar copy到$SQOOP_HOME/lib下。

          配置好環(huán)境變量:/etc/profile

          export SQOOP_HOME=/home/hadoop/sqoop-1.3.0-cdh3u6/

          export PATH=$SQOOP_HOME/bin:$PATH

          MYSQL轉(zhuǎn)HDFS-示例
          ./sqoop import --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shop -m 1 --target-dir /user/recsys/input/shop/$today


          HDFS轉(zhuǎn)MYSQ-示例
          ./sqoop export --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shopassoc --fields-terminated-by ',' --export-dir /user/recsys/output/shop/$today

          示例參數(shù)說明
          (其他參數(shù)我未使用,故不作解釋,未使用,就沒有發(fā)言權(quán),詳見命令help)


          參數(shù)類型

          參數(shù)名

          解釋

          公共

          connect

          Jdbc-url

          公共

          username

          ---

          公共

          password

          ---

          公共

          table

          表名

          Import

          target-dir

          制定輸出hdfs目錄,默認(rèn)輸出到/user/$loginName/

          export

          fields-terminated-by

          Hdfs文件中的字段分割符,默認(rèn)是“\t”

          export

          export-dir

          hdfs文件的路徑

          posted @ 2013-05-11 21:27 paulwong 閱讀(460) | 評(píng)論 (0)編輯 收藏

          全方位的技術(shù)服務(wù)及相關(guān)技術(shù)解決方案(純java解決方案)

          http://www.iteye.com/topic/1128561 @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

          posted @ 2013-05-11 00:17 paulwong 閱讀(516) | 評(píng)論 (0)編輯 收藏

          讓spring-data-jpa解放你的DAO

               摘要: 最近項(xiàng)目用Spring-data-jpa,確實(shí)很方便。如果你也曾經(jīng)被重復(fù)無聊的dao代碼雷到的話,就可以考慮將ORM framework換成spring-data-jpa了。 只要繼承CrudRepository或者PagingAndSortingRepository,dao層基本上就只剩下定義接口方法這么一件事情了,連實(shí)現(xiàn)都不用寫,因?yàn)槟J(rèn)實(shí)現(xiàn)SimpleJpaRepository已經(jīng)幫你實(shí)現(xiàn)了...  閱讀全文

          posted @ 2013-05-09 14:16 paulwong 閱讀(5573) | 評(píng)論 (1)編輯 收藏

          mysql分表,分區(qū)的區(qū)別和聯(lián)系

          一,什么是mysql分表,分區(qū)

          什么是分表,從表面意思上看呢,就是把一張表分成N多個(gè)小表,具體請(qǐng)看mysql分表的3種方法

          什么是分區(qū),分區(qū)呢就是把一張表的數(shù)據(jù)分成N多個(gè)區(qū)塊,這些區(qū)塊可以在同一個(gè)磁盤上,也可以在不同的磁盤上,具體請(qǐng)參考mysql分區(qū)功能詳細(xì)介紹,以及實(shí)例

          二,mysql分表和分區(qū)有什么區(qū)別呢

          1,實(shí)現(xiàn)方式上

          a),mysql的分表是真正的分表,一張表分成很多表后,每一個(gè)小表都是完正的一張表,都對(duì)應(yīng)三個(gè)文件,一個(gè).MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。

          1. [root@BlackGhost test]# ls |grep user  
          2. alluser.MRG  
          3. alluser.frm  
          4. user1.MYD  
          5. user1.MYI  
          6. user1.frm  
          7. user2.MYD  
          8. user2.MYI  
          9. user2.frm  
          [root@BlackGhost test]# ls |grep user alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm

          簡(jiǎn)單說明一下,上面的分表呢是利用了merge存儲(chǔ)引擎(分表的一種),alluser是總表,下面有二個(gè)分表,user1,user2。他們二個(gè)都是獨(dú)立的表,取數(shù)據(jù)的時(shí)候,我們可以通過總表來取。這里總表是沒有.MYD,.MYI這二個(gè)文件的,也就是說,總表他不是一張表,沒有數(shù)據(jù),數(shù)據(jù)都放在分表里面。我們來看看.MRG到底是什么東西

          1. [root@BlackGhost test]# cat alluser.MRG |more  
          2. user1  
          3. user2  
          4. #INSERT_METHOD=LAST  
          [root@BlackGhost test]# cat alluser.MRG |more user1 user2 #INSERT_METHOD=LAST

          從上面我們可以看出,alluser.MRG里面就存了一些分表的關(guān)系,以及插入數(shù)據(jù)的方式??梢园芽偙砝斫獬梢粋€(gè)外殼,或者是聯(lián)接池。

          b),分區(qū)不一樣,一張大表進(jìn)行分區(qū)后,他還是一張表,不會(huì)變成二張表,但是他存放數(shù)據(jù)的區(qū)塊變多了。

          1. [root@BlackGhost test]# ls |grep aa  
          2. aa#P#p1.MYD  
          3. aa#P#p1.MYI  
          4. aa#P#p3.MYD  
          5. aa#P#p3.MYI  
          6. aa.frm  
          7. aa.par  
          [root@BlackGhost test]# ls |grep aa aa#P#p1.MYD aa#P#p1.MYI aa#P#p3.MYD aa#P#p3.MYI aa.frm aa.par

          從上面我們可以看出,aa這張表,分為二個(gè)區(qū),p1和p3,本來是三個(gè)區(qū),被我刪了一個(gè)區(qū)。我們都知道一張表對(duì)應(yīng)三個(gè)文件.MYD,.MYI,.frm。分區(qū)呢根據(jù)一定的規(guī)則把數(shù)據(jù)文件和索引文件進(jìn)行了分割,還多出了一個(gè).par文件,打開.par文件后你可以看出他記錄了,這張表的分區(qū)信息,根分表中的.MRG有點(diǎn)像。分區(qū)后,還是一張,而不是多張表。

          2,數(shù)據(jù)處理上

          a),分表后,數(shù)據(jù)都是存放在分表里,總表只是一個(gè)外殼,存取數(shù)據(jù)發(fā)生在一個(gè)一個(gè)的分表里面??聪旅娴睦樱?/p>

          select * from alluser where id='12'表面上看,是對(duì)表alluser進(jìn)行操作的,其實(shí)不是的。是對(duì)alluser里面的分表進(jìn)行了操作。

          b),分區(qū)呢,不存在分表的概念,分區(qū)只不過把存放數(shù)據(jù)的文件分成了許多小塊,分區(qū)后的表呢,還是一張表。數(shù)據(jù)處理還是由自己來完成。

          3,提高性能上

          a),分表后,單表的并發(fā)能力提高了,磁盤I/O性能也提高了。并發(fā)能力為什么提高了呢,因?yàn)椴閷ひ淮嗡ǖ臅r(shí)間變短了,如果出現(xiàn)高并發(fā)的話,總表可以根據(jù)不同的查詢,將并發(fā)壓力分到不同的小表里面。磁盤I/O性能怎么搞高了呢,本來一個(gè)非常大的.MYD文件現(xiàn)在也分?jǐn)偟礁鱾€(gè)小表的.MYD中去了。

          b),mysql提出了分區(qū)的概念,我覺得就想突破磁盤I/O瓶頸,想提高磁盤的讀寫能力,來增加mysql性能。
          在這一點(diǎn)上,分區(qū)和分表的測(cè)重點(diǎn)不同,分表重點(diǎn)是存取數(shù)據(jù)時(shí),如何提高mysql并發(fā)能力上;而分區(qū)呢,如何突破磁盤的讀寫能力,從而達(dá)到提高mysql性能的目的。

          4),實(shí)現(xiàn)的難易度上

          a),分表的方法有很多,用merge來分表,是最簡(jiǎn)單的一種方式。這種方式根分區(qū)難易度差不多,并且對(duì)程序代碼來說可以做到透明的。如果是用其他分表方式就比分區(qū)麻煩了。

          b),分區(qū)實(shí)現(xiàn)是比較簡(jiǎn)單的,建立分區(qū)表,根建平常的表沒什么區(qū)別,并且對(duì)開代碼端來說是透明的。

          三,mysql分表和分區(qū)有什么聯(lián)系呢

          1,都能提高mysql的性高,在高并發(fā)狀態(tài)下都有一個(gè)良好的表面。

          2,分表和分區(qū)不矛盾,可以相互配合的,對(duì)于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式(如果merge這種分表方式,不能和分區(qū)配合的話,可以用其他的分表試),訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。

          posted @ 2013-05-07 09:19 paulwong 閱讀(456) | 評(píng)論 (0)編輯 收藏

          hadoop集群監(jiān)控工具ambari安裝

            Apache Ambari是對(duì)Hadoop進(jìn)行監(jiān)控、管理和生命周期管理的開源項(xiàng)目。它也是一個(gè)為Hortonworks數(shù)據(jù)平臺(tái)選擇管理組建的項(xiàng)目。Ambari向Hadoop MapReduce、HDFS、 HBase、Pig, Hive、HCatalog以及Zookeeper提供服務(wù)。最近準(zhǔn)備裝ambari,在網(wǎng)上找了許久,沒找到比較系統(tǒng)的ambari安裝過程,于是,就根據(jù)官網(wǎng)進(jìn)行了安裝,下面是我推薦的正確的較完善的安裝方式,希望對(duì)大家有所幫助。

            一、準(zhǔn)備工作

            1、系統(tǒng):我的系統(tǒng)是CentOS6.2,x86_64,本次集群采用兩個(gè)節(jié)點(diǎn)。管理節(jié)點(diǎn):192.168.10.121;客戶端節(jié)點(diǎn):192.168.10.122

            2、系統(tǒng)最好配置能上網(wǎng),這樣方便后面的操作,否則需要配置yum倉庫,比較麻煩。

            3、集群中ambari-serveer(管理節(jié)點(diǎn))到客戶端配置無密碼登錄。

            4、集群同步時(shí)間

            5、SELinux,iptables都處于關(guān)閉狀態(tài)。

            6、ambari版本:1.2.0

            二、安裝步驟

            A、配置好集群環(huán)境

          ############  配置無密碼登錄  #################
          [root@ccloud121 ~]# ssh-keygen -t dsa
          [root@ccloud121 ~]# cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys
          [root@ccloud121 ~]# scp /root/.ssh/id_dsa.pub 192.168.10.122:/root/
          [root@ccloud121 ~]# ssh 192.168.10.122
          [root@ccloud122 ~]# cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys

          #############  NTP 時(shí)間同步  #################

          [root@ccloud121 ~]# ntpdate time.windows.com
          [root@ccloud121 ~]# ssh ccloud122 ntpdate time.windows.com

          ###########  SELinux & iptables 關(guān)閉   ###########

          [root@ccloud121 ~]# setenforce 0
          [root@ccloud121 ~]# ssh ccloud122 setenforce 0
          [root@ccloud121 ~]# chkconfig iptables off
          [root@ccloud121 ~]# service iptables stop
          [root@ccloud121 ~]# ssh ccloud122 chkconfig iptables off
          [root@ccloud121 ~]# ssh ccloud122 service iptables stop

            B、管理節(jié)點(diǎn)上安裝ambari-server

              1、下載repo文件     

          [root@ccloud121 ~]# wget http://public-repo-1.hortonworks.com/AMBARI-1.x/repos/centos6/ambari.repo

          [root@ccloud121 ~]# cp ambari.repo /etc/yum.repos.d

              這樣,ambari-server的yum倉庫就做好了。

              2、安裝epel倉庫

          [root@ccloud121 ~]# yum install epel-release   # 查看倉庫列表,應(yīng)該有HDP,EPEL [root@ccloud121 ~]# yum repolist

              3、通過yum安裝amabari bits,這同時(shí)也會(huì)安裝PostgreSQL

          [root@ccloud121 ~]# yum install ambari-server

               這個(gè)步驟要等一會(huì),它需要上網(wǎng)下載,大概39M左右。

              4、運(yùn)行ambari-server setup,安裝ambari-server,它會(huì)自動(dòng)安裝配置PostgreSQL,同時(shí)要求輸入用戶名和密碼,如果按n,它用默認(rèn)的用戶名/密碼值:ambari-server/bigdata。接著就開始下載安裝JDK。安裝完成后,ambari-server就可以啟動(dòng)了。

            三、集群?jiǎn)?dòng)

              

              1、直接接通過ambari-server start和amabari-server stop即可啟動(dòng)和關(guān)閉ambari-serveer。

              2、啟動(dòng)成功后,在瀏覽器輸入http://192.168.10.121:8080

              界面如下圖所示:

              

          登錄名和密碼都是admin。

          這樣就可以登錄到管理控制臺(tái)。


          posted @ 2013-05-03 13:55 paulwong 閱讀(678) | 評(píng)論 (0)編輯 收藏

          一網(wǎng)打盡13款開源Java大數(shù)據(jù)工具

          下面將介紹大數(shù)據(jù)領(lǐng)域支持Java的主流開源工具

          1. HDFS

          HDFS是Hadoop應(yīng)用程序中主要的分布式儲(chǔ)存系統(tǒng), HDFS集群包含了一個(gè)NameNode(主節(jié)點(diǎn)),這個(gè)節(jié)點(diǎn)負(fù)責(zé)管理所有文件系統(tǒng)的元數(shù)據(jù)及存儲(chǔ)了真實(shí)數(shù)據(jù)的DataNode(數(shù)據(jù)節(jié)點(diǎn),可以有很多)。HDFS針對(duì)海量數(shù)據(jù)所設(shè)計(jì),所以相比傳統(tǒng)文件系統(tǒng)在大批量小文件上的優(yōu)化,HDFS優(yōu)化的則是對(duì)小批量大型文件的訪問和存儲(chǔ)。

          2. MapReduce

          Hadoop MapReduce是一個(gè)軟件框架,用以輕松編寫處理海量(TB級(jí))數(shù)據(jù)的并行應(yīng)用程序,以可靠和容錯(cuò)的方式連接大型集群中上萬個(gè)節(jié)點(diǎn)(商用硬件)。

          3. HBase

          Apache HBase是Hadoop數(shù)據(jù)庫,一個(gè)分布式、可擴(kuò)展的大數(shù)據(jù)存儲(chǔ)。它提供了大數(shù)據(jù)集上隨機(jī)和實(shí)時(shí)的讀/寫訪問,并針對(duì)了商用服務(wù)器集群上的大型表格做出優(yōu)化——上百億行,上千萬列。其核心是Google Bigtable論文的開源實(shí)現(xiàn),分布式列式存儲(chǔ)。就像Bigtable利用GFS(Google File System)提供的分布式數(shù)據(jù)存儲(chǔ)一樣,它是Apache Hadoop在HDFS基礎(chǔ)上提供的一個(gè)類Bigatable。

          4. Cassandra

          Apache Cassandra是一個(gè)高性能、可線性擴(kuò)展、高有效性數(shù)據(jù)庫,可以運(yùn)行在商用硬件或云基礎(chǔ)設(shè)施上打造完美的任務(wù)關(guān)鍵性數(shù)據(jù)平臺(tái)。在橫跨數(shù)據(jù)中心的復(fù)制中,Cassandra同類最佳,為用戶提供更低的延時(shí)以及更可靠的災(zāi)難備份。通過log-structured update、反規(guī)范化和物化視圖的強(qiáng)支持以及強(qiáng)大的內(nèi)置緩存,Cassandra的數(shù)據(jù)模型提供了方便的二級(jí)索引(column indexe)。

          5. Hive

          Apache Hive是Hadoop的一個(gè)數(shù)據(jù)倉庫系統(tǒng),促進(jìn)了數(shù)據(jù)的綜述(將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表)、即席查詢以及存儲(chǔ)在Hadoop兼容系統(tǒng)中的大型數(shù)據(jù)集分析。Hive提供完整的SQL查詢功能——HiveQL語言,同時(shí)當(dāng)使用這個(gè)語言表達(dá)一個(gè)邏輯變得低效和繁瑣時(shí),HiveQL還允許傳統(tǒng)的Map/Reduce程序員使用自己定制的Mapper和Reducer。

          6. Pig

          Apache Pig是一個(gè)用于大型數(shù)據(jù)集分析的平臺(tái),它包含了一個(gè)用于數(shù)據(jù)分析應(yīng)用的高級(jí)語言以及評(píng)估這些應(yīng)用的基礎(chǔ)設(shè)施。Pig應(yīng)用的閃光特性在于它們的結(jié)構(gòu)經(jīng)得起大量的并行,也就是說讓它們支撐起非常大的數(shù)據(jù)集。Pig的基礎(chǔ)設(shè)施層包含了產(chǎn)生Map-Reduce任務(wù)的編譯器。Pig的語言層當(dāng)前包含了一個(gè)原生語言——Pig Latin,開發(fā)的初衷是易于編程和保證可擴(kuò)展性。

          7. Chukwa

          Apache Chukwa是個(gè)開源的數(shù)據(jù)收集系統(tǒng),用以監(jiān)視大型分布系統(tǒng)。建立于HDFS和Map/Reduce框架之上,繼承了Hadoop的可擴(kuò)展性和穩(wěn)定性。Chukwa同樣包含了一個(gè)靈活和強(qiáng)大的工具包,用以顯示、監(jiān)視和分析結(jié)果,以保證數(shù)據(jù)的使用達(dá)到最佳效果。

          8. Ambari

          Apache Ambari是一個(gè)基于web的工具,用于配置、管理和監(jiān)視Apache Hadoop集群,支持Hadoop HDFS,、Hadoop MapReduce、Hive、HCatalog,、HBase、ZooKeeper、Oozie、Pig和Sqoop。Ambari同樣還提供了集群狀況儀表盤,比如heatmaps和查看MapReduce、Pig、Hive應(yīng)用程序的能力,以友好的用戶界面對(duì)它們的性能特性進(jìn)行診斷。

          9. ZooKeeper

          Apache ZooKeeper是一個(gè)針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng),提供的功能包括:配置維護(hù)、命名服務(wù)、分布式同步、組服務(wù)等。ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。

          10. Sqoop

          Sqoop是一個(gè)用來將Hadoop和關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)相互轉(zhuǎn)移的工具,可以將一個(gè)關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)導(dǎo)入Hadoop的HDFS中,也可以將HDFS中數(shù)據(jù)導(dǎo)入關(guān)系型數(shù)據(jù)庫中。

          11. Oozie

          Apache Oozie是一個(gè)可擴(kuò)展、可靠及可擴(kuò)充的工作流調(diào)度系統(tǒng),用以管理Hadoop作業(yè)。Oozie Workflow作業(yè)是活動(dòng)的Directed Acyclical Graphs(DAGs)。Oozie Coordinator作業(yè)是由周期性的Oozie Workflow作業(yè)觸發(fā),周期一般決定于時(shí)間(頻率)和數(shù)據(jù)可用性。Oozie與余下的Hadoop堆棧結(jié)合使用,開箱即用的支持多種類型Hadoop作業(yè)(比如:Java map-reduce、Streaming map-reduce、Pig、 Hive、Sqoop和Distcp)以及其它系統(tǒng)作業(yè)(比如Java程序和Shell腳本)。

          12. Mahout

          Apache Mahout是個(gè)可擴(kuò)展的機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘庫,當(dāng)前Mahout支持主要的4個(gè)用例:

          • 推薦挖掘:搜集用戶動(dòng)作并以此給用戶推薦可能喜歡的事物。
          • 聚集:收集文件并進(jìn)行相關(guān)文件分組。
          • 分類:從現(xiàn)有的分類文檔中學(xué)習(xí),尋找文檔中的相似特征,并為無標(biāo)簽的文檔進(jìn)行正確的歸類。
          • 頻繁項(xiàng)集挖掘:將一組項(xiàng)分組,并識(shí)別哪些個(gè)別項(xiàng)會(huì)經(jīng)常一起出現(xiàn)。

          13. HCatalog

          Apache HCatalog是Hadoop建立數(shù)據(jù)的映射表和存儲(chǔ)管理服務(wù),它包括:

          • 提供一個(gè)共享模式和數(shù)據(jù)類型機(jī)制。
          • 提供一個(gè)抽象表,這樣用戶就不需要關(guān)注數(shù)據(jù)存儲(chǔ)的方式和地址。
          • 為類似Pig、MapReduce及Hive這些數(shù)據(jù)處理工具提供互操作性。

          posted @ 2013-05-03 09:05 paulwong 閱讀(502) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共115頁: First 上一頁 66 67 68 69 70 71 72 73 74 下一頁 Last 
          主站蜘蛛池模板: 陵水| 苏尼特左旗| 吉林市| 连城县| 柏乡县| 芒康县| 石家庄市| 呈贡县| 巴林右旗| 屯留县| 乌拉特前旗| 宜宾市| 汪清县| 栖霞市| 贵南县| 鞍山市| 东城区| 和田市| 嘉峪关市| 大足县| 鸡西市| 灵台县| 子长县| 利津县| 阿尔山市| 墨竹工卡县| 荃湾区| 涪陵区| 赣榆县| 兴仁县| 娱乐| 武宁县| 德保县| 三河市| 沿河| 漯河市| 剑川县| 永胜县| 同心县| 屏边| 潼关县|