Sdílet prostřednictvím


log_reduce_fl()

Funkce log_reduce_fl() najde běžné vzory v částečně strukturovaných textových sloupcích, jako jsou například čáry protokolu, a shlukuje čáry podle extrahovaných vzorů. Výstupem je souhrnná tabulka obsahující nalezené vzory seřazené shora dolů podle příslušné frekvence.

Požadavky

  • Modul plug-in Pythonu musí být v clusteru povolený. To se vyžaduje pro vložený Python použitý ve funkci .
  • V databázi musí být povolený modul plug-in Pythonu. To se vyžaduje pro vložený Python použitý ve funkci .

Syntax

T|invokelog_reduce_fl(reduce_col [,use_logram [,use_drain [,custom_regexes [,custom_regexes_policy [,oddělovače [,similarity_th [,tree_depth [,trigram_th [,bigram_th ]]]]]]]]])

Přečtěte si další informace o konvencích syntaxe.

Parametry

Následující popis parametrů je souhrn. Další informace najdete v části Další informace o algoritmu .

Název Typ Vyžadováno Popis
reduce_col string ✔️ Název sloupce řetězce, na který se funkce použije.
use_logram bool Povolte nebo zakažte algoritmus Logram. Výchozí hodnota je true.
use_drain bool Povolte nebo zakažte algoritmus vyprázdnění. Výchozí hodnota je true.
custom_regexes dynamic Dynamické pole obsahující dvojice regulárních výrazů a symbolů pro nahrazení, které mají být prohledány v každém vstupním řádku a nahrazeny odpovídajícími symboly. Výchozí hodnota je dynamic([]). Výchozí tabulka regulárních výrazů nahrazuje čísla, IP adresy a identifikátory GUID.
custom_regexes_policy string Buď 'prepend', 'append' nebo 'replace'. Určuje, jestli se custom_regexes mají předpřidět, připojit nebo nahradit výchozí. Výchozí hodnota je "předpend".
Oddělovače dynamic Dynamické pole obsahující oddělovací řetězce. Výchozí hodnota je dynamic([" "]), definující mezeru jako jediný oddělovač znaků.
similarity_th real Prahová hodnota podobnosti, kterou používá algoritmus odtoku. Zvýšení similarity_th vede ke zpřesnění clusterů. Výchozí hodnota je 0,5. Pokud je možnost Drain zakázaná, nemá tento parametr žádný vliv.
tree_depth int Zvýšení tree_depth zlepšuje běh algoritmu Drain, ale může snížit jeho přesnost. Výchozí hodnota je 4. Pokud je možnost Drain zakázaná, nemá tento parametr žádný vliv.
trigram_th int Snížením trigram_th se zvyšuje pravděpodobnost, že Logram nahradí tokeny zástupnými znakůýmimich služby . Výchozí hodnota je 10. Pokud je Logram zakázaný, nemá tento parametr žádný vliv.
bigram_th int Snížení bigram_th zvyšuje pravděpodobnost, že Logram nahradí tokeny zástupnými ýmimi sadou. Výchozí hodnota je 15. Pokud je Logram zakázaný, nemá tento parametr žádný vliv.

Další informace o algoritmu

