1. logstash导入MySQL数据
- 要使用logstash导入数据的时候,首先需要将mysql的驱动包(注意版本)加入到logstash的home目录下logstash-core\lib\jars下。
- 在config目录下创建logstash-mysql.conf文件,配置如下:
input {
jdbc {
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/es?useSSL=false&serverTimezone=UTC"
jdbc_user => es
jdbc_password => "123456"
#启用追踪,如果为true,则需要指定tracking_column
use_column_value => false
#指定追踪的字段,
tracking_column => "id"
#追踪字段的类型,目前只有数字(numeric)和时间类型(timestamp),默认是数字类型
tracking_column_type => "numeric"
#记录最后一次运行的结果
record_last_run => true
#上面运行结果的保存位置
last_run_metadata_path => "mysql-position.txt"
statement => "SELECT * FROM news where tags is not null"
#表示每天的 17:57分执行
schedule => " 0 57 17 * * *"
}
}
filter {
mutate {
split => { "tags" => ","}
}
}
output {
elasticsearch {
document_id => "%{id}"
document_type => "_doc"
index => "news"
hosts => ["http://localhost:9200"]
}
stdout{
codec => rubydebug
}
}
- 运行如下命令导入数据集
D:\logstash-datas\bin>logstash.bat -f ../config/logstash-mysql.conf
注意: 在导入数据时可能会遇到内存溢出问题
cmd运行jvisualvm命令,然后安装Visual GC插件,可以查看本地程序使用的内存
Eden新生代
Metaspace元空间数据导入时elasticsearch出现内存溢出=> 调整JVM堆内存大小
config/jvm.options
-Xms3g(初始化最小内存大小)
-Xmx3g(初始化最大内存大小),最小和最大值要一致
或者尝试删除logstash下的data文件夹中的内容,我这里修改为3G
-XX:NewRatio=4(新生代与老年代内存大小比例为1:4),默认为2
-XX:MaxDirectMemorySize=128m
控制 堆外内存区 的大小 虽然不隶属于JVM,但是还是由JVM来回收的
Settiong the heap size
为什么给的内存大小不能超过50%?因为Elasticsearch的文件系统也需要内存
Netty 堆外内存,也叫直接内存,涉及到用户态、内核态、NIO
堆外内存
Java本身对文件是没有读取能力的(不能直接操作硬件层面),Java之所以能以输入流和输出流读取、写入文件,是借助于操作系统层面的东西。
Java调用JVM,JVM使用C++语言写的,而C++语言是可以直接操作操作系统的。Java中调用OutputStream输出流和InputStream输入流,是间接调用了操作系统层面的东西,涉及到了状态的变化。
Java调用InputStream输入流,首先会将硬盘中的文件读取到真实物理内存中,接着把真实物理内存中的数据读取到JVM的内存中,这个过程有个状态的变化,从内核态切换到用户态。
Java调用OutputStream输出流,是用户态切换到内核态。
以上,经历了5个步骤,浪费了系统的性能。
所以,ElasticSearch、Hadoop、Dubbo等都使用了Netty。Netty是一个高性能的IO通信框架,高性能体现在IO的处理上。Netty可以让数据不切换到用户态,直接再内核态完成数据的输入和输出。
Netty对IO的处理实际上是NIO来做的,NIO中有一个非常重要的概念:零拷贝,即不需要拷贝到JVM的内存中。
-XX:MaxDirectMemorySize
配置的是堆外内存的大小,即Netty对文件处理的内存空间大小。如果堆外内存过小会报出direct buffer memory
错误,提示直接内存不足