exchange 如何导入hive数据问题

为了更快地定位、解决问题,麻烦参考下面模版提问 ^ ^

提问参考模版:

  • nebula 版本:nightly
  • 部署方式(分布式 / 单机 / Docker / DBaaS):docker
  • 硬件信息
    • 磁盘(SSD / HDD):SSD
    • CPU、内存信息:
  • 出问题的 Space 的创建方式:执行 describe space xxx;
  • 问题的具体描述

我们线上hive版本3 hadoop版本3;为了兼容hadoop spark版本应该安装3
而exchange目前不支持spark3,数据通过exchange导入nebula要用什么方式导入能避免刚才说的版本问题? hive,hdfs,sst?

我在mac电脑上验证过了通过 hive2导入到nebula nightly,在mac电脑上 没有验证没有通过hive3导入数据到nebula nightly

这个是我之前的发帖:exchange执行从hive导入数据报错

想要使用spark3 导入数据,可以自己改造下:

  1. 将exchange的pom中spark版本和scala版本改为3.0.0
  2. 编译(已验证,可以编译通过)
  3. 保证环境中scala版本和exchange中的scala版本一致。
    然后尝试下导入。

如果走通了可以贡献下spark3的exchange呀

1 个赞

这个可以作为备选项,除了这个方案 还有其他的建议吗?(我不确定 能不能搞定)

还有个方法:

  1. 安装一个2.4的spark环境。
  2. 改动exchange中spark的配置,配上hive数据源,具体配置参考:
sparkConf.set("spark.sql.warehouse.dir", "hdfs://HOSTNAME:9000/apps/svr/hive-0.13.1-cdh5.3.2/warehouse/");

sparkConf.set("javax.jdo.option.ConnectionURL", "jdbc:mysql://10.199.244.19:3306/hive_spark?characterEncoding=UTF-8")
         .set("javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver")
         .set("javax.jdo.option.ConnectionUserName", "user")
         .set("javax.jdo.option.ConnectionPassword", "password");

3. 在该环境下执行exchange。
1 个赞

这个在配置文件里面配置吗?

不是,在exchange这个包的 com.vesoft.nebula.tools.importer.Exchange文件中:

修改下面代码:

val session = SparkSession
      .builder()
      .appName(PROGRAM_NAME)
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .config("spark.sql.shuffle.partitions", "1")
      .config(
        new SparkConf()
          .registerKryoClasses(
            Array(
              classOf[com.facebook.thrift.async.TAsyncClientManager]
            )))

修改为:

    val sparkConf = new SparkConf()
    sparkConf.registerKryoClasses(Array(classOf[com.facebook.thrift.async.TAsyncClientManager]))
    sparkConf.set("spark.sql.warehouse.dir", "hdfs://HOSTNAME:9000/apps/svr/hive-0.13.1-cdh5.3.2/warehouse/")
    sparkConf
      .set("javax.jdo.option.ConnectionURL", "jdbc:mysql://your_ip:3306/hive_spark?characterEncoding=UTF-8")
      .set("javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver")
      .set("javax.jdo.option.ConnectionUserName", "user")
      .set("javax.jdo.option.ConnectionPassword", "password")
    val session = SparkSession
      .builder()
      .master("local")
      .appName(PROGRAM_NAME)
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .config("spark.sql.shuffle.partitions", "1")
      .config(sparkConf)
1 个赞

我刚才试了一下 成功 用spark2 从hive 3中导入数据到nebula
目前 已经验证 spark3 从hive3中导入数据到nebula
谢谢

@Amber 请小姐姐记录一下

2 个赞

@shawdan

:ok_hand: 安排上了~

刚才发现 之前描述的有问题(exchange 还不支持spark3,编译后运行报错,所以没法验证spark3环境)

已经验证:
用spark2.4 从hive2(hadoop2)中导入数据到nebula
用spark2.4 从hive3(hadoop3)中导入数据到nebula
@shawdan @Amber

3 个赞