Funkce spustí násobky a předá řádky, které se mají omezit na běžné vzory. Následující seznam vysvětluje průchody:

  • Nahrazení regulárních výrazů: V tomto průchodu je každý řádek nezávisle spárován se sadou regulárních výrazů a každý odpovídající výraz je nahrazen symbolem nahrazení. Výchozí regulární výrazy nahrazují IP adresy, čísla a identifikátory GUID /<IP>, <GUID> a /<NUM>. Uživatel k těmto výrazům může přidat další regulární výrazy nebo je může nahradit novými nebo prázdnými seznamy úpravou custom_regexes a custom_regexes_policy. Chcete-li například nahradit celá čísla kódem <WNUM> set custom_regexes=pack_array('/^\d+$/', '<WNUM>'); zrušit nahrazení regulárních výrazů sadou custom_regexes_policy='replace''. Pro každý řádek funkce uchovává seznam původních výrazů (před nahrazením), které mají být výstupem jako parametry obecných nahrazovaných tokenů.

  • Tokenizace: Podobně jako v předchozím kroku se každý řádek zpracovává nezávisle a rozděluje se na tokeny na základě sady oddělovačů. Například definování dělení na tokeny čárkou, tečkou nebo středníkem set delimiters=pack_array(',', '.', ';').

  • Použít algoritmus Logram: toto předání je volitelné, čekající use_logram má hodnotu true. Logram doporučujeme použít, když se vyžaduje velké škálování a když se parametry můžou zobrazit v prvních tokenech položky protokolu. OTOH, zakažte ho, když jsou položky protokolu krátké, protože algoritmus má v takových případech tendenci nahrazovat tokeny zástupnýmiýmimi kódy příliš často. Algoritmus Logram bere v úvahu tři řazené kolekce členů a 2 řazené kolekce tokenů. Pokud je v řádcích protokolu běžná řazená kolekce tokenů se třemi řazemi (zobrazuje se více než trigram_th krát), je pravděpodobné, že součástí vzoru jsou všechny tři tokeny. Pokud je řazená kolekce 3 členů vzácná, je pravděpodobné, že obsahuje proměnnou, která by měla být nahrazena zástupným znakem. U vzácných 3 řazených kolekcí členů uvažujeme frekvenci, s jakou se objevují 2 řazené kolekce členů obsažené v řazené kolekci členů. Pokud je řazená kolekce se 2 řazenou kolekcí členů běžná (zobrazuje se více než bigram_th krát), zbývající token bude pravděpodobně parametr, a není součástí vzoru.
    Algoritmus Logram se snadno paralelizuje. Vyžaduje dva průchody v korpusu protokolu: první z nich počítá frekvenci každé řazené kolekce 3 členů a 2 řazené kolekce členů a druhý pro použití logiky popsané dříve pro každou položku. Abychom mohli algoritmus paralelizovat, stačí rozdělit položky protokolu a sjednotit počet frekvencí různých pracovních procesů.

  • Použít algoritmus vyprazdňování: Tento průchod je volitelný, čekající use_drain má hodnotu true. Odtok je algoritmus analýzy protokolů založený na zkrácené stromové předponě hloubky. Zprávy protokolu se rozdělí podle délky a pro každou délku se první tree_depth tokeny zprávy protokolu používají k vytvoření stromu předpon. Pokud se nenajde žádná shoda s tokeny předpon, vytvoří se nová větev. Pokud byla nalezena shoda s předponou, vyhledáme nejpodobnější vzor mezi vzory obsaženými ve stromovém listu. Podobnost vzorů se měří poměrem shodných tokenů newildcard ze všech tokenů. Pokud podobnost nejvíce podobného vzoru překročí prahovou hodnotu podobnosti (parametr similarity_th), položka protokolu se porovná se vzorem. V takovém případě funkce nahradí všechny tokeny, které se neshodují, zástupnými ýmimi tokeny. Pokud je podobnost nejvíce podobného vzoru nižší než prahová hodnota podobnosti, vytvoří se nový vzor obsahující položku protokolu.
    Na základě testování různých protokolů jsme nastavili výchozí tree_depth na 4. Zvýšení této hloubky může zlepšit běh, ale může snížit přesnost vzorů; je přesnější, ale pomalejší, protože každý uzel provádí mnohem více testů podobnosti.
    Vyprázdnění obvykle efektivně generalizuje a omezuje vzory (i když paralelizace je obtížná). Vzhledem k tomu, že spoléhá na strom předpon, nemusí být optimální v položkách protokolu obsahujících parametry v prvních tokenech. Ve většině případů se to dá vyřešit tak, že nejprve použijete Logram.

Definice funkce

Funkci můžete definovat vložením jejího kódu jako funkce definované dotazem nebo jejím vytvořením jako uložené funkce v databázi, a to následujícím způsobem:

Definujte funkci pomocí následujícího příkazu let. Nejsou vyžadována žádná oprávnění.

Důležité

Příkaz let nelze spustit samostatně. Musí za ním následovat příkaz tabulkového výrazu. Pokud chcete spustit funkční příklad , podívejte se na log_reduce_fl()příklad.

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.

Příklad

Následující příklad používá operátor invoke ke spuštění funkce. V tomto příkladu se používají protokoly distribuovaného systému souborů Apache Hadoop.

Pokud chcete použít funkci definovanou dotazem, vyvolejte ji po definici vložené funkce.

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")

Výstup

Počet LogReduce Příklad
55356 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.delete: blk_<NUM> se přidá do neplatné sady <IP> 081110 220623 26 INFO dfs. FSNamesystem: BLOCK* NameSystem.delete: blk_1239016582509138045 se přidá do invalidSet 10.251.123.195:50010
10278 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap updated: <IP> adresa je přidaná do blk_<NUM> velikost <NUM> 081110 215858 27 INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap aktualizováno: 10.250.11.85:50010 je přidán do blk_5080254298708411681 velikost 67108864
10256 081110 <NUM><NUM> INFO dfs. DataNode$PacketResponder: PacketResponder <NUM> pro blok blk_<NUM> ukončující 081110 215858 15496 INFO dfs. DataNode$PacketResponder: PacketResponder 2 pro ukončení bloku blk_-7746692545918257727
10256 081110 <NUM><NUM> INFO dfs. DataNode$PacketResponder: Přijatý blokový blk_<NUM> o velikosti <NUM> z <IP> 081110 215858 15485 INFO dfs. DataNode$PacketResponder: Přijatý blokový blk_5080254298708411681 velikosti 67108864 od /10.251.43.21
9140 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: Příjem bloku blk_<NUM> src: <IP> dest: <IP> 081110 215858 15494 INFO dfs. DataNode$DataXceiver: Příjem bloku 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:Přenos bloku blk_-3782569120714539446 do /10.251.203.129:50010
177 081110 <><ČÍSLO ČÍSLO> INFO<>: <>><<> <*> 081110 215859 13 INFO dfs. DataBlockScanner: Ověření pro blk_-7244926816084627474 proběhlo úspěšně.
36 081110 <NUM><ČÍSLO> INFO <>: <><>> <pro blok <*> 081110 215924 15636 INFO dfs. DataNode$BlockReceiver: Příjem prázdného paketu pro blokové blk_3991288654265301939
12 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* <>><> <> <> <><><> <081110 215953 19 INFO dfs. FSNamesystem: BLOCK* požádejte 10.250.15.198:50010 o replikaci blk_-3782569120714539446 na datové uzly 10.251.203.129:50010.
12 081110 <NUM><NUM> INFO<>: <><> <>><> <blok blk_<NUM><> <> 081110 215955 18 INFO dfs. DataNode: 10.250.15.198:50010 Spuštění vlákna pro přenos bloku blk_-3782569120714539446 do 10.251.203.129:50010
12 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: Přijatý blok blk_<NUM> src: <IP> dest: <IP> adresa velikosti <NUM> 081110 215957 15226 INFO dfs. DataNode$DataXceiver: Přijatý blok blk_-3782569120714539446 src: /10.250.15.198:51013 dest: /10.250.15.198:50010 14474705
6 081110 <NUM><NUM><> dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: <>> <<><> <<> <> <>>velikost <NUM> 081110 215924 27 WARN dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: Redundant addStoredBlock request received for blk_2522553781740514003 on 10.251.202.134:50010 size 67108864
6 081110 <NUM><NUM> INFO dfs. DataNode$DataXceiver: <>> <<> <<>>: <><><> <>> <081110 215936 15714 INFO dfs. DataNode$DataXceiver: writeBlock blk_720939897861061328 došlo k výjimce java.io.IOException: Nepodařilo se číst ze streamu
3 081110 <NUM><NUM> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: <>><> <<> <<> <>> size <NUM><>><> <<><> <<> <>>. 081110 220635 28 INFO dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: požadavek addStoredBlock přijatý pro blk_-81196479666306310 10.250.17.177:50010 velikost 53457811 Ale nepatří do žádného souboru.
1 081110 <NUM><NUM><>> <:><<>> <>> <<<>> << . .><> <><> <> 081110 220631 19 WARN dfs. FSDataset: Při pokusu o odstranění blokování blk_ 2012154052725261337 došlo k neočekávané chybě. Parametr BlockInfo nebyl nalezen v objektu volumeMap.

Tato funkce není podporovaná.