H2O外部后端上的帧上传/创建从python / pyspark挂起

时间:2019-03-16 11:53:02

标签: pyspark yarn h2o sparkling-water

我遇到一个问题,其中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罐子;
  • 地图的各种参数排列减少了工作量。有趣的是,我们的集群非常繁忙,基本端口设置对于稳定性至关重要。同样,我们的子网跨越了与多播混乱的交换机。最终,以下论点成功提出了后端:
    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')

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

1 个答案:

答案 0 :(得分:1)

我建议您升级到最新版本的苏打水(当前为2.3.26,并可以使用here),因为您正在使用2.3.12,并且此后已针对挂起问题进行了多项修复。希望快速升级可以解决您的问题。