Yarn application has already exited with state FINISHED!

当使用 Spark SQL 遇到 YARN 应用提前退出的错误时,这通常与 yarn-site.xml 中的 yarn.nodemanager.vmem-pmem-ratio 设置有关。该配置的默认值为2.1,若遇到上述错误,建议增大此比例值进行尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大一点再试。

ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state FINISHED!

16/10/13 10:23:19 ERROR client.TransportClient: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

java.nio.channels.ClosedChannelException

16/10/13 10:23:19 ERROR cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Sending RequestExecutors(0,0,Map()) to AM was unsuccessful

java.io.IOException: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

        at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:249)

        at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:233)

        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680)

        at io.netty.util.concurrent.DefaultPromise$LateListeners.run(DefaultPromise.java:845)

        at io.netty.util.concurrent.DefaultPromise$LateListenerNotifier.run(DefaultPromise.java:873)

        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)

        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)

        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)

        at java.lang.Thread.run(Thread.java:745)

### Python YARN 应用程序示例 在 Hadoop 的生态系统中,YARN 是一种资源管理框架,允许不同的分布式计算框架共享同一集群中的资源。对于基于 Python 开发的应用程序来说,可以通过 `pyarrow` 或者直接利用 Spark 提交机制来实现与 YARN 的交互。 以下是几个常见的 Python 编写的 YARN 应用程序示例: #### 示例 1: 使用 PySpark 提交给 YARN 运行 PySpark 可以轻松地将 Python 脚本提交到 YARN 上运行。以下是一个简单的 Word Count 实现并将其部署至 YARN: ```python from pyspark import SparkConf, SparkContext if __name__ == "__main__": conf = SparkConf().setAppName("WordCountApp").setMaster("yarn") \ .set("spark.executor.instances", "3") \ .set("spark.executor.memory", "2g") \ .set("spark.executor.cores", "2") sc = SparkContext(conf=conf) text_file = sc.textFile("hdfs:///input.txt") counts = text_file.flatMap(lambda line: line.split()) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) counts.saveAsTextFile("hdfs:///output_word_count") ``` 此脚本通过设置 `setMaster("yarn")` 将应用提交到 YARN 并分配必要的资源配置[^1]。 要运行上述代码,可以使用如下命令: ```bash spark-submit --master yarn --deploy-mode cluster word_count.py ``` --- #### 示例 2: 使用 pyflink 提交 Flink Job 到 YARN Flink 支持通过 Python API (`pyflink`) 来编写数据处理逻辑并将作业提交到 YARN 执行。下面展示了一个基本的批处理任务例子: ```python from pyflink.datastream import StreamExecutionEnvironment from pyflink.table import StreamTableEnvironment, EnvironmentSettings def main(): env = StreamExecutionEnvironment.get_execution_environment() settings = EnvironmentSettings.new_instance()\ .in_streaming_mode()\ .use_blink_planner()\ .build() t_env = StreamTableEnvironment.create(env, settings) # 设置默认并行度 t_env.get_config().get_configuration().set_string("parallelism.default", "3") source_ddl = """ CREATE TABLE input_table ( id BIGINT, data STRING ) WITH ( 'connector' = 'filesystem', 'path' = 'hdfs:///input_data/', 'format' = 'csv' ) """ sink_ddl = """ CREATE TABLE output_table ( id BIGINT, processed_data STRING ) WITH ( 'connector' = 'filesystem', 'path' = 'hdfs:///processed_output/', 'format' = 'csv' ) """ t_env.execute_sql(source_ddl) t_env.execute_sql(sink_ddl) t_env.from_path("input_table") \ .select("id, LOWER(data) as processed_data") \ .insert_into("output_table") t_env.execute("Process Data with Flink on YARN") if __name__ == '__main__': main() ``` 该脚本可通过以下命令提交到 YARN: ```bash ./bin/flink run-application -t yarn-application \ -Dparallelism.default=3 \ -Djobmanager.memory.process.size=1024m \ -Dtaskmanager.memory.process.size=1024m \ -Dyarn.application.name="MyFlinkJob" \ -Dtaskmanager.numberOfTaskSlots=3 \ /examples/batch/your_python_script.py ``` --- #### 示例 3: 自定义 Python YARN Client 如果需要完全控制 YARN 集群上的任务调度过程,也可以开发自定义的 Python 客户端。这通常涉及使用 RESTful 接口或者 Apache Slider 工具包。例如,创建一个简单的 HTTP 请求向 YARN ResourceManager 发送请求: ```python import requests import json def submit_yarn_job(app_name, queue_name, container_memory): url = "http://<resourcemanager-host>:8088/ws/v1/cluster/apps/new-application" response = requests.post(url) app_id = response.json()["application-id"] submission_url = f"http://<resourcemanager-host>:8088/ws/v1/cluster/apps" job_spec = { "application-id": app_id, "application-name": app_name, "queue": queue_name, "am-container-spec": { "commands": {"command": "/usr/bin/python your_script.py"}, "local-resources": {}, "environment": {} }, "max-app-attempts": 2, "resource": {"memory": str(container_memory), "vCores": 1}, "unmanaged-AM": False } headers = {'Content-Type': 'application/json'} res = requests.put(submission_url, data=json.dumps(job_spec), headers=headers) return res.status_code, res.text status, message = submit_yarn_job("TestPythonApp", "default", 512) print(f"Submission Status: {status}, Message: {message}") ``` 注意:以上方法依赖于具体环境配置以及 ResourceManager 是否开放了 WebService 接口[^4]。 --- #### 注意事项 - 当前大多数场景下推荐优先考虑使用成熟的框架如 Spark 或 Flink,它们已经内置良好的支持用于简化复杂操作。 - 如果采用原生方式构建 Python-YARN 应用,则需额外关注兼容性和错误恢复等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值