【Logstash】不要な項目(フィールド)を削除してElasticsearchのデータ容量を節約する

LogstashはElasticsearchにデータを投入するためのツールで、リアルタイムに生成されるデータを随時加工し、Elasticsearchに送出することができます。

Logstashを使ってデータを入れる際、全ての項目を入れなくてよいケースもあると思います。不要なデータを削ることは、容量を節約するうえでも重要です。

今回は、Logstashからデータを投入する際に不要な項目(フィールド)を削除する方法を紹介します。

使用するデータ

今回はGoogleの株価データを使用します。

DateHighLowOpenCloseVolumeAdj Close
2015/11/232095.612081.392089.412086.5935879800002086.59
2015/11/242094.122070.292084.422089.1438849300002089.14
2015/11/2520932086.32089.32088.8728529400002088.87
2015/11/2620932086.32089.32088.8728529400002088.87
2015/11/272093.292084.132088.822090.1114668400002090.11
2015/11/282093.292084.132088.822090.1114668400002090.11
2015/11/292093.292084.132088.822090.1114668400002090.11
2015/11/302093.812080.412090.952080.4142750300002080.41
google_stock.csv

そのままデータを投入する

まずは項目削除を一切行わずにElasticsearchにデータを入れてみます。使いやすいようにデータの加工はしています。これらの処理は今回の内容とは関係ありません。

input {
  file{
	path => "C:/Project/*_stock.csv"
	sincedb_path => "C:/Project/stock_sincedb"
	start_position => "beginning"
	}
}


filter{

	csv{
		skip_header => "true"
		columns => ["Date", "High", "Low", "Open", "Close", "Volume", "Adj", "close"]
		separator => ","
	}
	
	mutate{
		convert => {
			"High" => "float"
			"Low" => "float"
			"Open" => "float"
			"Close" => "float"
			"Volume" => "float"
			"Adj" => "float"
			"close" => "float"
		}
	}

	grok{
		match => { "path" => "%{GREEDYDATA:path}/%{GREEDYDATA:company}_stock.csv"}
	}

	date{
		match => ["Date", "yyyy-MM-dd" ]
	}
}

output {
  elasticsearch {
    hosts => "http://localhost:9200"
    index => "%{company}_stock-%{+YYYY}"
  }
}

データを確認してみると、

csvファイルにあった項目はもちろん、hostやmessageなど心当たりのないフィールドも勝手に追加されてしまっています。

今回はhostなど勝手に追加されたフィールドのほか、もともとcsvファイルにあったAdjを削除してみます。

フィールドの削除

フィールドの削除はremove_fieldで行い、filter領域のmutateの内部に記載します。具体的には以下のように書きます。

filter{
 mutate{
  remove_field => ["message", "host", "Adj"]
 }
}

上記では、”message”、”host”、”Adj”を削除するように設定しています。

これを元々の設定ファイルに組み込むと以下のようになります。

input {
  file{
	path => "C:/Project/*_stock.csv"
	sincedb_path => "C:/Project/stock_sincedb"
	start_position => "beginning"
	}
}


filter{

	csv{
		skip_header => "true"
		columns => ["Date", "High", "Low", "Open", "Close", "Volume", "Adj", "close"]
		separator => ","
	}
	
	mutate{
		convert => {
			"High" => "float"
			"Low" => "float"
			"Open" => "float"
			"Close" => "float"
			"Volume" => "float"
			"Adj" => "float"
			"close" => "float"
		}
		
		remove_field => ["message", "host", "Adj"]
	}


	grok{
		match => { "path" => "%{GREEDYDATA:path}/%{GREEDYDATA:company}_stock.csv"}
	}

	date{
		match => ["Date", "yyyy-MM-dd" ]
	}
}

output {
  elasticsearch {
    hosts => "http://localhost:9200"
    index => "%{company}_stock-%{+YYYY}"
  }
}

この設定で投入されたデータを見てみます。

“message”、”host”、”Adj”が存在しないことがわかります。

まとめ

Logstashで不要な項目(フィールド)を削除してElasticsearchに投入する方法を紹介しました。

保管するデータ項目を整理することは、データを分析する上でも重要です。データ投入時になるべく不要な項目はそぎ落として、効率的なデータ管理ができればいいと思います^^

ではでは👋