Delen via


log_reduce_fl()

De functie log_reduce_fl() vindt algemene patronen in semi-gestructureerde tekstkolommen, zoals logboeklijnen, en clustert de lijnen op basis van de geëxtraheerde patronen. Er wordt een overzichtstabel uitgevoerd met de gevonden patronen die van boven naar beneden zijn gesorteerd op hun respectieve frequentie.

Vereisten

  • De Python-invoegtoepassing moet zijn ingeschakeld op het cluster. Dit is vereist voor de inline Python die in de functie wordt gebruikt.

Syntax

T|invokelog_reduce_fl(reduce_col [,use_logram [,use_drain [,custom_regexes [,custom_regexes_policy [,scheidingstekens [,similarity_th [,tree_depth [,trigram_th [,bigram_th ]]]]]]]]])

Meer informatie over syntaxisconventies.

Parameters

De volgende beschrijving van parameters is een samenvatting. Zie de sectie Meer informatie over het algoritme voor meer informatie.

Naam Type Vereist Beschrijving
reduce_col string ✔️ De naam van de tekenreekskolom waarop de functie wordt toegepast.
use_logram bool Schakel het Logram-algoritme in of uit. De standaardwaarde is true.
use_drain bool Schakel het algoritme Drain in of uit. De standaardwaarde is true.
custom_regexes dynamic Een dynamische matrix met paren van reguliere expressies en vervangende symbolen die in elke invoerrij moeten worden doorzocht en vervangen door het bijbehorende overeenkomende symbool. De standaardwaarde is dynamic([]). De standaard regex-tabel vervangt getallen, IP's en GUID's.
custom_regexes_policy string Ofwel 'prepend', 'append' of 'replace'. Hiermee bepaalt u of custom_regexes de standaard worden voorbereid/toegevoegd/vervangen. De standaardwaarde is 'prepend'.
scheidingstekens dynamic Een dynamische matrix met tekenreeksen voor scheidingstekens. Standaardwaarde is dynamic([" "]), waarmee spatie wordt gedefinieerd als het enige scheidingsteken voor tekens.
similarity_th real Drempelwaarde voor gelijkenis, die wordt gebruikt door het algoritme Drain. Het verhogen van similarity_th resulteert in meer verfijnde clusters. De standaardwaarde is 0,5. Als Drain is uitgeschakeld, heeft deze parameter geen effect.
tree_depth int Het verhogen van tree_depth verbetert de runtime van het Drain-algoritme, maar kan de nauwkeurigheid verminderen. De standaardwaarde is 4. Als Drain is uitgeschakeld, heeft deze parameter geen effect.
trigram_th int Het verminderen van trigram_th vergroot de kans dat Logram tokens vervangt door jokertekens. De standaardwaarde is 10. Als Logram is uitgeschakeld, heeft deze parameter geen effect.
bigram_th int Het verminderen van bigram_th vergroot de kans dat Logram tokens vervangt door jokertekens. De standaardwaarde is 15. Als Logram is uitgeschakeld, heeft deze parameter geen effect.

Meer informatie over het algoritme

