1. 程式人生 > >Hadoop專案練習

Hadoop專案練習

1 資料處理

在這裡插入圖片描述

2 統計網站不同瀏覽器訪問次數

2.1 解析工具

https://github.com/LeeKemp/UserAgentParser
下載後用 maven 編譯
在這裡插入圖片描述
安裝
在這裡插入圖片描述

2.1.1 測試解析工具

修改 pom

<dependency>
            <groupId>com.kumkee</groupId>
            <artifactId>UserAgentParser</artifactId>
            <version>0.0.1</
version
>
</dependency>
package com.bzt.cn.hdfs.useragent;

import com.kumkee.userAgent.UserAgent;
import com.kumkee.userAgent.UserAgentParser;

public class UserAgentTest {


    public static void main(String[] args) {
        String source = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
; UserAgentParser userAgentParser = new UserAgentParser(); UserAgent agent = userAgentParser.parse(source); String browser = agent.getBrowser(); String engine = agent.getEngine(); String engineVersion = agent.getEngineVersion(); String os = agent.getOs
(); String platform = agent.getPlatform(); boolean isMobile = agent.isMobile(); System.out.println(browser + ", " + engine + " , " + engineVersion + " ," + os + " ," + platform + ", " + isMobile); } }

在這裡插入圖片描述

2.2 抽取部分資料

[[email protected] ~]$ ll
total 2752
-rw-r--r--.  1 hadoop hadoop 2769741 Oct 17  2017 10000_access.log
-rw-r--r--.  1 hadoop hadoop      58 Oct 30 10:13 animal.txt
drwxrwxr-x. 11 hadoop hadoop     236 Oct 29 10:49 apps
drwxrwxr-x.  4 hadoop hadoop      30 Oct 25 21:59 elasticsearchData
drwxrwxr-x.  4 hadoop hadoop      28 Sep 14 19:02 hbase
drwxrwxr-x.  4 hadoop hadoop      32 Sep 14 14:44 hdfsdir
drwxrwxr-x.  3 hadoop hadoop      17 Oct 29 11:00 hdp2.6-cdh5.7-data
-rw-r--r--.  1 hadoop hadoop      46 Oct 29 22:33 hello.txt
drwxrwxrwx.  3 hadoop hadoop      18 Oct 24 21:45 kafkaData
-rw-rw-r--.  1 hadoop hadoop       0 Oct 24 21:58 log-cleaner.log
drwxrwxr-x.  5 hadoop hadoop     133 Oct 23 14:40 metastore_db
-rw-r--r--.  1 hadoop hadoop    6709 Oct 30 10:30 part.jar
drwxrwxr-x.  3 hadoop hadoop      63 Oct 24 21:21 zookeeperData
-rw-rw-r--.  1 hadoop hadoop   26108 Oct 25 17:54 zookeeper.out
[[email protected] ~]$ head -n 100 10000_access.log > 100_access.log
[[email protected] ~]$ wc -l 100_access.log 
100 100_access.log
[[email protected] ~]$ 

一條資料

183.162.52.7 - - [10/Nov/2016:00:01:02 +0800] "POST /api3/getadv HTTP/1.1" 200 813 "www.imooc.com" "-" cid=0&timestamp=1478707261865&uid=2871142&marking=androidbanner&secrect=a6e8e14701ffe9f6063934780d9e2e6d&token=f51e97d1cb1a9caac669ea8acc162b96 "mukewang/5.0.0 (Android 5.1.1; Xiaomi Redmi 3 Build/LMY47V),Network 2G/3G" "-" 10.100.134.244:80 200 0.027 0.027

2.3 本地測試

package com.bzt.cn.hdfs.useragent;

import com.kumkee.userAgent.UserAgent;
import com.kumkee.userAgent.UserAgentParser;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UserAgentTest {


    @Test
    public void testReadFile() throws Exception {
        String path = "d://100_access.log";
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(new File(path)))
        );

        String line = "";

        int i = 0;

        Map<String, Integer> browserMap = new HashMap<>();


        UserAgentParser userAgentParser = new UserAgentParser();

        while (line != null) {
            line = reader.readLine(); //一次讀入一行資料

            i++;
            if (StringUtils.isNotBlank(line)) {
                String source = line.substring(getCharacterPosition(line, "\"", 7)) + 1;

                UserAgent agent = userAgentParser.parse(source);

                String browser = agent.getBrowser();
                String engine = agent.getEngine();
                String engineVersion = agent.getEngineVersion();
                String os = agent.getOs();
                String platform = agent.getPlatform();
                boolean isMobile = agent.isMobile();


                Integer browserValue = browserMap.get(browser);
                if (browserValue != null) {
                    browserMap.put(browser, (browserValue + 1));
                } else {
                    browserMap.put(browser, 1);
                }

                System.out.println(browser + ", " + engine + " , " + engineVersion + " ,"
                        + os + " ," + platform + ", " + isMobile);
            }

        }

        System.out.println("Records: " + (i - 1));
        System.out.println("===============================================");
        for (Map.Entry<String, Integer> entry : browserMap.entrySet()) {
            System.out.println(entry.getKey() + ", " + entry.getValue());
        }
    }

    /*
     * 測試自定義的方法
     * */
    @Test
    public void testGetCharacterPosition() {
        String value = "183.162.52.7 - - [10/Nov/2016:00:01:02 +0800] \"POST /api3/getadv HTTP/1.1\"";
        int index = getCharacterPosition(value, "\"", 2);
        System.out.println(index);

    }


    /*
     * 獲取指定字串中指定標識字串出現索引的位置
     * */
    private int getCharacterPosition(String value, String operator, int index) {
        Matcher slashMatcher = Pattern.compile(operator).matcher(value);
        int mIdx = 0;
        while (slashMatcher.find()) {
            mIdx++;
            if (mIdx == index) {
                break;
            }
        }

        return slashMatcher.start();
    }


    /**
     * 單元測試
     */
    public void testUserAgentParser() {
        //public static void main(String[] args) {
        String source = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";

        UserAgentParser userAgentParser = new UserAgentParser();
        UserAgent agent = userAgentParser.parse(source);

        String browser = agent.getBrowser();
        String engine = agent.getEngine();
        String engineVersion = agent.getEngineVersion();
        String os = agent.getOs();
        String platform = agent.getPlatform();
        boolean isMobile = agent.isMobile();

        System.out.println(browser + ", " + engine + " , " + engineVersion + " ,"
                + os + " ," + platform + ", " + isMobile);
    }

}

在這裡插入圖片描述

3 用 MapReduce 實現

3.1 pom 檔案

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bzt.cn</groupId>
    <artifactId>test-hdfs-api</artifactId>
    <version>1.0</version>

    <name>test-hdfs-api</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
    </properties>

    <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>

    </repositories>

    <dependencies>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.kumkee</groupId>
            <artifactId>UserAgentParser</artifactId>
            <version>0.0.1</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>urlcount.BrowserCount</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
            </plugin>
        </plugins>
    </build>
</project>


3.2 原始碼

package urlcount;
import com.kumkee.userAgent.UserAgent;
import com.kumkee.userAgent.UserAgentParser;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BrowserCount {
    public static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {

        LongWritable one = new LongWritable(1);
        private UserAgentParser userAgentParser;

        @Override
        protected void setup(Context context) throws IOException, InterruptedException {
            userAgentParser = new UserAgentParser();
        }

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

            //一行日誌資訊
            String line = value.toString();

            String source = line
            
           

相關推薦

Hadoop專案練習

1 資料處理 2 統計網站不同瀏覽器訪問次數 2.1 解析工具 https://github.com/LeeKemp/UserAgentParser 下載後用 maven 編譯 安裝 2.1.1 測試解析工具 修改 pom <dependency&

JavaWeb專案練習--專案生疏知識點整理

1)Trim() 從當前 String 物件移除所有前導空白字元和尾部空白字元 2)比較字串相等使用 str1.equals(str2) 切忌使用 " == "來比較 ==為數字型別比對 3)<a> 標籤的 target 屬性規定在何處開啟連結文件。 4)登

JavaWeb專案練習--支付模組、後臺部分模組(手風琴下拉選單、上傳技術)

易寶支付 線上支付的兩種形式: 1. 電商與銀行直連! 安全 不收手續費 不與小電商合作! 2. 第三臺支付平臺 支付寶 易寶 財富通 好處: 不安全 收手續費(1%) 小電商可以與其合作! 需要在第三方註冊賬戶 需要認證! 我

JavaWeb專案練習--購物車模組、訂單模組

購物車模組 購物車儲存方式: 1)儲存在session中;此次專案儲存在session中 2)儲存在cookie中; 3)儲存在資料庫中: 不同方式的優缺點: 1.Session(Memcached)方式 優點:購物車資訊儲存在服務端,可以儲存1M 資訊。 缺點

JavaWeb專案練習--分類模組、圖書模組

分類模組 1 分類模組的相關類建立 ywnxbx.bookstore.category domain:Category dao:CategoryDao service:CategoryService web.servlet:CategoryServlet

class 2-3 小專案練習

空氣質量分指數計算方法(框架) 1 def cal_liner(iaqi_lo,iaqi_hi,bp_lo,bp_hi,cp): 2 """範圍縮放""" 3 iaqi =(iaqi_hi - iaqi_lo)*(cp -bp_lo) /(bp_hi - bp_l

class 2-2 小專案練習

一. 判斷第幾天 閏年(四年一閏,百年不閏,四百年再閏) 元組(tuple) 用於表達固定資料項、函式多返回值等 特點: 1.元素可以是不同型別(元組通常不同資料組成,列表通常由相同型別資料組成)    2.元組中各元素存在先後關係,可通過索引訪問元組中元素(元組表示的是結構,列表表示的是順序)

python列表專案練習

product_list = [ ('Iphone',5800), ('Mac Pro',9800), ('Bike',800), ('Watch',10600), ('Coffee',31), ('Alex Python',120)

js專案練習第二課

百度輸入法 <style> *{ list-style: none; text-decoration: none; padding: 0; margin: 0;

嵌入式小專案練習-光電設計競賽-尋跡小車-03-尋跡演算法分析與原始碼

這裡我用了三個光敏電阻的感測器來進行尋跡:這裡用X1,X2,X3(檢測到了為0)來表示: 演算法思路: 將三個感測器放置如圖:         |          |   

awk與grep 日誌實際專案練習

shell統計日誌,求每五分鐘訪問量的寫法 日誌格式如下:訪問IP、時間、返回狀態碼 XX.XX.XX.XX - - [09/Sep/2015:10:30:00 +0800]   200  XX.XX.XX.XX - - [09/Sep/2015:10:34:00

專案練習(二)—微博資料結構化

1.ETL概念       ETL,是英文 Extract-Transform-Load 的縮寫,用來描述將資料從來源端經過抽取(extract)、互動轉換(transform)、載入(load)至目的端的過程。 2.專案目標: 本次專案側重於資料的整合(即將檔案中

專案練習:百度翻譯小程式

1 # -*- coding:utf-8 -*- 2 # Author:Sure Feng 3 4 import requests 5 import json 6 import sys 7 8 class BaiduFanyi(object): 9 def __init__

vue小專案練習——輸入標題並將輸入的標題新增到標題列表

第一次寫部落格,先自我介紹一下吧,我是18屆中國石油大學(華東)電腦科學與技術專業的本科畢業生[有沒有學長或者學姐,吱吱吱],現從事前端工作。希望通過這個部落格記錄自己的學習之路,加油! 今天沒有開發任務,自學了一下vue,做了個小練習。 之前只是簡單看了一下vue的模板語法,今天的小例項讓

專案練習:電影列表爬蟲

1 # -*- coding:utf-8 -*- 2 # Author:Sure Feng 3 4 import requests 5 import json 6 7 8 class DoubanFileSpider(object): 9 def __init__(sel

selenium模組(九):專案練習

自動登入163郵箱併發送郵件 #注意:網站都策略都是在不斷變化的,精髓在於學習流程。下述程式碼生效與2017-11-7,不能保證永久有效 from selenium import webdriver from selenium.webdriver import ActionChain

Web開發基礎_Servlet學習_0025_專案練習(八)

專案名稱:中國電信運營支援系統-網路版(七) 專案登記部分  jstl:import標籤 <c:import>說明  案例演示: 工程案例目錄結構 MainServlet.java package web; import java.i

Web開發基礎_Servlet學習_0029_專案練習(十)

專案名稱:中國電信運營支援系統-網路版(十) 驗證碼 登入驗證碼 案例演示: 工程案例目錄結構  DBUtil.java package util; import java.io.IOException; import java.sql.Connec

Web開發基礎_Servlet學習_0031_專案練習(十一)

專案名稱:中國電信運營支援系統-網路版(十一) 登入檢查 如果不做登入檢查,會導致任何非法請求都可登入系統,系統安全系會很差。 一般登入檢查都會使用到過濾器Filter。基於此我們新增此功能。 案例演示: 工程案例目錄結構 web.xml <?xm

專案練習(一)APP熱點標籤分析

專案練習(一)APP熱點標籤分析 1、專案背景 通過找到熱度標籤,贈標籤熱度,以提高相應APP的下載量和使用量。 2、需求分析 (1)爬取資料: 6個欄位,分別為(appId,app名稱, 一級分類,二級分類,三級分類,Tags描述資訊),但並不一定完全規整,視實際情況可能左