Статьи

Почтовые ящики майнинга с Elasticsearch и Kibana

В предыдущем посте я упоминал, что трио Logstash, Kibana и Elasticsearch (стек ELK) является одним из самых популярных решений с открытым исходным кодом не только для управления журналами, но и для анализа данных. В этом посте я продемонстрирую, как ELK может использоваться для эффективного и действенного анализа больших данных. В качестве ссылки давайте возьмем огромные данные почтового ящика. Почтовые архивы, возможно, являются одним из самых интересных видов социальных сетей. Оно вездесуще, и каждое сообщение проливает свет на общение людей. Как главный управляющий организации, вы можете анализировать корпоративную почту на предмет тенденций и моделей.

В качестве справки я возьму известный корпус Enron, так как он содержит огромную коллекцию писем, и здесь нет риска каких-либо правовых проблем или вопросов конфиденциальности. Эти данные будут стандартизированы в формат почтового ящика Unix (mbox). Из формата mbox он снова будет преобразован в один файл JSON.

Получение данных корпуса Enron

Полный набор данных Enron в необработанном виде доступен для загрузки в различных форматах. Я начну с исходной необработанной формы набора данных, который, по сути, представляет собой набор папок, который организует коллекцию почтовых ящиков по лицам и папкам. Следующий фрагмент иллюстрирует базовую структуру корпуса после того, как вы скачали и разархивировали его. Идите дальше и поиграйте с ним немного, чтобы вы с ним познакомились.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
C:\> cd enron_mail_20110402\maildir # Go into the mail directory
 
C:\enron_mail_20110402\maildir>dir # Show folders/files in the current directory</pre>
allen-p         crandell-s     gay-r           horton-s
 
lokey-t         nemec-g         rogers-b       slinger-r
 
tycholiz-b     arnold-j       cuilla-m       geaccone-t
<pre>               ...directory listing truncated...</pre>
neal-s         rodrique-r     skilling-j     townsend-j
<pre>C:\enron_mail_20110402\maildir> cd allen-p/ # Go into the allen-p folder
 
C:\enron_mail_20110402\maildir\allen-p> dir # Show files in the current directory</pre>
_sent_mail         contacts         discussion_threads notes_inbox
 
sent_items         all_documents     deleted_items     inbox
<pre>sent               straw
C:\enron_mail_20110402\maildir\allen-p> cd inbox/ # Go into the inbox for allen-p
 C:\enron_mail_20110402\maildir\allen-p\inbox> dir # Show the files in the inbox for allen-p</pre>
<ol>
    <li>11. 13. 15. 17. 19. 20. 22. 24. 26. 28. 3. 31. 33. 35. 37. 39. 40.</li>
    <li>44. 5. 62. 64. 66. 68. 7. 71. 73. 75. 79. 83. 85. 87. 10. 12. 14.</li>
    <li>18. 2. 21. 23. 25. 27. 29. 30. 32. 34. 36. 38. 4. 41. 43. 45. 6.</li>
</ol>
<pre>   63. 65. 67. 69. 70. 72. 74. 78. 8. 84. 86. 9.
C:\enron_mail_20110402\maildir\allen-p\inbox> cat 1. # Show contents of the file named "1."
 
Message-ID: &lt;16159836.1075855377439.JavaMail.evans@thyme&gt;
 Date: Fri, 7 Dec 2001 10:06:42 -0800 (PST)
 Subject: RE: West Position
 Mime-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit
 X-From: Dunton, Heather &lt;/O=ENRON/OU=NA/CN=RECIPIENTS/CN=HDUNTON&gt;
 X-To: Allen, Phillip K. &lt;/O=ENRON/OU=NA/CN=RECIPIENTS/CN=Pallen&gt;
 X-cc:
 X-bcc:
 X-Folder: \Phillip_Allen_Jan2002_1\Allen, Phillip K.\Inbox
 X-Origin: Allen-P
 X-FileName: pallen (Non-Privileged).pst
 
Please let me know if you still need Curve Shift.
 
Thanks,

Теперь следующим шагом является преобразование почтовых данных в формат Unix mbox. На самом деле mbox — это просто большой текстовый файл объединенных почтовых сообщений, которые легко доступны с помощью текстовых инструментов. Я использовал скрипт Python для преобразования его в формат mbox. После этого этот файл mbox будет преобразован в формат JSON, совместимый с ELK. Файл JSON можно найти здесь . Фрагмент файла JSON можно найти ниже:

1
{"index":{"_index":"enron","_type":"inbox"}}
1
[{"X-cc": "", "From": "[email protected]", "X-Folder": "\\jskillin\\Inbox", "Content-Transfer-Encoding": "7bit", "X-bcc": "", "X-Origin": "SKILLING-J", "To": ["[email protected]"], "parts": [{"content": "\n[IMAGE]\n[IMAGE]\nJoin us June 26th for an on-line seminar featuring Steven J. Kafka, Senior Analyst at Forrester Research, as he discusses how technology can create more effective collaboration in today's virtualized enterprise. Also featuring Mike Hager, VP, OppenheimerFunds, offering insights into implementing these technologies through real-world experiences. Brian Anderson, CMO, Access360 will share techniques and provide tips on how to successfully deploy resources across the virtualized enterprise. \nDon't miss this important event. Register now at http://www.access360.com/webinar/ . For a sneak preview, check out our one-minute animation that illustrates the challenges of provisioning access rights across the \"virtualized\" enterprise.\nAbout Access360\nAccess360 provides the software and services needed for deploying policy-based provisioning solutions. Our solutions help companies automate the process of provisioning employees, contractors and business partners with access rights to the applications they need. With Access360, companies can react instantaneously to changing business environments and relationships and operate with confidence, whether in a closed enterprise environment or across a virtual or extended enterprise.\n \nAccess360 \n\nIf you would prefer not to receive further messages from this sender:\n1. Click on the Reply button.\n2. Replace the Subject field with the word REMOVE.\n3. Click the Send button.\nYou will receive one additional e-mail message confirming your removal.\n\n", "contentType": "text/plain"}], "X-FileName": "jskillin.pst", "Mime-Version": "1.0", "X-From": "Access360 <[email protected]>@ENRON", "Date": {"$date": 991326029000}, "X-To": "Skilling, Jeff </o=ENRON/ou=NA/cn=Recipients/cn=JSKILLIN>", "Message-ID": "<14649554.1075840159275.JavaMail.evans@thyme>", "Content-Type": "text/plain; charset=us-ascii", "Subject": "Forrester Research on Best Practices for the \"Virtualized\" Enterprise"}

Если у вас есть огромное количество данных, которые нужно отправить в Elasticsearch, лучше выполнить массовый импорт, указав файл данных. Каждое почтовое сообщение находится в отдельной строке, связанной с записью, указывающей индекс (enron) и документ (входящие). Нет необходимости указывать идентификатор, поскольку Elasticsearch будет автоматически указывать идентификатор.

Данные в Elasticsearch можно широко разделить на два типа — точные значения и полный текст . Точные значения — именно то, на что они похожи. Примерами являются дата или идентификатор пользователя, но они также могут содержать точные строки, такие как имя пользователя или адрес электронной почты. Например, точное значение Foo не совпадает с точным значением foo. Точное значение 2014 года не совпадает с точным значением 2014-09-15. С другой стороны, полный текст относится к текстовым данным, обычно написанным на каком-то человеческом языке, таким как текст твита или текст письма. Для этого упражнения лучше рассматривать адреса электронной почты (To, CC, BCC) как точные значения. Следовательно, нам сначала нужно указать отображение, что можно сделать следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
curl -XPUT “localhost:9200/enron” -d "{
"settings":
{
    "number_of_shards": 5,
    "number_of_replicas": 1
},
"mappings":
{
    "inbox":
    {
        "_all":
        {
            "enabled": false
        },
        "properties":
        {
            "To":
            {
"type": "string",
"index": "not_analyzed"
            },
            "From":
            {
                "type": "string",
                "index": "not_analyzed"
            },
            "CC":
            {
                "type": "string",
                "index": "not_analyzed"
            },
            "BCC":
            {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }
  }
}"

Вы можете проверить, что сопоставление действительно установлено.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
    "enron" :
    {
        "mappings" :
        {
            "inbox" :
            {
                "_all" :
                {
                    "enabled" : false
                },
                "properties" :
                {
                    "BCC" :
                    {
                        "type" : "string",
                        "index" : "not_analyzed"
                    },
                    "CC" :
                    {
                        "type" : "string",
                        "index" : "not_analyzed"
                    },
                    "From" :
                    {
                        "type" : "string",
                        "index" : "not_analyzed"
                    },
                    "To" :
                    {
                        "type" : "string",
                        "index" : "not_analyzed"
                    }
                }
            }
        }
    }
}

Теперь давайте загрузим все данные почтового ящика с помощью файла json следующим образом:

1
curl -XPOST "http://localhost:9200/_bulk" --data-binary @enron.json

Мы можем проверить, все ли данные были успешно загружены.

01
02
03
04
05
06
07
08
09
10
curl "localhost:9200/enron/inbox/_count?pretty"
{
    "count" : 41299,
    "_shards" :
    {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    }
}

Вы можете видеть, что 41299 записей, каждая из которых соответствует другому сообщению, были загружены. Теперь давайте начнем самое интересное с анализа этих данных. Kibana предоставляет потрясающие аналитические возможности и соответствующие графики. Попробуем посмотреть, сколько сообщений распространяется еженедельно.

Энрон дата

Вышеупомянутая гистограмма показывает распространение сообщения на еженедельной основе Значение даты выражается в миллисекундах после эпохи. Вы можете видеть, что одна конкретная неделя имеет пик 3546 сообщений. На этой неделе должно произойти что-то интересное. Теперь давайте посмотрим, кто является основными получателями сообщений

Enron к

Вы можете видеть, что Джеральд, Сара, Кеннет являются одними из лучших получателей сообщений. Как насчет проверки лучших отправителей?

Энрон от

Вы можете видеть, что Пит, Джэ и Кен — главные отправители сообщений. Если вам интересно, что именно сотрудники Enron обсуждали, давайте посмотрим на ключевые слова из тем сообщений.

enorn-субъектных

Кажется, самые интересные дискуссии были посвящены энрону, газу, энергии, энергии. Может быть намного более интересный анализ, сделанный с почтовыми данными Enron. Я бы порекомендовал вам попробовать следующее:

  • Подсчет отправленных / полученных сообщений для определенных адресов электронной почты
  • Каково было максимальное количество получателей в сообщении?
  • Какие два человека обменялись наибольшим количеством сообщений друг с другом?
  • Сколько сообщений было от человека к человеку?