De functie voert multiples-passes uit over de rijen om te worden teruggebracht tot algemene patronen. In de volgende lijst worden de passen uitgelegd:

  • Reguliere expressievervangingen: In deze pas wordt elke regel onafhankelijk vergeleken met een set reguliere expressies en wordt elke overeenkomende expressie vervangen door een vervangend symbool. De standaard reguliere expressies vervangen IP's, getallen en GUID's door /<IP>, <GUID> en /<NUM>. De gebruiker kan hier meer reguliere expressies aan toevoegen of vervangen door nieuwe expressies of een lege lijst door custom_regexes en custom_regexes_policy te wijzigen. Als u bijvoorbeeld hele getallen <wilt vervangen door WNUM-set> custom_regexes=pack_array('/^\d+$/', '<WNUM>'); als u reguliere expressies wilt annuleren, stelt u de vervangingsset custom_regexes_policy='replace'' in. Voor elke regel houdt de functie een lijst bij met de oorspronkelijke expressies (vóór vervangingen) die moeten worden uitgevoerd als parameters van de algemene vervangingstokens.

  • Tokenisatie: net als in de vorige stap wordt elke regel onafhankelijk verwerkt en opgesplitst in tokens op basis van een set scheidingstekens. Als u bijvoorbeeld het verbreken van tokens wilt definiëren door een komma, punt of puntkomma in te stellen scheidingstekens=pack_array(',', '.', ';').

  • Logram-algoritme toepassen: deze pas is optioneel, in afwachting van use_logram waar is. U wordt aangeraden Logram te gebruiken wanneer grote schaal is vereist en wanneer parameters kunnen worden weergegeven in de eerste tokens van de logboekvermelding. OTOH, schakel deze uit wanneer de logboekvermeldingen kort zijn, omdat het algoritme in dergelijke gevallen te vaak tokens vervangt door jokertekens. Het Logram-algoritme houdt rekening met 3 tuples en 2 tuples van tokens. Als een 3-tuple van tokens gebruikelijk is in de logboekregels (deze wordt meer dan trigram_th keer weergegeven), is het waarschijnlijk dat alle drie tokens deel uitmaken van het patroon. Als de 3-tuple zeldzaam is, is het waarschijnlijk dat deze een variabele bevat die moet worden vervangen door een jokerteken. Voor zeldzame 3-tuples houden we rekening met de frequentie waarmee 2 tuples in de 3-tuples worden weergegeven. Als een 2-tuple vaak voorkomt (het wordt meer dan bigram_th keer weergegeven), is het resterende token waarschijnlijk een parameter en maakt het geen deel uit van het patroon.
    Het Logram-algoritme is eenvoudig te parallelliseren. Hiervoor zijn twee doorgegeven aan het logboekcorpus: de eerste om de frequentie van elke 3-tuple en 2-tuple te tellen, en de tweede om de eerder beschreven logica toe te passen op elke vermelding. Om het algoritme te parallelliseren, hoeven we alleen de logboekvermeldingen te partitioneren en het aantal frequenties van verschillende werkrollen te verenigen.

  • Drain-algoritme toepassen: deze pas is optioneel, in afwachting van use_drain waar is. Drain is een algoritme voor het parseren van logboeken op basis van een afgekapte dieptevoorvoegselstructuur. Logboekberichten worden gesplitst op basis van hun lengte en voor elke lengte worden de eerste tree_depth tokens van het logboekbericht gebruikt om een voorvoegselstructuur te maken. Als er geen overeenkomst voor het voorvoegseltokens is gevonden, wordt er een nieuwe vertakking gemaakt. Als er een overeenkomst voor het voorvoegsel is gevonden, zoeken we naar het meest vergelijkbare patroon in de patronen in het boomblad. Patroonovereenkomst wordt gemeten door de verhouding van overeenkomende niet-wildcardtokens van alle tokens. Als de overeenkomst van het meest vergelijkbare patroon hoger is dan de drempelwaarde voor gelijkenis (de parameter similarity_th), wordt de logboekvermelding gekoppeld aan het patroon. Voor dat patroon vervangt de functie alle niet-overeenkomende tokens door jokertekens. Als de overeenkomst van het meest vergelijkbare patroon onder de drempelwaarde voor overeenkomsten ligt, wordt er een nieuw patroon met de logboekvermelding gemaakt.
    We stellen standaard tree_depth in op 4 op basis van het testen van verschillende logboeken. Het vergroten van deze diepte kan de runtime verbeteren, maar kan de nauwkeurigheid van patronen verminderen; het verlagen is nauwkeuriger, maar langzamer, omdat elk knooppunt veel meer overeenkomstentests uitvoert.
    Meestal generaliseert en vermindert Drain patronen efficiënt (hoewel het moeilijk is om te worden geparallelliseerd). Omdat het echter afhankelijk is van een voorvoegselstructuur, is deze mogelijk niet optimaal in logboekvermeldingen die parameters in de eerste tokens bevatten. Dit kan in de meeste gevallen worden opgelost door eerst Logram toe te passen.

Functiedefinitie

U kunt de functie als volgt definiëren door de code in te sluiten als een door een query gedefinieerde functie of door deze te maken als een opgeslagen functie in uw database:

Definieer de functie met behulp van de volgende let-instructie. Er zijn geen machtigingen vereist.

Belangrijk

