FLINK作业提交方式

Flink作业提交的方式分为application模式,per-job模式和session模式。

1.per-job模式

在Yarn创建一个Flink集群,然后在提交任务客户端所在机器本地运行作业jar的main方法,提交生成的JobGraph到Flink集群的JobManager。如果附带--detached参数,提交的作业被accept的时候,客户端会停止运行(命令行不用一直开着,生产环境必须。开发测试时可不带--detached参数,通过命令行查看运行日志)。

实际生产中推荐使用此模式。每个作业都使用单独的Flink集群,它们消耗的资源是互相隔离的,一个作业的崩溃不会影响到其他作业。

flink run -t yarn-per-job --detached /path/to/job.jar

2.session模式

首先启动Flink Yarn Session,它是一个常驻与Yarn的Flink集群。启动成功后,无论是否有作业执行,或者作业是否执行完毕,该session始终保持运行。启动yarn session的方法如下:

export HADOOP_CLASSPATH=`hadoop classpath` ./bin/yarn-session.sh --detached

yarn-session支持的相关参数解释:

  • -d/--detached: Detach模式,session启动成功后client停止运行。不用保持控制台一直开启。
  • -nm: Application名称
  • -jm: Job Manager 容器的内存
  • -tm: Task Manager 容器的内存
  • -t: 传送文件至集群,使用相对路径。程序中读取文件仍使用相对路径
  • -qu: 指定使用的Yarn队列   

提交作业到Yarn session:

<think>好的,我现在需要解决用户提交Flink作业时出现的中文乱码问题。首先,用户提到的引用中,引用[1]提到了StreamingFileSink的常见问题,包括中文乱码。这可能和文件编码有关。那我应该从编码设置方面入手。 首先,检查作业的字符编码设置。Flink默认可能使用UTF-8,但如果环境或数据源不是UTF-8,就可能出现乱码。用户需要确认所有环节的编码一致,比如在代码中明确指定编码为UTF-8,特别是在处理数据源和输出的时候。例如,在使用StreamingFileSink时,设置编码参数。 然后,环境变量也是一个可能的原因。用户可能需要检查服务器和Flink集群的系统编码,确保都是UTF-8。可以通过设置JVM参数,比如-Dfile.encoding=UTF-8来强制使用UTF-8编码。 另外,数据源本身的编码是否正确?比如Kafka或者文件源,如果数据源的编码不是UTF-8,需要在读取时进行转换。用户可能需要配置反序列化器,指定正确的字符集。 还有,操作系统或终端的编码设置是否正确?如果用户通过终端提交作业,终端的编码如果不是UTF-8,也可能导致乱码。需要检查LANG环境变量,设置为en_US.UTF-8或类似的值。 最后,日志输出是否有乱码?这可能是日志框架的编码问题,检查log4j或logback的配置文件,确保输出编码为UTF-8。 需要将这些可能的解决方案整理成步骤,并给出具体的配置示例,比如修改flink-conf.yaml,添加JVM参数,或者在代码中指定编码。同时,用户可能需要参考引用中的StreamingFileSink部分,确保文件输出的编码正确设置。</think>### Flink作业提交中文乱码解决方案 #### 1. 确认系统环境编码 - **检查服务器和Flink集群的系统编码** 在Linux系统中执行以下命令查看当前编码设置: ```bash echo $LANG locale ``` 确保输出包含`UTF-8`(如`en_US.UTF-8`或`zh_CN.UTF-8`)。 若未配置UTF-8,通过以下命令临时设置: ```bash export LANG="en_US.UTF-8" ``` #### 2. 配置Flink JVM编码参数 - **在`flink-conf.yaml`中添加JVM编码参数** 修改Flink配置文件`conf/flink-conf.yaml`,添加以下参数强制使用UTF-8编码: ```yaml env.java.opts: -Dfile.encoding=UTF-8 ``` #### 3. 代码中显式指定字符集 - **数据读取/写入时指定编码** 在数据源读取、算子处理和数据输出环节,强制使用`UTF-8`编码。例如: ```java // 示例:读取Kafka数据时指定反序列化编码 properties.setProperty("key.deserializer.encoding", "UTF-8"); properties.setProperty("value.deserializer.encoding", "UTF-8"); // 示例:使用StreamingFileSink时指定编码(参考引用[1]) StreamingFileSink<String> sink = StreamingFileSink .forRowFormat(new Path(outputPath), new SimpleStringEncoder<String>("UTF-8")) .build(); ``` #### 4. 检查文件存储编码格式 - **输出文件编码一致性验证** 若输出到HDFS或本地文件系统,使用`file -i <文件名>`命令检查文件编码是否为`charset=utf-8`。若不一致,需在写入时通过`SimpleStringEncoder`指定编码(如步骤3所示)。 #### 5. 终端/客户端工具适配 - **确保提交作业的终端使用UTF-8** Windows用户需将终端(如PowerShell、CMD)的编码改为UTF-8: ```powershell chcp 65001 # 切换为UTF-8代码页 ``` #### 6. 日志编码配置 - **修改Flink日志配置文件** 检查`conf/log4j.properties`或`logback.xml`,确保日志输出编码为UTF-8: ```properties # log4j示例 log4j.appender.file.encoding=UTF-8 ``` --- ### 验证步骤 1. 在代码中添加测试输出:`System.out.println("中文测试");` 2. 提交作业后查看TaskManager日志,确认中文正常显示。 3. 若输出文件包含中文,检查文件内容编码是否一致。 --- ### 常见问题补充 - **Flink SQL表定义中的字段注释乱码**:在DDL语句中显式指定编码,例如: ```sql CREATE TABLE my_table ( user_name STRING COMMENT '用户名' WITH ('encoding' = 'UTF-8') ) WITH (...); ``` 参考引用[2]中关于StreamingFileSink的API配置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值