<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    http://jeffxie.blog.51cto.com/1365360/305538

    我在Hadoop的用戶郵件列表中看到一些國內的用 戶在訊問一些關于如何操作的HBase問題,還看到了HBase中沒有Example。覺得有 必要跟大家分享自己的經驗。
    在下面的例子中我們分析Apache的log并把這些log進行分析并把分析完 的結果按用戶IP為ROW,把log中用戶的訪問時間,請求方法,用戶請求的協議,用戶的瀏覽器,服務狀態等寫到HBase的表中。


    首先我們要在HBase中建立我們的一個表來存儲數據。  
    1. public static void creatTable(String table) throws IOException{
    2.             HConnection conn = HConnectionManager.getConnection(conf);
    3.             HBaseAdmin admin = new HBaseAdmin(conf);
    4.             if(!admin.tableExists(new Text(table))){
    5.               System.out.println("1. " + table + " table creating ... please wait");
    6.               HTableDescriptor tableDesc = new HTableDescriptor(table);
    7.               tableDesc.addFamily(new HColumnDescriptor("http:"));
    8.               tableDesc.addFamily(new HColumnDescriptor("url:"));
    9.               tableDesc.addFamily(new HColumnDescriptor("referrer:"));
    10.               admin.createTable(tableDesc);
    11.             } else {
    12.               System.out.println("1. " + table + " table already exists.");
    13.             }
    14.             System.out.println("2. access_log files fetching using map/reduce");
    15.   }
    復制代碼

    然后我們運行一個MapReduce任務來取得log中的每一行 數據。因為我們只要取得數據而不需要對結果進行規約,我們只要編寫一個Map程序即可。   
    1. public static class MapClass extends MapReduceBase implements
    2.       Mapper<WritableComparable, Text, Text, Writable> {

    3.     @Override
    4.     public void configure(JobConf job) {
    5.       tableName = job.get(TABLE, "");
    6.     }

    7.     public void map(WritableComparable key, Text value,
    8.         OutputCollector<Text, Writable> output, Reporter reporter)
    9.         throws IOException {
    10.       try {
    11.              AccessLogParser log = new AccessLogParser(value.toString());
    12.         if(table==null)
    13.                 table = new HTable(conf, new Text(tableName));
    14.         long lockId = table.startUpdate(new Text(log.getIp()));
    15.         table.put(lockId, new Text("http:protocol"), log.getProtocol().getBytes());
    16.         table.put(lockId, new Text("http:method"), log.getMethod().getBytes());
    17.         table.put(lockId, new Text("http:code"), log.getCode().getBytes());
    18.         table.put(lockId, new Text("http:bytesize"), log.getByteSize().getBytes());
    19.         table.put(lockId, new Text("http:agent"), log.getAgent().getBytes());
    20.         table.put(lockId, new Text("url:" + log.getUrl()), log.getReferrer().getBytes());
    21.         table.put(lockId, new Text("referrer:" + log.getReferrer()), log.getUrl().getBytes());

    22.         table.commit(lockId, log.getTimestamp());
    23.       } catch (ParseException e) {
    24.         e.printStackTrace();
    25.       } catch (Exception e) {
    26.         e.printStackTrace();
    27.       }
    28.     }
    29.   }
    復制代碼

    我們在Map程序中對于傳進來的每一行先交給AccessLogParser去處理在AccessLogParser德構造器中用一個正則表達式"([^ ]*) ([^ ]*) ([^ ]*) \\[([^]]*)\\] \"([^\"]*)\" " ([^ ]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\".*"來匹配每一行的log。接下來我們把這些AccessLogParser處理出來的結果更新到HBase的表中去,好的, 我們的程序寫完了。我們要啟動一個MapReduce的話我們要對工作進行配置。   
    1. public static void runMapReduce(String table,String dir) throws IOException{
    2.           Path tempDir = new Path("log/temp");
    3.           Path InputDir = new Path(dir);
    4.           FileSystem fs = FileSystem.get(conf);
    5.           JobConf jobConf = new JobConf(conf, LogFetcher.class);
    6.           jobConf.setJobName("apache log fetcher");
    7.           jobConf.set(TABLE, table);
    8.           Path[] in = fs.listPaths(InputDir);
    9.           if (fs.isFile(InputDir)) {
    10.               jobConf.setInputPath(InputDir);
    11.           } else {
    12.               for (int i = 0; i < in.length; i++) {
    13.                 if (fs.isFile(in[i])) {
    14.                   jobConf.addInputPath(in[i]);
    15.                 } else {
    16.                   Path[] sub = fs.listPaths(in[i]);
    17.                   for (int j = 0; j < sub.length; j++) {
    18.                     if (fs.isFile(sub[j])) {
    19.                       jobConf.addInputPath(sub[j]);
    20.                     }
    21.                   }
    22.                 }
    23.               }
    24.             }
    25.             jobConf.setOutputPath(tempDir);
    26.             jobConf.setMapperClass(MapClass.class);

    27.             JobClient client = new JobClient(jobConf);
    28.             ClusterStatus cluster = client.getClusterStatus();
    29.             jobConf.setNumMapTasks(cluster.getMapTasks());
    30.             jobConf.setNumReduceTasks(0);

    31.             JobClient.runJob(jobConf);
    32.             fs.delete(tempDir);
    33.             fs.close();
    34.   }
    復制代碼

    在上面的代碼中我們先產生一個jobConf對象,然后設定我們的InputPath和OutputPath,告訴MapReduce我們的Map類,設 定我們用多少個Map任務和Reduce任務,然后我們不任務提交給JobClient,關于MapReduce跟詳細的資料Hadoop Wiki上。
    下載:源碼和已編譯好的jar文件example-src.tgz
    例子的運行命令是:

    bin/hadoop jar examples.jar logfetcher <access_log file or directory> <table_name>

    如何運行上面的應用程序呢?我們假定解壓縮完Hadoop分發包的目錄為%HADOOP%
    拷貝%HADOOP%\contrib\hbase\bin下的文件到%HADOOP%\bin下,拷貝%HADOOP%\contrib\hbase \conf的文件到%HADOOP%\conf下,拷貝%HADOOP%\src\contrib\hbase\lib的文件到%HADOOP%\lib 下,拷貝%HADOOP%\src\contrib\hbase\hadoop-*-hbase.jar的文件到%HADOOP%\lib下.然后編輯配 置文件hbase-site.xml設定你的hbase.master例子:192.168.2.92:60000。把這些文件分發到運行Hadoop的 機器上去。在regionservers文件添加上這些已分發過的地址。運行bin/start-hbase.sh命令啟動HBase,把你的 apache log文件拷貝到HDFS的apache-log目錄下,等啟動完成后運行下面的命令。

    bin/hadoop jar examples.jar logfetcher apache-log apache

    訪問http://localhost:50030/能 看到你的MapReduce任務的運行情況,訪問http://localhost:60010/能 看到HBase的運行情況。

    hbaseguiinterface.jpg

    等任務MapReduce完成后訪問http://localhost:60010/hql.jsp,在Query輸入框中輸入 SELECT * FROM apache limit=50;。將會看到已經插入表中的數據。 hqlguiinterface.jpg
    posted on 2013-02-22 14:12 SIMONE 閱讀(2465) 評論(0)  編輯  收藏 所屬分類: hbase
    主站蜘蛛池模板: www.91亚洲| 国产免费啪嗒啪嗒视频看看| 在线观看亚洲精品福利片| 含羞草国产亚洲精品岁国产精品| 久久不见久久见中文字幕免费| 亚洲免费在线视频播放| 四虎在线免费视频| 亚洲制服丝袜在线播放| 91免费资源网站入口| 亚洲丁香婷婷综合久久| 免费一看一级毛片人| 精品国产免费一区二区三区| 亚洲va国产va天堂va久久| 免费国产污网站在线观看15| 亚洲一级毛片免费看| 日韩在线a视频免费播放| 黄色免费网址在线观看| 久久精品夜色噜噜亚洲A∨| 99在线热播精品免费99热| 亚洲图片在线观看| 久久经典免费视频| www亚洲精品久久久乳| 亚洲Av无码乱码在线znlu| 久爱免费观看在线网站| 亚洲成人福利在线观看| 黄瓜视频影院在线观看免费| 亚洲日韩精品A∨片无码加勒比| 又色又污又黄无遮挡的免费视| 国产免费久久精品99久久| 亚洲精品视频久久| 国产高清在线免费视频| 免费网站观看WWW在线观看| 亚洲精品美女视频| 国产成人免费福利网站| a毛片久久免费观看| 亚洲伊人久久大香线蕉| 亚洲国产精品无码久久九九 | 日本一区二区三区免费高清在线 | 青青草原亚洲视频| 一级毛片在线观看免费| 亚洲.国产.欧美一区二区三区|