Een let-instructie kan niet zelfstandig worden uitgevoerd. Deze moet worden gevolgd door een tabellaire expressie-instructie. Zie Voorbeeld als u een werkend voorbeeld van log_reduce_fl()wilt uitvoeren.

let log_reduce_fl=(tbl:(*), reduce_col:string,
              use_logram:bool=True, use_drain:bool=True, custom_regexes: dynamic = dynamic([]), custom_regexes_policy: string = 'prepend',
              delimiters:dynamic = dynamic(' '), similarity_th:double=0.5, tree_depth:int = 4, trigram_th:int=10, bigram_th:int=15)
{
    let default_regex_table = pack_array('(/|)([0-9]+\\.){3}[0-9]+(:[0-9]+|)(:|)', '<IP>', 
                                         '([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})', '<GUID>', 
                                         '(?<=[^A-Za-z0-9])(\\-?\\+?\\d+)(?=[^A-Za-z0-9])|[0-9]+$', '<NUM>');
    let kwargs = bag_pack('reduced_column', reduce_col, 'delimiters', delimiters,'output_column', 'LogReduce', 'parameters_column', '', 
                          'trigram_th', trigram_th, 'bigram_th', bigram_th, 'default_regexes', default_regex_table, 
                          'custom_regexes', custom_regexes, 'custom_regexes_policy', custom_regexes_policy, 'tree_depth', tree_depth, 'similarity_th', similarity_th, 
                          'use_drain', use_drain, 'use_logram', use_logram, 'save_regex_tuples_in_output', True, 'regex_tuples_column', 'RegexesColumn', 
                          'output_type', 'summary');
    let code = ```if 1:
        from log_cluster import log_reduce
        result = log_reduce.log_reduce(df, kargs)
    ```;
    tbl
    | extend LogReduce=''
    | evaluate python(typeof(Count:int, LogReduce:string, example:string), code, kwargs)
};
// Write your query to use the function here.

Voorbeeld

In het volgende voorbeeld wordt de operator aanroepen gebruikt om de functie uit te voeren. In dit voorbeeld worden gedistribueerde bestandssysteemlogboeken van Apache Hadoop gebruikt.

Als u een querygedefinieerde functie wilt gebruiken, roept u deze aan na de definitie van de ingesloten functie.

let log_reduce_fl=(tbl:(*), reduce_col:string,
              use_logram:bool=True, use_drain:bool=True, custom_regexes: dynamic = dynamic([]), custom_regexes_policy: string = 'prepend',
              delimiters:dynamic = dynamic(' '), similarity_th:double=0.5, tree_depth:int = 4, trigram_th:int=10, bigram_th:int=15)
{
    let default_regex_table = pack_array('(/|)([0-9]+\\.){3}[0-9]+(:[0-9]+|)(:|)', '\<IP>', 
                                         '([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})', '<GUID>', 
                                         '(?<=[^A-Za-z0-9])(\\-?\\+?\\d+)(?=[^A-Za-z0-9])|[0-9]+$', '\<NUM>');
    let kwargs = bag_pack('reduced_column', reduce_col, 'delimiters', delimiters,'output_column', 'LogReduce', 'parameters_column', '', 
                          'trigram_th', trigram_th, 'bigram_th', bigram_th, 'default_regexes', default_regex_table, 
                          'custom_regexes', custom_regexes, 'custom_regexes_policy', custom_regexes_policy, 'tree_depth', tree_depth, 'similarity_th', similarity_th, 
                          'use_drain', use_drain, 'use_logram', use_logram, 'save_regex_tuples_in_output', True, 'regex_tuples_column', 'RegexesColumn', 
                          'output_type', 'summary');
    let code = ```if 1:
        from log_cluster import log_reduce
        result = log_reduce.log_reduce(df, kargs)
    ```;
    tbl
    | extend LogReduce=''
    | evaluate python(typeof(Count:int, LogReduce:string, example:string), code, kwargs)
};
//
// Finding common patterns in HDFS logs, a commonly used benchmark for log parsing
//
HDFS_log
| take 100000
| invoke log_reduce_fl(reduce_col="data")

Uitvoer

Count LogReduce Voorbeeld
55356 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.delete: blk_<NUM> is toegevoegd aan invalidSet van <IP> 081110 220623 26 INFO dfs. FSNamesystem: BLOCK* NameSystem.delete: blk_1239016582509138045 is toegevoegd aan invalidSet van 10.251.123.195:50010
10278 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap updated: <IP> is added to blk_<NUM> size <NUM> 081110 215858 27 INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap updated: 10.250.11.85:50010 is added to blk_5080254298708411681 size 67108864
10256 081110 <NUM><NUM> INFO dfs. DataNode$PacketResponder: PacketResponder <NUM> for block blk_<NUM> terminating 081110 215858 15496 INFO dfs. DataNode$PacketResponder: PacketResponder 2 voor het beëindigen van blok blk_-7746692545918257727
10256 081110 <NUM><NUM> INFO dfs. DataNode$PacketResponder: Ontvangen blok blk_<NUM> van grootte <NUM> van <IP> 081110 215858 15485 INFO dfs. DataNode$PacketResponder: Ontvangen blok blk_5080254298708411681 van grootte 67108864 van /10.251.43.21
9140 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: Ontvangen van blok blk_<NUM> src: <IP> dest: <IP> 081110 215858 15494 INFO dfs. DataNode$DataXceiver: Ontvangen van blok blk_-7037346755429293022 src: /10.251.43.21:45933 dest: /10.251.43.21:50010
3047 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.allocateBlock: /user/root/rand3/temporary/task<NUM><NUM>m<NUM>_<NUM>/part-NUM<>. < > 081110 215858 26 INFO dfs. FSNamesystem: BLOCK NameSystem.allocateBlock: /user/root/rand3/_temporary/task_200811101024_0005_m_001805_0/part-01805. blk-7037346755429293022
1402 081110 <NUM><NUM> INFO <>: <> blok blk_<NUM> <><> 081110 215957 15556 INFO dfs. DataNode$DataTransfer: 10.250.15.198:50010:Verzonden blok blk_-3782569120714539446 naar /10.251.203.129:50010
177 081110 <NUM><NUM> INFO <>: <>><<> <*> 081110 215859 13 INFO dfs. DataBlockScanner: verificatie is geslaagd voor blk_-7244926816084627474
36 081110 <NUM><NUM> INFO <>: <><>> <for block <*> 081110 215924 15636 INFO dfs. DataNode$BlockReceiver: Leeg pakket ontvangen voor blok blk_3991288654265301939
12 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* <>><> <> <> <><><> <081110 215953 19 INFO dfs. FSNamesystem: BLOCK* vraag 10.250.15.198:50010 om blk_-3782569120714539446 te repliceren naar gegevensknooppunt(en) 10.251.203.129:50010
12 081110 <NUM><NUM> INFO <>: <><> <>><> <blok blk_<NUM><> <> 081110 215955 18 INFO dfs. DataNode: 10.250.15.198:50010 Thread wordt gestart om blok blk_-3782569120714539446 over te dragen naar 10.251.203.129:50010
12 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: Received block blk_<NUM> src: <IP> dest: <IP> of size <NUM> 081110 215957 15226 INFO dfs. DataNode$DataXceiver: Ontvangen blok blk_-3782569120714539446 src: /10.250.15.198:51013 dest: /10.250.15.198:50010 van grootte 14474705
6 081110 <NUM><NUM><> dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: <>> <<><> <<> <> <>>size <NUM> 081110 215924 27 WARN dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: Redundante addStoredBlock-aanvraag ontvangen voor blk_2522553781740514003 op 10.251.202.134:50010 grootte 67108864
6 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: <>> <<> <<>>: <><><> <>> <081110 215936 15714 INFO dfs. DataNode$DataXceiver: writeBlock blk_720939897861061328 heeft uitzondering java.io.IOException ontvangen: Kan niet lezen uit stream
3 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: <>><> <<> <<> <>> size <NUM><>><> <<><> <<> <>>. 081110 220635 28 INFO dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: addStoredBlock-aanvraag ontvangen voor blk_-81196479666306310 op 10.250.17.177:50010 grootte 53457811 Maar het behoort niet tot een bestand.
1 081110 <NUM><NUM><> <>:><<>> <> <<><<>> < . .><> <><> <> 081110 220631 19 WARN dfs. FSDataset: Onverwachte fout bij het verwijderen van blok blk_-2012154052725261337. BlockInfo niet gevonden in volumeMap.

Deze functie wordt niet ondersteund.