H2O外部后端上的帧上载/创建挂起于python/pyspark

H2O外部后端上的帧上载/创建挂起于python/pyspark,pyspark,yarn,h2o,sparkling-water,Pyspark,Yarn,H2o,Sparkling Water,我遇到一个问题,h2o.H2OFrame([1,2,3])命令正在内部后端的h2o中创建一个帧,而不是在外部后端。相反,连接没有终止(正在创建帧,但进程挂起) 似乎没有返回到/3/ParseSetup的帖子(其中urlib3似乎被卡住)。更具体地说,从连接到外部后端的h2o日志来看,一个例子是(我缩短了日期和IP): 相比之下,内部后端完成该调用,日志文件包含: ** 10.*.*.15:54444 2421 #0581-148 INFO: totalBytes: 21 ** 10.*.*.1

我遇到一个问题,
h2o.H2OFrame([1,2,3])
命令正在内部后端的h2o中创建一个帧,而不是在外部后端。相反,连接没有终止(正在创建帧,但进程挂起)

似乎没有返回到
/3/ParseSetup
的帖子(其中
urlib3
似乎被卡住)。更具体地说,从连接到外部后端的h2o日志来看,一个例子是(我缩短了日期和IP):

相比之下,内部后端完成该调用,日志文件包含:

** 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\u frame(frame\u id=“myframe\u id”)
检索帧

我已经尝试/确认了以下事项:

  • 确认与spark版本相关的起泡水版本是正确的(即h2o_pySparking_2.3-适用于spark 2.3.x,如---在我的案例中,起泡水2.3.12-spark 2.3.0.cloudera2所述)
  • 将Sparking water stable下载到集群并运行
    /get-extended-h2o.sh cdh5.14
    ,这给了我
    h2odriver-sw2.3.0-cdh5.14-extended.jar
    jar
  • map reduce作业的各种参数排列。有趣的是,我们的集群非常繁忙,基本端口设置对于稳定性至关重要。此外,我们的子网跨越开关,这会造成多播的混乱。最终,以下参数毫无疑问地提出了后端:
  • 确认我可以查询后端,因为
    h2o.ls()
    works
  • 上载了spark数据帧而不是普通列表(同一问题):
从纱线的角度来看,我尝试了简单测试应用程序的客户端和集群模式提交:

spark2-submit --master yarn --deploy-mode cluster --queue root.users.myuser --conf 'spark.ext.h2o.client.port.base=65656' extreboot.py
对于默认客户端模式,不使用
--主纱线
--部署模式群集

最后,
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')

有人知道它为什么会挂起(与内部后端相比)、我做错了什么,或者我可以采取哪些步骤来更好地调试它吗?谢谢

我建议升级到最新版本的Sparking Water(目前为
2.3.26
并可用),因为您使用的是
2.3.12
,并且自那时以来已经有多个悬而未决的问题得到了修复。希望快速升级可以解决您的问题

    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)
spark2-submit --master yarn --deploy-mode cluster --queue root.users.myuser --conf 'spark.ext.h2o.client.port.base=65656' 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')