Megosztás a következőn keresztül:


Webhelynaplók elemzése egyéni Python-kódtár használatával az Apache Spark-fürttel a HDInsighton

Ez a jegyzetfüzet bemutatja, hogyan elemezheti a naplóadatokat egy egyéni kódtár használatával az Apache Spark on HDInsighttal. Az általunk használt egyéni kódtár egy iislogparser.py nevű Python-kódtár.

Előfeltételek

Apache Spark-fürt megléte a HDInsightban. További útmutatásért lásd: Apache Spark-fürt létrehozása az Azure HDInsightban.

Nyers adatok mentése RDD-ként

Ebben a szakaszban a HDInsightban lévő Apache Spark-fürthöz társított Jupyter Notebookot használjuk a nyers mintaadatokat feldolgozó és Hive-táblaként menteni kívánt feladatok futtatásához. A mintaadatok alapértelmezés szerint az összes fürtön elérhető .csv fájl (hvac.csv).

Miután az adatokat Apache Hive-táblaként mentette, a következő szakaszban olyan BI-eszközökkel fogunk csatlakozni a Hive-táblához, mint a Power BI és a Tableau.

  1. Egy webböngészőben keresse meg https://CLUSTERNAME.azurehdinsight.net/jupyterCLUSTERNAME a fürt nevét.

  2. Hozzon létre új notebookot. Válassza az Új, majd a PySpark lehetőséget.

    Create a new Apache Jupyter Notebook. Notebook" border="true":::

  3. Az új notebook létrejött, és Untitled.pynb néven nyílt meg. Válassza ki a jegyzetfüzet nevét a tetején, és adjon meg egy rövid nevet.

    Provide a name for the notebook.

  4. Mivel a PySpark kernel használatával hozott létre jegyzetfüzetet, nem kell explicit módon létrehoznia semmilyen környezetet. Az első kódcella futtatásakor a Spark- és Hive-környezetek automatikusan létrejönnek. Első lépésként importálja az ehhez a forgatókönyvhöz szükséges típusokat. Illessze be a következő kódrészletet egy üres cellába, majd nyomja le a Shift + Enter billentyűkombinációt.

    from pyspark.sql import Row
    from pyspark.sql.types import *
    
  5. Hozzon létre egy RDD-t a fürtben már elérhető mintanapló-adatokkal. Az adatokat a fürthöz társított alapértelmezett tárfiókban érheti el a következő helyen \HdiSamples\HdiSamples\WebsiteLogSampleData\SampleLog\909f2b.log: . Hajtsa végre a következő kódot:

    logs = sc.textFile('wasbs:///HdiSamples/HdiSamples/WebsiteLogSampleData/SampleLog/909f2b.log')
    
  6. Kérje le a mintanapló-készletet annak ellenőrzéséhez, hogy az előző lépés sikeresen befejeződött-e.

    logs.take(5)
    

    A következő szöveghez hasonló kimenetnek kell megjelennie:

    [u'#Software: Microsoft Internet Information Services 8.0',
    u'#Fields: date time s-sitename cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken',
    u'2014-01-01 02:01:09 SAMPLEWEBSITE GET /blogposts/mvc4/step2.png X-ARR-LOG-ID=2ec4b8ad-3cf0-4442-93ab-837317ece6a1 80 - 1.54.23.196 Mozilla/5.0+(Windows+NT+6.3;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 - http://weblogs.asp.net/sample/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx www.sample.com 200 0 0 53175 871 46',
    u'2014-01-01 02:01:09 SAMPLEWEBSITE GET /blogposts/mvc4/step3.png X-ARR-LOG-ID=9eace870-2f49-4efd-b204-0d170da46b4a 80 - 1.54.23.196 Mozilla/5.0+(Windows+NT+6.3;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 - http://weblogs.asp.net/sample/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx www.sample.com 200 0 0 51237 871 32',
    u'2014-01-01 02:01:09 SAMPLEWEBSITE GET /blogposts/mvc4/step4.png X-ARR-LOG-ID=4bea5b3d-8ac9-46c9-9b8c-ec3e9500cbea 80 - 1.54.23.196 Mozilla/5.0+(Windows+NT+6.3;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 - http://weblogs.asp.net/sample/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx www.sample.com 200 0 0 72177 871 47']
    

