Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Cơ Sở Dữ Liệu

Nhập dữ liệu CSV vào Elasticsearch dễ dàng với Logstash

Bài viết gốc được đăng tải vào ngày 10 tháng 9 năm 2015 tại ObjectRocket.com/blog

Bạn có một instance Elasticsearch® hoàn toàn mới, nhưng tất cả dữ liệu hữu ích bạn muốn tìm kiếm nằm trong file CSV? Không thành vấn đề. Logstash® giúp biến hầu như mọi loại dữ liệu thành thứ dễ dàng tìm kiếm trong chỉ mục Elasticsearch.

Nhập dữ liệu CSV vào Elasticsearch dễ dàng với Logstash

Để bắt đầu, bạn cần một số dữ liệu và môi trường tương tự Unix® để sử dụng các ví dụ này. Windows® hoạt động tốt với một vài điều chỉnh nhỏ. Trong trường hợp này, chúng tôi muốn lấy bản xuất dữ liệu từ trạm thời tiết Davis Vantage Pro2® của mình, ở định dạng .CSV, và tạo một chỉ mục mới từ nó.

Chúng tôi bắt đầu với vài triệu dòng tương tự như sau, được lưu trữ trong file cục bộ:

$ head -3 /home/erik/weather.csv
HumOut,TempIn,DewPoint,HumIn,WindDir,RainMonth,WindSpeed,RainDay,BatteryVolts,WindChill,Pressure,time,TempOut,WindSpeed10Min,RainRate
76,78.0,78.227017302825,44,109,2.0,2,0.0,1.236328125,90.87261657090625,29.543,2015-06-18T17:49:29Z,86.5,1,0.0
76,78.0,78.227017302825,44,107,2.0,2,0.0,1.236328125,90.87261657090625,29.543,2015-06-18T17:49:45Z,86.5,1,0.0
76,78.0,78.32406784157725,44,107,2.0,0,0.0,1.236328125,90.83340000000001,29.543,2015-06-18T17:50:00Z,86.59999999999999,1,0.0

Lưu ý: Để thử nghiệm này hoạt động, bạn cần có ít nhất một nguồn dữ liệu.

Sau khi có dữ liệu, bạn có thể bắt đầu. Trước hết, hãy đảm bảo bạn đã cài đặt một phiên bản Java:

$ java -version
openjdk version "1.8.0_51"

Bất kỳ Máy ảo Java (JVM) nào cũng ổn cho việc này — OpenJDK®, Oracle®, v.v.

$ curl -O https://download.elastic.co/logstash/logstash/logstash-1.5.4.tar.gz
$ tar xfz logstash-1.5.4.tar.gz
$ cd logstash-1.5.4
$ mkdir conf

Bây giờ, đã đến lúc xây dựng file cấu hình.

Đầu tiên, xác định phần input nơi bạn nói cho Logstash biết nơi tìm dữ liệu:

input {
  file {
    path => "/home/erik/weather.csv"
    start_position => beginning
  }
}

Điều này chỉ nói cho Logstash biết nơi nhìn và rằng chúng ta muốn tải từ đầu file. Tiếp theo, chúng ta cần một bộ lọc (filter) — Logstash có sẵn rất nhiều plugin bộ lọc. Ví dụ này sử dụng một vài để phân tích dữ liệu. Cho đến nay, Logstash không biết bất cứ điều gì về dữ liệu trong file — bạn cần chỉ định định dạng và bất kỳ chi tiết cụ thể nào về cách xử lý các trường:

filter {
  csv {
    columns => [
      "HumOut", "TempIn", "DewPoint", "HumIn", "WindDir", "RainMonth",
      "WindSpeed", "RainDay", "BatteryVolts", "WindChill", "Pressure",
      "time", "TempOut", "WindSpeed10Min", "RainRate"
    ]
    separator => ","
    remove_field => ["message"]
  }
  date {
    match => ["time", "ISO8601"]
  }
  mutate {
    convert => ["TempOut", "float"]
  }
}

Các cột dễ hiểu, nhưng đây là thêm chi tiết. Đầu tiên, ví dụ xóa trường message, là một mục chứa toàn bộ hàng. Bạn không cần nó vì bạn tìm kiếm các thuộc tính cụ thể. Thứ hai, nó chỉ định trường time chứa ngày tháng định dạng ISO8601 để Elasticsearch biết đó không phải là chuỗi đơn giản. Cuối cùng, nó sử dụng hàm mutate để chuyển đổi giá trị TempOut thành số dấu phẩy động (floating-point).

Bây giờ, sử dụng mã sau để nạp dữ liệu và phân tích cú pháp sau khi lưu trữ trong Elasticsearch:

output {
  elasticsearch {
    protocol => "https"
    host => ["iad1-20999-0.es.objectrocket.com:20999"]
    user => "erik"
    password => "mysupersecretpassword"
    action => "index"
    index => "eriks_weather_index"
  }
  stdout { }
}

Cuối cùng, cấu hình host và port, dữ liệu xác thực, và tên chỉ mục để lưu trữ.

Được, hãy chạy nó lên. Nếu hoạt động, nó sẽ trông giống như sau:

$ bin/logstash -f conf/logstash.conf -v
Logstash startup completed

Có hoạt động không? Hãy hỏi Elasticsearch:

$ curl -u erik:mysupersecretpassword 'https://iad1-20999-0.es.objectrocket.com:20999/_cat/indices?v'
health status index pri rep docs.count store.size pri.store.size
green open eriks_weather_index 5 1 294854 95.8mb 48.5mb

Các tài liệu đã có đó, hãy truy vấn một cái:

$ curl -u erik:mysupersecretpassword 'https://iad1-20999-0.es.objectrocket.com:20999/eriks_weather_index/_search?q=TempOut:>75&pretty&terminate_after=1'

Điều này yêu cầu Elasticsearch tìm tài liệu với TempOut lớn hơn 75 (Tempout:>75), định dạng để dễ đọc (pretty), và trả về không quá một kết quả mỗi shard (terminate_after=1). Nó sẽ trả về kết quả như sau:

{
  "took" : 4,
  "timed_out" : false,
  "terminated_early" : true,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "eriks_weather_index",
        "_type" : "logs",
        "_id" : "AU-yXZJIJb3HnhKvpdNC",
        "_score" : 1.0,
        "_source":{
          "@version":"1",
          "@timestamp":"2015-06-22T10:24:23.000Z",
          "host":"kibana",
          "path":"/home/erik/weather.csv",
          "HumOut":"86",
          "TempIn":"79.7",
          "DewPoint":"70.65179649787358",
          "HumIn":"46",
          "WindDir":"161",
          "RainMonth":"2.7",
          "WindSpeed":"0",
          "RainDay":"0.36",
          "BatteryVolts":"1.125",
          "WindChill":"82.41464999999999",
          "Pressure":"29.611",
          "time":"2015-06-22T10:24:23Z",
          "TempOut":75.1,
          "WindSpeed10Min":"0",
          "RainRate":"0.0"
        }
      }
    ]
  }
}

Thành công. Logstash là một "dao đa năng" tuyệt vời để biến bất kỳ dữ liệu bạn có quanh đây thành thứ bạn có thể dễ dàng "chơi" trong Elasticsearch, vì vậy hãy tận hưởng!

Truy cập www.rackspace.com và nhấp vào Sales Chat để bắt đầu cuộc hội thoại. Sử dụng tab Feedback để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi.

Nhấp vào đây để xem Điều khoản dịch vụ Đám mây Rackspace.