96SEO 2026-02-19 17:06 38
项目配置项目配置application.properties日志配置log4j2.properties项目pom.xml文件

客户端工厂类CustomRestClientFactory7.4
回调函数类CustomRequestConfigCallback7.5
客户端配置类CustomHttpClientConfigCallback7.6
Es操作类CustomElasticsearchSinkFunction7.7
异常处理类CustomActionRequestFailureHandler7.8
作业主类ElasticsearchSinkStreamJobAdvancedDemo
Sink是用于将Flink数据流DataStream中的数据发送到Elasticsearch的组件。
它是Flink的一个连接器Connector用于实现将实时处理的结果或数据持续地写入Elasticsearch集群中的索引中。
数据源SourceFlink数据流的源头可以是各种数据源例如Kafka、文件系统、Socket等。
Elasticsearch
Sink通常是连接到Flink数据流的末端用于将最终处理结果或数据写入Elasticsearch。
Elasticsearch集群一个或多个Elasticsearch节点的集合用于存储和处理数据。
Elasticsearch提供了分布式的数据存储和搜索功能。
索引Index在Elasticsearch中索引是存储相关数据的地方类似于关系数据库中的表。
每个索引可以包含多个文档Document每个文档包含一个或多个字段Field。
文档Document在Elasticsearch中文档是最小的数据单元。
它们以JSON格式表示并存储在索引中。
Elasticsearch
Sink是Flink的一个数据接收器用于将数据流中的数据发送到Elasticsearch集群中的特定索引。
Sink负责将Flink数据流中的事件转换为Elasticsearch要求的格式并将其发送到指定的索引。
序列化与映射在将数据写入Elasticsearch之前通常需要对数据进行序列化和映射。
序列化是将数据从Flink的内部表示转换为Elasticsearch要求的JSON格式。
映射则是定义如何将Flink数据流中的字段映射到Elasticsearch文档中的字段。
并行度控制Elasticsearch
Sink支持并行度控制可以根据需要调整并发写入Elasticsearch的任务数量。
这有助于优化性能并避免对Elasticsearch集群造成过大的负载。
Sink是一个关键的组件用于将实时处理的结果或数据可靠地写入Elasticsearch中从而支持各种实时数据分析和搜索应用。
Flink您可以对数据进行各种转换和处理。
这可能包括数据清洗、转换、聚合、窗口操作等。
在您的
集群的地址、端口、索引名称等信息。
您还可以配置其他参数例如批量写入的大小、超时时间等。
数据发送到
Elasticsearch以提高写入的效率和性能。
序列化与映射
提供了容错机制来确保数据的可靠性和一致性。
如果在数据发送过程中发生错误例如网络故障或
会自动进行故障恢复并重新发送丢失的数据以确保数据不会丢失。
性能优化
可以通过调整批量写入的大小、并发度等参数来优化性能。
这可以减少与
来配置批量写入的大小、并发度等参数以优化写入性能。
TransportClient
Elasticsearch、执行查询、索引管理等操作。
序列化器Serializer
格式。
您可以根据具体的数据类型和业务需求来实现自定义的序列化器。
Elasticsearch
需要具备容错和错误处理机制以确保数据的可靠性和一致性。
如果在数据发送过程中发生错误例如网络故障或
写入失败时可以启用退避策略以避免频繁的重试。
此时setBulkFlushBackoffDelay
设置批量写入的退避延迟时间,在发生写入失败后等待指定的延迟时间后再进行重试
设置批量写入的最大重试次数,设置在写入失败后的最大重试次数。
超过这个次数后将不再重试
集群建立连接的超时时间单位为毫秒。
在指定的时间内无法建立连接将会抛出连接超时异常
连接的套接字超时时间单位为毫秒。
该参数定义了在建立连接后从服务器读取数据的超时时间。
设置连接请求超时时间单位为毫秒。
该参数表示从连接池获取连接的超时时间。
如果在指定的时间内无法获得连接将会抛出连接请求超时异常。
设置是否允许重定向。
如果设置为true则当遇到重定向响应时客户端将跟随重定向并继续请求如果设置为false重定向响应将被视为错误。
启用身份验证功能。
通过设置该参数为true可以提供用户名和密码进行身份验证以连接到
设置是否允许循环重定向。
如果设置为true则允许在重定向过程中发生循环重定向如果设置为false则在检测到循环重定向时将会抛出异常。
机制。
当设置为true时在发送请求之前客户端会发送一个请求头部询问服务器是否接受请求的主体部分。
如果服务器响应允许继续发送请求主体则客户端会继续发送请求如果服务器响应拒绝继续发送请求主体则客户端会放弃该请求。
dependencygroupIdorg.apache.flink/groupIdartifactIdflink-java/artifactIdversion1.14.4/version
dependencygroupIdorg.apache.flink/groupIdartifactIdflink-streaming-scala_1.12/artifactIdversion1.14.4/version
dependencygroupIdorg.apache.flink/groupIdartifactIdflink-clients_1.12/artifactIdversion1.14.4/version
dependencygroupIdorg.apache.flink/groupIdartifactIdflink-connector-elasticsearch7_1.12/artifactIdversion1.14.4/version
com.alibaba.fastjson.JSONObject;
org.apache.flink.api.common.functions.RuntimeContext;
org.apache.flink.streaming.api.datastream.DataStreamSource;
org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
org.apache.flink.streaming.api.functions.source.SourceFunction;
org.apache.flink.streaming.connectors.elasticsearch.ElasticsearchSinkFunction;
org.apache.flink.streaming.connectors.elasticsearch.RequestIndexer;
org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink;
org.elasticsearch.action.index.IndexRequest;
org.elasticsearch.client.Requests;
org.elasticsearch.common.xcontent.XContentType;
java.time.format.DateTimeFormatter;
ElasticsearchSinkStreamJobQuickDemo
LoggerFactory.getLogger(ElasticsearchSinkStreamJobQuickDemo.class);public
创建elasticsearch集群的httpHost连接HttpHost
ArrayList();httpHosts.add(httpHost);//
创建elasticsearchSinkFunction函数对象专门用于处理数据写入elasticsearchSink算子队列会自动创建索引ElasticsearchSinkFunctionJSONObject
ElasticsearchSinkFunctionJSONObject()
element.getString(transId);String
element.getString(tradeTime);String
tradeTime;logger.info(交易流水{},数据写入索引{}成功,
Requests.indexRequest().index(index).type(_doc).id(transId).source(element,
XContentType.JSON);indexer.add(indexRequest);}};//
构建elasticsearchSink算子BuilderElasticsearchSink.BuilderJSONObject
ElasticsearchSink.Builder(httpHosts,
每个请求最多发送的文档数量esSinkBuilder.setBulkFlushMaxActions(1);//
每次发送请求的时间间隔esSinkBuilder.setBulkFlushInterval(1000);//构建elasticsearchSink算子ElasticsearchSinkJSONObject
自定义数据源模拟生产环境交易接入,每秒下发一个json格式数据SourceFunctionJSONObject
UUID.randomUUID().toString();//交易发生时间戳long
System.currentTimeMillis();//交易发生金额long
Random().nextInt(1000);//交易名称String
JSONObject();dataObj.put(transId,
tradeId);dataObj.put(timeStamp,
timeStamp);dataObj.put(tradeTime,
dateUtil(timeStamp));dataObj.put(tradeAmount,
tradeAmount);dataObj.put(tradeName,
tradeName);//模拟生产每隔1秒生成一笔交易Thread.sleep(1000);logger.info(源交易流水{},原始报文{},
dataObj.toJSONString());sourceContext.collect(dataObj);}}Overridepublic
创建运行环境StreamExecutionEnvironment
StreamExecutionEnvironment.getExecutionEnvironment();//
构建数据源DataStreamSourceJSONObject
数据源写入数据算子进行输出到elasticsearchdataStreamSource.addSink(sink);//
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp),
DateTimeFormatter.ofPattern(yyyyMMdd);//
formatter.format(dateTime);return
启动上述作业后根据对应的交易流水号查询es或者查询es的索引数据但是索引数据一般是一段时间才更新
http://127.0.0.1:9200/_cat/indices?v
进阶实战主要是包括ElasticsearchSink的各种参数配置以及性能调优
es.cluster.indexPrefixflink_#内部批量处理器刷新前最大缓存的操作数
es.cluster.bulkFlushMaxActions1
es.cluster.bulkFlushMaxSizeMb10
es.cluster.bulkFlushInterval10000#是否启用批量写入的退避策略当Elasticsearch
写入失败时可以启用退避策略以避免频繁的重试。
此时setBulkFlushBackoffDelay
es.cluster.bulkFlushBackofffalse
#设置批量写入的退避延迟时间,在发生写入失败后等待指定的延迟时间后再进行重试
es.cluster.bulkFlushBackoffDelay10000
#设置批量写入的最大重试次数,设置在写入失败后的最大重试次数。
超过这个次数后将不再重试
es.cluster.bulkFlushBackoffRetries3#设置与
集群建立连接的超时时间单位为毫秒。
在指定的时间内无法建立连接将会抛出连接超时异常
连接的套接字超时时间单位为毫秒。
该参数定义了在建立连接后从服务器读取数据的超时时间。
#设置连接请求超时时间单位为毫秒。
该参数表示从连接池获取连接的超时时间。
如果在指定的时间内无法获得连接将会抛出连接请求超时异常。
es.cluster.connectionRequestTimeout10000
设置是否允许重定向。
如果设置为true则当遇到重定向响应时客户端将跟随重定向并继续请求如果设置为false重定向响应将被视为错误。
es.cluster.redirectsEnabledfalse
es.cluster.maxRedirects3#启用身份验证功能。
通过设置该参数为true可以提供用户名和密码进行身份验证以连接到
es.cluster.au***nticationEnabledfalse
#设置是否允许循环重定向。
如果设置为true则允许在重定向过程中发生循环重定向如果设置为false则在检测到循环重定向时将会抛出异常。
es.cluster.circularRedirectsAllowedfalse
es.cluster.contentCompressionEnabledfalse
机制。
当设置为true时在发送请求之前客户端会发送一个请求头部询问服务器是否接受请求的主体部分。
如果服务器响应允许继续发送请求主体则客户端会继续发送请求如果服务器响应拒绝继续发送请求主体则客户端会放弃该请求。
es.cluster.expectContinueEnabledfalse
es.cluster.normalizeUrifalse日志配置log4j2.properties
rootLogger.appenderRef.console.refConsoleAppender
appender.console.nameConsoleAppender
appender.console.layout.typePatternLayout
appender.console.layout.pattern%d{HH:mm:ss,SSS}
log.fileD:\\tmprootLogger.levelINFO
rootLogger.appenderRef.console.refConsoleAppender
appender.console.nameConsoleAppender
appender.console.layout.typePatternLayout
appender.console.layout.pattern%d{HH:mm:ss,SSS}
xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.aurora/groupIdartifactIdaurora_elasticsearch_connector/artifactIdversion1.0-SNAPSHOT/version!--属性设置--properties!--java_JDK版本--java.version1.8/java.version!--maven打包插件--maven.plugin.version3.8.1/maven.plugin.version!--编译编码UTF-8--project.build.sourceEncodingUTF-8/project.build.sourceEncoding!--输出报告编码UTF-8--project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding!--json数据格式处理工具--fastjson.version1.2.75/fastjson.version!--log4j版本--log4j.version2.17.1/log4j.version!--flink版本--flink.version1.14.4/flink.version!--scala版本--scala.binary.version2.12/scala.binary.version/properties!--依赖管理--dependencies!--
--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion${fastjson.version}/version/dependency!--
--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j-impl/artifactIdversion${log4j.version}/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion${log4j.version}/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion${log4j.version}/version/dependency!--
--dependencygroupIdorg.apache.flink/groupIdartifactIdflink-java/artifactIdversion${flink.version}/version/dependencydependencygroupIdorg.apache.flink/groupIdartifactIdflink-streaming-scala_${scala.binary.version}/artifactIdversion${flink.version}/version/dependencydependencygroupIdorg.apache.flink/groupIdartifactIdflink-clients_${scala.binary.version}/artifactIdversion${flink.version}/version/dependency!--
--dependencygroupIdorg.apache.flink/groupIdartifactIdflink-connector-elasticsearch7_${scala.binary.version}/artifactIdversion${flink.version}/version/dependency!--
--/dependencies!--编译打包--buildfinalName${project.name}/finalName!--资源文件打包--resourcesresourcedirectorysrc/main/resources/directory/resourceresourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resource/resourcespluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-shade-plugin/artifactIdversion3.1.1/versionexecutionsexecutionphasepackage/phasegoalsgoalshade/goal/goalsconfigurationartifactSetexcludesexcludeorg.apache.flink:force-shading/excludeexcludeorg.google.code.flindbugs:jar305/excludeexcludeorg.slf4j:*/excludeexcluderorg.apache.logging.log4j:*/excluder/excludes/artifactSetfiltersfilterartifact*:*/artifactexcludesexcludeMETA-INF/*.SF/excludeexcludeMETA-INF/*.DSA/excludeexcludeMETA-INF/*.RSA/exclude/excludes/filter/filterstransformerstransformerimplementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformermainClasscom.aurora.demo,ElasticsearchSinkStreamingJobDemo/mainClass/transformer/transformers/configuration/execution/executions/plugin/plugins!--插件统一管理--pluginManagementplugins!--maven打包插件--plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring.boot.version}/versionconfigurationforktrue/forkfinalName${project.build.finalName}/finalName/configurationexecutionsexecutiongoalsgoalrepackage/goal/goals/execution/executions/plugin!--编译打包插件--pluginartifactIdmaven-compiler-plugin/artifactIdversion${maven.plugin.version}/versionconfigurationsource${java.version}/sourcetarget${java.version}/targetencodingUTF-8/encodingcompilerArgsarg-parameters/arg/compilerArgs/configuration/plugin/plugins/pluginManagement/build/project7.2
设置批量写入的退避延迟时间,在发生写入失败后等待指定的延迟时间后再进行重试*
bulkFlushBackoffDelay10000;/***
设置批量写入的最大重试次数,设置在写入失败后的最大重试次数。
超过这个次数后将不再重试*
集群建立连接的超时时间单位为毫秒。
在指定的时间内无法建立连接将会抛出连接超时异常*
连接的套接字超时时间单位为毫秒。
该参数定义了在建立连接后从服务器读取数据的超时时间。
*
设置连接请求超时时间单位为毫秒。
该参数表示从连接池获取连接的超时时间。
如果在指定的时间内无法获得连接将会抛出连接请求超时异常。
*
connectionRequestTimeout10000;/***
设置是否允许重定向。
如果设置为true则当遇到重定向响应时客户端将跟随重定向并继续请求如果设置为false重定向响应将被视为错误。
*
启用身份验证功能。
通过设置该参数为true可以提供用户名和密码进行身份验证以连接到
设置是否允许循环重定向。
如果设置为true则允许在重定向过程中发生循环重定向如果设置为false则在检测到循环重定向时将会抛出异常。
*
circularRedirectsAllowedfalse;/***
contentCompressionEnabledfalse;/***
机制。
当设置为true时在发送请求之前客户端会发送一个请求头部询问服务器是否接受请求的主体部分。
*
如果服务器响应允许继续发送请求主体则客户端会继续发送请求如果服务器响应拒绝继续发送请求主体则客户端会放弃该请求。
*
expectContinueEnabledfalse;/***
setBulkFlushBackoffDelay(Integer
bulkFlushBackoffRetries;}public
setBulkFlushBackoffRetries(Integer
bulkFlushBackoffRetries;}public
connectionRequestTimeout;}public
setConnectionRequestTimeout(Integer
connectionRequestTimeout;}public
setAu***nticationEnabled(Boolean
circularRedirectsAllowed;}public
setCircularRedirectsAllowed(Boolean
circularRedirectsAllowed;}public
contentCompressionEnabled;}public
setContentCompressionEnabled(Boolean
{this.contentCompressionEnabled
contentCompressionEnabled;}public
setExpectContinueEnabled(Boolean
ElasticsearchSinkBase.RestClientFactory
org.apache.commons.lang3.StringUtils;
org.apache.flink.streaming.connectors.elasticsearch7.RestClientFactory;
org.apache.http.message.BasicHeader;
org.elasticsearch.client.NodeSelector;
org.elasticsearch.client.RestClient;
org.elasticsearch.client.RestClientBuilder;/***
ElasticsearchSinkBase.RestClientFactory
CustomRestClientFactory(ElasticsearchEntity
elasticsearchEntity;}Overridepublic
configureRestClientBuilder(RestClientBuilder
authorization};restClientBuilder.setDefaultHeaders(headers);//设置用于监听节点故障的监听器。
当节点发生故障时可以执行特定的操作restClientBuilder.setFailureListener(new
RestClient.FailureListener());//配置用于选择与之通信的节点的策略。
这涉及到
集群中多个节点的选择。
restClientBuilder.setNodeSelector(NodeSelector.ANY);//为每个请求设置路径前缀。
这可以用于将请求定向到特定的子路径。
if(StringUtils.isNoneBlank(elasticsearchEntity.getPathPrefix())){restClientBuilder.setPathPrefix(elasticsearchEntity.getPathPrefix());}//允许在创建每个请求的时候进行额外的请求配置。
restClientBuilder.setRequestConfigCallback(new
CustomRequestConfigCallback(elasticsearchEntity));//允许在创建
客户端配置。
restClientBuilder.setHttpClientConfigCallback(new
CustomHttpClientConfigCallback(elasticsearchEntity));//设置是否启用严格的废弃模式用于警告有关已弃用功能的使用。
restClientBuilder.setStrictDeprecationMode(false);}
回调函数类CustomRequestConfigCallback
org.apache.http.client.config.RequestConfig;
org.apache.http.impl.cookie.DefaultCookieSpec;
org.elasticsearch.client.RestClientBuilder;/***
RestClientBuilder.RequestConfigCallback
CustomRequestConfigCallback(ElasticsearchEntity
elasticsearchEntity;}Overridepublic
customizeRequestConfig(RequestConfig.Builder
集群建立连接的超时时间单位为毫秒。
在指定的时间内无法建立连接将会抛出连接超时异常custom.setConnectTimeout(elasticsearchEntity.getConnectTimeout());//
连接的套接字超时时间单位为毫秒。
该参数定义了在建立连接后从服务器读取数据的超时时间。
如果在指定的时间内没有读取到数据将会抛出超时异常。
custom.setSocketTimeout(elasticsearchEntity.getSocketTimeout());//
设置连接请求超时时间单位为毫秒。
该参数表示从连接池获取连接的超时时间。
如果在指定的时间内无法获得连接将会抛出连接请求超时异常。
custom.setConnectionRequestTimeout(elasticsearchEntity.getConnectionRequestTimeout());//
设置是否允许重定向。
如果设置为true则当遇到重定向响应时客户端将跟随重定向并继续请求如果设置为false重定向响应将被视为错误。
custom.setRedirectsEnabled(elasticsearchEntity.getRedirectsEnabled());//
设置最大重定向次数。
当允许重定向时该参数指定在遇到重定向响应时最多可以重定向的次数。
custom.setMaxRedirects(elasticsearchEntity.getMaxRedirects());//
设置是否允许循环重定向。
如果设置为true则允许在重定向过程中发生循环重定向如果设置为false则在检测到循环重定向时将会抛出异常。
custom.setCircularRedirectsAllowed(elasticsearchEntity.getCircularRedirectsAllowed());//
之间进行内容压缩以减少数据传输量。
custom.setContentCompressionEnabled(elasticsearchEntity.getContentCompressionEnabled());//
机制。
当设置为true时在发送请求之前客户端会发送一个请求头部询问服务器是否接受请求的主体部分。
//
如果服务器响应允许继续发送请求主体则客户端会继续发送请求如果服务器响应拒绝继续发送请求主体则客户端会放弃该请求。
custom.setExpectContinueEnabled(elasticsearchEntity.getExpectContinueEnabled());//
URI以便消除多余和重复的斜杠等。
custom.setNormalizeUri(elasticsearchEntity.getNormalizeUri());//
DefaultCookieSpec().toString());return
客户端配置类CustomHttpClientConfigCallback
org.apache.http.client.config.RequestConfig;
org.apache.http.impl.cookie.DefaultCookieSpec;
org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
org.elasticsearch.client.RestClientBuilder;/***
RestClientBuilder.HttpClientConfigCallback
elasticsearchEntity;CustomHttpClientConfigCallback(ElasticsearchEntity
elasticsearchEntity;}Overridepublic
customizeHttpClient(HttpAsyncClientBuilder
集群建立连接的超时时间单位为毫秒。
在指定的时间内无法建立连接将会抛出连接超时异常custom.setConnectTimeout(elasticsearchEntity.getConnectTimeout());//
连接的套接字超时时间单位为毫秒。
该参数定义了在建立连接后从服务器读取数据的超时时间。
如果在指定的时间内没有读取到数据将会抛出超时异常。
custom.setSocketTimeout(elasticsearchEntity.getSocketTimeout());//
设置连接请求超时时间单位为毫秒。
该参数表示从连接池获取连接的超时时间。
如果在指定的时间内无法获得连接将会抛出连接请求超时异常。
custom.setConnectionRequestTimeout(elasticsearchEntity.getConnectionRequestTimeout());//
设置是否允许重定向。
如果设置为true则当遇到重定向响应时客户端将跟随重定向并继续请求如果设置为false重定向响应将被视为错误。
custom.setRedirectsEnabled(elasticsearchEntity.getRedirectsEnabled());//
设置最大重定向次数。
当允许重定向时该参数指定在遇到重定向响应时最多可以重定向的次数。
custom.setMaxRedirects(elasticsearchEntity.getMaxRedirects());//
启用身份验证功能。
通过设置该参数为true可以提供用户名和密码进行身份验证以连接到
集群。
custom.setAu***nticationEnabled(elasticsearchEntity.getAu***nticationEnabled());//
设置是否允许循环重定向。
如果设置为true则允许在重定向过程中发生循环重定向如果设置为false则在检测到循环重定向时将会抛出异常。
custom.setCircularRedirectsAllowed(elasticsearchEntity.getCircularRedirectsAllowed());//
之间进行内容压缩以减少数据传输量。
custom.setContentCompressionEnabled(elasticsearchEntity.getContentCompressionEnabled());//
机制。
当设置为true时在发送请求之前客户端会发送一个请求头部询问服务器是否接受请求的主体部分。
//
如果服务器响应允许继续发送请求主体则客户端会继续发送请求如果服务器响应拒绝继续发送请求主体则客户端会放弃该请求。
custom.setExpectContinueEnabled(elasticsearchEntity.getExpectContinueEnabled());//
URI以便消除多余和重复的斜杠等。
custom.setNormalizeUri(elasticsearchEntity.getNormalizeUri());//
DefaultCookieSpec().toString());return
httpAsyncClientBuilder.setDefaultRequestConfig(custom.build());}
Es操作类CustomElasticsearchSinkFunction
作用实时把数据写入到队列中再通过批量提交到Elasticsearch中实现数据写入
com.alibaba.fastjson.JSONObject;
org.apache.flink.api.common.functions.RuntimeContext;
org.apache.flink.streaming.connectors.elasticsearch.ElasticsearchSinkFunction;
org.apache.flink.streaming.connectors.elasticsearch.RequestIndexer;
org.elasticsearch.action.index.IndexRequest;
org.elasticsearch.client.Requests;
org.elasticsearch.common.xcontent.XContentType;
CustomElasticsearchSinkFunction
ElasticsearchSinkFunctionJSONObject
LoggerFactory.getLogger(CustomElasticsearchSinkFunction.class);private
CustomElasticsearchSinkFunction(ElasticsearchEntity
elasticsearchEntity;}Overridepublic
element.getString(transId);String
element.getString(tradeTime);String
elasticsearchEntity.getIndexPrefix()
tradeTime;logger.info(交易流水{},数据写入索引{}成功,
Requests.indexRequest().index(index).type(elasticsearchEntity.getType()).id(transId).source(element,
XContentType.JSON);indexer.add(indexRequest);}
异常处理类CustomActionRequestFailureHandler
作用当sink写Elasticsearch出现异常时可以自定义操作策略
org.apache.flink.streaming.connectors.elasticsearch.ActionRequestFailureHandler;
org.apache.flink.streaming.connectors.elasticsearch.RequestIndexer;
org.elasticsearch.action.ActionRequest;
org.elasticsearch.common.util.concurrent.EsRejectedExecutionException;
CustomActionRequestFailureHandler
LoggerFactory.getLogger(CustomActionRequestFailureHandler.class);Overridepublic
如果是由于线程池饱和导致的拒绝执行异常可以采取相应的处理措施logger.warn(Elasticsearch
这里你可以选择执行重试或者其他处理逻辑例如将数据写入到一个备用存储//
indexer.add(createAno***rRequest(action));}
对于其他类型的异常默认返回放弃策略logger.error(Unhandled
作业主类ElasticsearchSinkStreamJobAdvancedDemo
com.alibaba.fastjson.JSONObject;
org.apache.flink.api.java.utils.ParameterTool;
org.apache.flink.streaming.api.datastream.DataStreamSource;
org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
org.apache.flink.streaming.api.functions.source.SourceFunction;
org.apache.flink.streaming.connectors.elasticsearch.ElasticsearchSinkFunction;
org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink;
java.time.format.DateTimeFormatter;
ElasticsearchSinkStreamJobAdvancedDemo
LoggerFactory.getLogger(ElasticsearchSinkStreamJobAdvancedDemo.class);public
esClusterHttpHostHandler(elasticsearchEntity);//
创建esSinkFunction函数ElasticsearchSinkFunctionJSONObject
CustomElasticsearchSinkFunction(elasticsearchEntity);//
构建ElasticsearchSink算子builderElasticsearchSink.BuilderJSONObject
ElasticsearchSink.Builder(httpHosts,
es参数配置esBuilderHandler(esSinkBuilder,
构建sink算子ElasticsearchSinkJSONObject
自定义数据源模拟生产环境交易接入,json格式数据SourceFunctionJSONObject
UUID.randomUUID().toString();//交易发生时间戳long
System.currentTimeMillis();//交易发生金额long
Random().nextInt(100);//交易名称String
JSONObject();dataObj.put(transId,
tradeId);dataObj.put(timeStamp,
timeStamp);dataObj.put(tradeTime,
dateUtil(timeStamp));dataObj.put(tradeAmount,
tradeAmount);dataObj.put(tradeName,
tradeName);//模拟生产每隔1秒生成一笔交易Thread.sleep(1000);logger.info(交易接入,原始报文{},
dataObj.toJSONString());sourceContext.collect(dataObj);}}Overridepublic
创建运行环境StreamExecutionEnvironment
StreamExecutionEnvironment.getExecutionEnvironment();//
构建数据源DataStreamSourceJSONObject
构建sink算子dataStreamSource.addSink(esSink);//
E:\\project\\aurora_dev\\aurora_flink_connector_elasticsearch\\src\\main\\resources\\application.properties;ParameterTool
ParameterTool.fromPropertiesFile(propertiesFilePath);ElasticsearchEntity
paramsMap.get(es.cluster.hosts);int
paramsMap.getInt(es.cluster.port);String
paramsMap.get(es.cluster.scheme);String
paramsMap.get(es.cluster.type);String
paramsMap.get(es.cluster.indexPrefix);int
paramsMap.getInt(es.cluster.bulkFlushMaxActions);int
paramsMap.getInt(es.cluster.bulkFlushMaxSizeMb);int
paramsMap.getInt(es.cluster.bulkFlushInterval);boolean
paramsMap.getBoolean(es.cluster.bulkFlushBackoff);int
paramsMap.getInt(es.cluster.bulkFlushBackoffDelay);int
paramsMap.getInt(es.cluster.bulkFlushBackoffRetries);int
paramsMap.getInt(es.cluster.connectTimeout);int
paramsMap.getInt(es.cluster.socketTimeout);int
paramsMap.getInt(es.cluster.connectionRequestTimeout);boolean
paramsMap.getBoolean(es.cluster.redirectsEnabled);int
paramsMap.getInt(es.cluster.maxRedirects);boolean
paramsMap.getBoolean(es.cluster.au***nticationEnabled);boolean
paramsMap.getBoolean(es.cluster.circularRedirectsAllowed);boolean
paramsMap.getBoolean(es.cluster.contentCompressionEnabled);boolean
paramsMap.getBoolean(es.cluster.expectContinueEnabled);boolean
paramsMap.getBoolean(es.cluster.normalizeUri);elasticsearchEntity.setHosts(hosts);elasticsearchEntity.setPort(port);elasticsearchEntity.setScheme(scheme);elasticsearchEntity.setType(type);elasticsearchEntity.setIndexPrefix(indexPrefix);elasticsearchEntity.setBulkFlushMaxActions(bulkFlushMaxActions);elasticsearchEntity.setBulkFlushMaxSizeMb(bulkFlushMaxSizeMb);elasticsearchEntity.setBulkFlushInterval(bulkFlushInterval);elasticsearchEntity.setBulkFlushBackoff(bulkFlushBackoff);elasticsearchEntity.setBulkFlushBackoffDelay(bulkFlushBackoffDelay);elasticsearchEntity.setBulkFlushBackoffRetries(bulkFlushBackoffRetries);elasticsearchEntity.setConnectTimeout(connectTimeout);elasticsearchEntity.setSocketTimeout(socketTimeout);elasticsearchEntity.setConnectionRequestTimeout(connectionRequestTimeout);elasticsearchEntity.setRedirectsEnabled(redirectsEnabled);elasticsearchEntity.setMaxRedirects(maxRedirects);elasticsearchEntity.setAu***nticationEnabled(au***nticationEnabled);elasticsearchEntity.setCircularRedirectsAllowed(circularRedirectsAllowed);elasticsearchEntity.setExpectContinueEnabled(expectContinueEnabled);elasticsearchEntity.setContentCompressionEnabled(contentCompressionEnabled);elasticsearchEntity.setNormalizeUri(normalizeUri);return
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp),
DateTimeFormatter.ofPattern(yyyyMMdd);//
formatter.format(dateTime);return
esBuilderHandler(ElasticsearchSink.BuilderJSONObject
1esSinkBuilder.setBulkFlushMaxActions(elasticsearchEntity.getBulkFlushMaxActions());//
MBesSinkBuilder.setBulkFlushMaxSizeMb(elasticsearchEntity.getBulkFlushMaxSizeMb());//
解释每隔指定的时间间隔无论是否达到最大动作数或最大数据量都会触发批量写入esSinkBuilder.setBulkFlushInterval(elasticsearchEntity.getBulkFlushInterval());//
写入失败时可以启用退避策略以避免频繁的重试。
此时setBulkFlushBackoffDelay
参数生效。
esSinkBuilder.setBulkFlushBackoff(elasticsearchEntity.getBulkFlushBackoff());//
解释在发生写入失败后等待指定的延迟时间后再进行重试esSinkBuilder.setBulkFlushBackoffDelay(elasticsearchEntity.getBulkFlushBackoffDelay());//
解释设置在写入失败后的最大重试次数。
超过这个次数后将不再重试esSinkBuilder.setBulkFlushBackoffRetries(elasticsearchEntity.getBulkFlushBackoffRetries());//
ElasticsearchSinkFunction.FailureHandler
接口esSinkBuilder.setFailureHandler(new
CustomActionRequestFailureHandler());//
ElasticsearchSinkBase.RestClientFactory
接口esSinkBuilder.setRestClientFactory(new
CustomRestClientFactory(elasticsearchEntity));}/***
esClusterHttpHostHandler(ElasticsearchEntity
elasticsearchEntity.getHosts().split(,);for
elasticsearchEntity.getScheme()));}return
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback