返回信息流update: 通过查看任务的日志,已查明是 hive 和 spark 的兼容性太差,hive on spark 跑不起来,把 execution engine 换成默认的就 ok 了。而且我正文中提到的查询超时,实际并不是 spark 任务跑的时间长导致查询超时,实际上 spark 任务在开始后不久就已经 failed 了。
出错的具体原因是抛出了以下异常:
```
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:65)
at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)
Caused by: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:48)
at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:138)
at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:536)
... 6 more
2020-03-04 15:43:55,745 INFO util.ShutdownHookManager: Shutdown hook called
2020-03-04 15:43:55,745 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-204d5332-e495-49f0-a75e-9cc0fa8efd5c
```
Reference: https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
================================
数据是通过 spark 写入到 hive 中的,有 5 个分区,总大小大约 2G。
hive 配置的执行引擎是 spark。
然后执行查询 `SELECT srcip from waf_log where dstip = 10.0.0.1`,执行到查询超时也跑不出结果:
```
0: jdbc:hive2://spark1:10 (waf)> select srcip from waf_log where dstip = '10.0.0.1';
DEBUG : Acquired the compile lock.
INFO : Compiling command(queryId=20200304151659_e3601712-378b-4dd6-828d-f67efb6760d9): select srcip from waf_log where dstip = '10.0.0.1'
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : No Stats for waf@waf_log, Columns: dstip
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:srcip, type:string, comment:null)], properties:null)
INFO : Completed compiling command(queryId=20200304151659_e3601712-378b-4dd6-828d-f67efb6760d9); Time taken: 1.482 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Executing command(queryId=20200304151659_e3601712-378b-4dd6-828d-f67efb6760d9): select srcip from waf_log where dstip = '10.0.0.1'
INFO : Query ID = 20200304151659_e3601712-378b-4dd6-828d-f67efb6760d9
INFO : Total jobs = 1
INFO : Launching Job 1 out of 1
INFO : Starting task [Stage-1:MAPRED] in parallel
ERROR : FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed to create Spark client for Spark session 07219d88-14d8-4c13-8f79-06e1aa4f1911
DEBUG : Shutting down query select srcip from waf_log where dstip = '10.0.0.1'
INFO : Completed executing command(queryId=20200304151659_e3601712-378b-4dd6-828d-f67efb6760d9); Time taken: 302.029 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
DEBUG : Shutting down query select srcip from waf_log where dstip = '10.0.0.1'
Error: Error while processing statement: FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed to create Spark client for Spark session 07219d88-14d8-4c13-8f79-06e1aa4f1911 (state=42000,code=30041)
```
hive-site.xml:
```
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://spark1:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>spark.home</name>
<value>/data/spark-2.4.5-bin-hadoop2.7</value>
</property>
<property>
<name>spark.master</name>
<value>spark://spark1:7077</value>
</property>
<property>
<name>spark.executor.instances</name>
<value>8</value>
</property>
<property>
<name>spark.executor.memory</name>
<value>2048m</value>
</property>
<property>
<name>spark.executor.cores</name>
<value>4</value>
</property>
<property>
<name>spark.driver.memory</name>
<value>4096m</value>
</property>
<property>
<name>hive.spark.client.connect.timeout</name>
<value>30000ms</value>
</property>
<property>
<name>hive.spark.client.server.connect.timeout</name>
<value>300000ms</value>
</property>
<property>
<name>spark.yarn.jars</name>
<value>hdfs://spark1:9000/spark-jars</value>
</property>
<property>
<name>hive.exec.parallel</name>
<value>true</value>
</property>
<property>
<name>hive.exec.parallel.thread.number</name>
<value>16</value>
</property>
</configuration>
```
hive 的日志中最后是报了一个 `java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: Timed out waiting for client connection.`,应该是查询时间超时导致客户端断开了连接。
应该怎样优化呢?并且一般来说,hive 查询 2G 左右数据的话大概花费多长时间呢?
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #36306同步于 2020/3/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
Hive on spark,2G 数据查询速度非常慢(已查明,问题出在 spar
nitroethane
2020/3/4镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
感谢回复。已经查明是 spark 作为 hive 的 executiion engine 的话还有很多兼容性问题,导致任务总是失败。
【 在 chinapds 的大作中提到: 】
: Failed to create Spark client
: 集群资源不够吧,2g数据的话,时间应该基本都是任务启动、资源申请,计算应该很快。
换成 Hadoop 之后,跑 `SELECT COUNT(*) FROM waf_log` 的话是 25 秒的执行时间,420 万条数据。这个是不是还是有点慢啊
【 在 chinapds 的大作中提到: 】
: Failed to create Spark client
: 集群资源不够吧,2g数据的话,时间应该基本都是任务启动、资源申请,计算应该很快。
hive速度是这么慢的。要快的话可以用impala,presto等
【 在 nitroethane 的大作中提到: 】
: : 换成 Hadoop 之后,跑 `SELECT COUNT(*) FROM waf_log` 的话是 25 秒的执行时间,420 万条数据。这个是不是还是有点慢啊
:
感谢回复。目前在做的项目对查询效率没有要求,我只是好奇 Hive 的查询效率,因为网上搜了一圈没有具体的数据。
因为业务需求,目前刚上手 Spark、Hadoop 这一套,正在慢慢探索中,后续有时间的话可以尝试一下您说的这两个项目
【 在 BackTo2711 的大作中提到: 】
: hive速度是这么慢的。要快的话可以用impala,presto等
spark 没问题的,我这里查的数据就是从 spark 里跑出来的。报错是因为我把 spark 作为 hive 的 execution engine 的话还存在一些问题,应该是我没有设置正确。从日志里抓到的报错信息是抛出了个异常:
```
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:65)
at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)
Caused by: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:48)
at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:138)
at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:536)
... 6 more
2020-03-04 15:43:55,745 INFO util.ShutdownHookManager: Shutdown hook called
2020-03-04 15:43:55,745 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-204d5332-e495-49f0-a75e-9cc0fa8efd5c
```
Google 了一下这个报错,发现是 hive 和 spark 的兼容性问题,试了下 stack overflow 上的解决方法还是没有解决,于是又用回 Hadoop 了。
之于用 spark 作为 execution engine 的原因,是基于 spark 是用来代替 Hadoop 的宣传,所以想试一下到底比 Hadoop 快多少。用 Hadoop 也有启动时间。
【 在 qimengxk 的大作中提到: 】
: 没配置好啊,spark都没起来呢.报错了啊