我遇到了一个问题,即命令在内部后端h2o.H2OFrame([1,2,3])
的 h2o 中创建一个框架,但不是在外部后端。相反,连接并未终止(正在创建框架,但进程挂起)。
看起来帖子/3/ParseSetup
没有返回(urllib3
似乎卡住了)。更具体地说,从与外部后端连接的 h2o 日志中,一个例子是(我缩短了日期和 IP):
* 10.*.*.15:56565 8120 #7003-141 INFO: Reading byte InputStream into Frame:
* 10.*.*.15:56565 8120 #7003-141 INFO: frameKey: upload_8a440dcf457c1e5deacf76a7ac1a4955
* 10.*.*.15:56565 8120 #7003-141 DEBUG: write-lock upload_8a440dcf457c1e5deacf76a7ac1a4955 by job null
* 10.*.*.15:56565 8120 #7003-141 INFO: totalChunks: 1
* 10.*.*.15:56565 8120 #7003-141 INFO: totalBytes: 21
* 10.*.*.15:56565 8120 #7003-141 DEBUG: unlock upload_8a440dcf457c1e5deacf76a7ac1a4955 by job null
* 10.*.*.15:56565 8120 #7003-141 INFO: Success.
* 10.*.*.15:56565 8120 #7003-135 INFO: POST /3/ParseSetup, parms: {source_frames=["upload_8a440dcf457c1e5deacf76a7ac1a4955"], check_header=1, separator=44}
相比之下,内部后端完成了该调用,日志文件包含:
** 10.*.*.15:54444 2421 #0581-148 INFO: totalBytes: 21
** 10.*.*.15:54444 2421 #0581-148 INFO: Success.
** 10.*.*.15:54444 2421 #0581-149 INFO: POST /3/ParseSetup, parms: {source_frames=["upload_b985730020211f576ef75143ce0e43f2"], check_header=1, separator=44}
** 10.*.*.15:54444 2421 #0581-150 INFO: POST /3/Parse, parms: {number_columns=1, source_frames=["upload_b985730020211f576ef75143ce0e43f2"], column_types=["Numeric"], single_quotes=False, parse_type=CSV, destination_frame=Key_Frame__upload_b985730020211f576ef75143ce0e43f2.hex, column_names=["C1"], delete_on_done=True, check_header=1, separator=44, blocking=False, chunk_size=4194304}
...
发生的锁存在差异by job null
,但它被释放了,所以我怀疑这不是一个关键问题。我在两个后端都未能成功地卷曲该端点,并且正在查看源代码以确定原因。
尽管有挂起过程,但我能够查看上传的框架正在运行h2o.ls()
,并且我能够h2o.get_frame(frame_id="myframe_id")
在外部后端使用框架来检索框架。
我已经尝试/确认了以下事项:
- 确认苏打水版本相对于 spark 版本是正确的(即 h2o_pysparkling_2.3 - 对于 Spark 2.3.x,如docs.h2o.ai中所述--- 在我的情况下苏打水 2.3.12 - Spark 2.3。 0.cloudera2);
- 将苏打水稳定下载到集群并运行
./get-extended-h2o.sh cdh5.14
,这给了我h2odriver-sw2.3.0-cdh5.14-extended.jar
罐子; - map reduce作业的各种参数排列。有趣的是,我们的集群非常繁忙,基本端口设置对于稳定性至关重要。此外,我们的子网跨越了与多播混淆的交换机。最终,以下论点成功地提出了后端:
hadoop jar h2odriver-sw2.3.0-cdh5.14-extended.jar -Dmapreduce.job.queuename=root.users.myuser -jobname extback -baseport 56565 -nodes 10 -mapperXmx 10g -network 10.*.*.0/24
- 确认我可以查询后端,因为
h2o.ls()
工作; - 上传了 spark 数据框而不是普通列表(同样的问题):
sdf = session.createDataFrame([
('a', 1, 1.0), ('b', 2, 2.0)],
schema=StructType([StructField("string", StringType()),
StructField("int", IntegerType()),
StructField("float", FloatType())]))
hc.as_h2o_frame(sdf)
从 YARN 的角度来看,我尝试了简单测试应用程序的客户端和集群模式提交:
spark2-submit --master yarn --deploy-mode cluster --queue root.users.myuser --conf 'spark.ext.h2o.client.port.base=65656' extreboot.py
并且没有--master yarn
和--deploy-mode cluster
默认客户端模式。
最后,extreboot.py
代码是:
from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
from pysparkling import *
import h2o
conf = SparkConf().setAll([
('spark.ext.h2o.client.verbose', True),
('spark.ext.h2o.client.log.level', 'DEBUG'),
('spark.ext.h2o.node.log.level', 'DEBUG'),
('spark.ext.h2o.client.port.base', '56565'),
('spark.driver.memory','8g'),
('spark.ext.h2o.backend.cluster.mode', 'external')])
session = SparkSession.builder.config(conf=conf).getOrCreate()
ip_addr='10.10.10.10'
port=56565
conf = H2OConf(session).set_external_cluster_mode().use_manual_cluster_start().set_h2o_cluster(ip_addr, port).set_cloud_name("extback")
hc = H2OContext.getOrCreate(session, conf)
print(h2o.ls())
h2o.H2OFrame([1,2,3])
print('DONE')
有谁知道它为什么会挂起(与内部后端相比),我做错了什么,或者我可以采取哪些步骤来更好地调试它?谢谢!