Naplóadatok elemzése egyéni Python-kódtár használatával

  1. A fenti kimenetben az első pár sor tartalmazza a fejléc adatait, és minden fennmaradó sor megegyezik az adott fejlécben leírt sémával. Az ilyen naplók elemzése bonyolult lehet. Ezért egy egyéni Python-kódtárat (iislogparser.py) használunk, amely sokkal egyszerűbbé teszi az ilyen naplók elemzését. Alapértelmezés szerint ez a kódtár a HDInsighton futó Spark-fürt részét képezi a következő helyen /HdiSamples/HdiSamples/WebsiteLogSampleData/iislogparser.py: .

    Ez a kódtár azonban nem szerepel a PYTHONPATH fájlban, ezért nem használhatjuk olyan importálási utasítással, mint a import iislogparser. A kódtár használatához el kell osztani az összes feldolgozó csomóponton. Futtassa a következő kódrészletet.

    sc.addPyFile('wasbs:///HdiSamples/HdiSamples/WebsiteLogSampleData/iislogparser.py')
    
  2. iislogparser olyan függvényt parse_log_line biztosít, amely akkor ad vissza None , ha egy naplósor fejlécsor, és az LogLine osztály egy példányát adja vissza, ha naplósorba ütközik. LogLine Az osztály használatával csak a naplósorokat nyerheti ki az RDD-ből:

    def parse_line(l):
        import iislogparser
        return iislogparser.parse_log_line(l)
    logLines = logs.map(parse_line).filter(lambda p: p is not None).cache()
    
  3. Lekérhet néhány kinyert naplósort annak ellenőrzéséhez, hogy a lépés sikeresen befejeződött-e.

    logLines.take(2)
    

    A kimenetnek az alábbi szöveghez hasonlónak kell lennie:

    [2014-01-01 02:01:09 SAMPLEWEBSITE GET /blogposts/mvc4/step2.png X-ARR-LOG-ID=2ec4b8ad-3cf0-4442-93ab-837317ece6a1 80 - 1.54.23.196 Mozilla/5.0+(Windows+NT+6.3;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 - http://weblogs.asp.net/sample/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx www.sample.com 200 0 0 53175 871 46,
    2014-01-01 02:01:09 SAMPLEWEBSITE GET /blogposts/mvc4/step3.png X-ARR-LOG-ID=9eace870-2f49-4efd-b204-0d170da46b4a 80 - 1.54.23.196 Mozilla/5.0+(Windows+NT+6.3;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 - http://weblogs.asp.net/sample/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx www.sample.com 200 0 0 51237 871 32]
    
  4. Az LogLine osztály viszont hasznos metódusokkal rendelkezik, például is_error()azt adja vissza, hogy egy naplóbejegyzés tartalmaz-e hibakódot. Ezzel az osztálysal kiszámíthatja a kinyert naplósorok hibáinak számát, majd naplózhatja az összes hibát egy másik fájlba.

    errors = logLines.filter(lambda p: p.is_error())
    numLines = logLines.count()
    numErrors = errors.count()
    print 'There are', numErrors, 'errors and', numLines, 'log entries'
    errors.map(lambda p: str(p)).saveAsTextFile('wasbs:///HdiSamples/HdiSamples/WebsiteLogSampleData/SampleLog/909f2b-2.log')
    

    A kimenetnek meg kell jelennie There are 30 errors and 646 log entries.

  5. A Matplotlib használatával is létrehozhatja az adatok vizualizációját. Ha például el szeretné különíteni a hosszú ideig futó kérések okát, érdemes megkeresni azokat a fájlokat, amelyek átlagosan a legtöbb időt veszik igénybe. Az alábbi kódrészlet az első 25 erőforrást kéri le, amelyek a legtöbb időt igénybe vették a kérések kiszolgálásához.

    def avgTimeTakenByKey(rdd):
        return rdd.combineByKey(lambda line: (line.time_taken, 1),
                                lambda x, line: (x[0] + line.time_taken, x[1] + 1),
                                lambda x, y: (x[0] + y[0], x[1] + y[1]))\
                    .map(lambda x: (x[0], float(x[1][0]) / float(x[1][1])))
    
    avgTimeTakenByKey(logLines.map(lambda p: (p.cs_uri_stem, p))).top(25, lambda x: x[1])
    

    A következő szöveghez hasonló kimenetnek kell megjelennie:

    [(u'/blogposts/mvc4/step13.png', 197.5),
    (u'/blogposts/mvc2/step10.jpg', 179.5),
    (u'/blogposts/extractusercontrol/step5.png', 170.0),
    (u'/blogposts/mvc4/step8.png', 159.0),
    (u'/blogposts/mvcrouting/step22.jpg', 155.0),
    (u'/blogposts/mvcrouting/step3.jpg', 152.0),
    (u'/blogposts/linqsproc1/step16.jpg', 138.75),
    (u'/blogposts/linqsproc1/step26.jpg', 137.33333333333334),
    (u'/blogposts/vs2008javascript/step10.jpg', 127.0),
    (u'/blogposts/nested/step2.jpg', 126.0),
    (u'/blogposts/adminpack/step1.png', 124.0),
    (u'/BlogPosts/datalistpaging/step2.png', 118.0),
    (u'/blogposts/mvc4/step35.png', 117.0),
    (u'/blogposts/mvcrouting/step2.jpg', 116.5),
    (u'/blogposts/aboutme/basketball.jpg', 109.0),
    (u'/blogposts/anonymoustypes/step11.jpg', 109.0),
    (u'/blogposts/mvc4/step12.png', 106.0),
    (u'/blogposts/linq8/step0.jpg', 105.5),
    (u'/blogposts/mvc2/step18.jpg', 104.0),
    (u'/blogposts/mvc2/step11.jpg', 104.0),
    (u'/blogposts/mvcrouting/step1.jpg', 104.0),
    (u'/blogposts/extractusercontrol/step1.png', 103.0),
    (u'/blogposts/sqlvideos/sqlvideos.jpg', 102.0),
    (u'/blogposts/mvcrouting/step21.jpg', 101.0),
    (u'/blogposts/mvc4/step1.png', 98.0)]
    
  6. Ezeket az információkat ábrázolás formájában is megjelenítheti. A diagram létrehozásának első lépéseként először hozzunk létre egy ideiglenes táblát , a AverageTime-t. A táblázat idő szerint csoportosítja a naplókat, hogy megállapítsa, vannak-e szokatlan késési csúcsok egy adott időpontban.

    avgTimeTakenByMinute = avgTimeTakenByKey(logLines.map(lambda p: (p.datetime.minute, p))).sortByKey()
    schema = StructType([StructField('Minutes', IntegerType(), True),
                        StructField('Time', FloatType(), True)])
    
    avgTimeTakenByMinuteDF = sqlContext.createDataFrame(avgTimeTakenByMinute, schema)
    avgTimeTakenByMinuteDF.registerTempTable('AverageTime')
    
  7. Ezután a következő SQL-lekérdezés futtatásával lekérheti az Összes rekordot az AverageTime táblában.

    %%sql -o averagetime
    SELECT * FROM AverageTime
    

    Az %%sql ezt követő -o averagetime varázslat biztosítja, hogy a lekérdezés kimenete helyileg megmarad a Jupyter-kiszolgálón (általában a fürt fejcsomópontján). A kimenet pandas-adatkeretként marad meg a megadott névátlagidővel.

    A következő képhez hasonló kimenetnek kell megjelennie:

    hdinsight jupyter sql query output. yter sql query output" border="true":::

    A varázslattal kapcsolatos további információkért lásd a %%sql %%sql magic által támogatott paramétereket.

  8. Most már használhatja a Matplotlib-t, az adatok vizualizációjának létrehozásához használt kódtárat egy diagram létrehozásához. Mivel a diagramot a helyileg megőrzött averagetime adatkeretből kell létrehozni, a kódrészletnek a %%local varázslattal kell kezdődnie. Ez biztosítja, hogy a kód helyileg fusson a Jupyter-kiszolgálón.

    %%local
    %matplotlib inline
    import matplotlib.pyplot as plt
    
    plt.plot(averagetime['Minutes'], averagetime['Time'], marker='o', linestyle='--')
    plt.xlabel('Time (min)')
    plt.ylabel('Average time taken for request (ms)')
    

    A következő képhez hasonló kimenetnek kell megjelennie:

    apache spark web log analysis plot. eb log analysis plot" border="true":::

  9. Miután befejezte az alkalmazás futtatását, le kell állítania a jegyzetfüzetet az erőforrások felszabadításához. Ehhez a notebook File (Fájl) menüjében kattintson a Close and Halt (Bezárás és leállítás) elemre. Ez a művelet leállítja és bezárja a jegyzetfüzetet.

Következő lépések

Tekintse át a következő cikkeket: