Flink Sql on Hiveの作成で発生した落とし穴と最適化(継続的な更新...)

1、HiveSource-xxxx.xxxxの並列処理(200)は、最大並列処理(128)よりも高くなっています。並列処理を下げるか、最大並列処理を増やしてください。

(1)エラーを報告する

これは、ハイブに接続してテーブルをチェックするためにsql-cliによって報告されたエラーです。

[ERROR] Could not execute SQL statement. Reason:
org.apache.flink.runtime.JobException: Vertex Source: HiveSource-xxxx.xxxx's parallelism (200) is higher than the max parallelism (128). Please lower the parallelism or increase the max parallelism.

(2)解決策

flinkパッケージの下の/ confパッケージにあるファイルsql-client-defaults.yamlのmax-parallelismを300に変更するだけです。

execution:
  max-parallelism: 300 

2. table.exec.hive.fallback-mapred-reader:trueを手動で構成して、flinksqlがハイブテーブルを読み取るときに有効にすることをお勧めします。

(1)エラーを報告する

sql-cliを使用するか、コードにsqlを挿入するかに関係なく、次のsqlを実行すると次の結果になり、すべてのエラーは次の原因で報告されます:java.lang.IllegalArgumentException。

そして、SparkSqlを使用して次のSQLを実行します。

(1)First:
SELECT vid From table_A WHERE datekey = '20210112' AND event = 'XXX' AND vid = 'aaaaaa';   (**OK**)
SELECT vid From table_A WHERE datekey = '20210112' AND vid = 'aaaaaa';                     (**Error**)

(2)Second:
SELECT vid From table_B WHERE datekey = '20210112' AND event = 'YYY' AND vid = 'bbbbbb';   (**OK**)
SELECT vid From table_B WHERE datekey = '20210112' AND vid = 'bbbbbb';                     (**Error**)

元のエラー:

[ERROR] Could not execute SQL statement. Reason:
java.lang.RuntimeException: SplitFetcher thread 22 received unexpected exception while polling the records


java.lang.RuntimeException: One or more fetchers have encountered exception
  at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcherManager.checkErrors(SplitFetcherManager.java:199)
  at org.apache.flink.connector.base.source.reader.SourceReaderBase.getNextFetch(SourceReaderBase.java:154)
  at org.apache.flink.connector.base.source.reader.SourceReaderBase.pollNext(SourceReaderBase.java:116)
  at org.apache.flink.streaming.api.operators.SourceOperator.emitNext(SourceOperator.java:273)
  at org.apache.flink.streaming.runtime.io.StreamTaskSourceInput.emitNext(StreamTaskSourceInput.java:67)
  at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65)
  at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:395)
  at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:191)
  at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:609)
  at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:573)
  at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:755)
  at org.apache.flink.runtime.taskmanager.Task.run(Task.java:570)
  at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: SplitFetcher thread 22 received unexpected exception while polling the records
  at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.runOnce(SplitFetcher.java:146)
  at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.run(SplitFetcher.java:101)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  ... 1 more
Caused by: java.lang.IllegalArgumentException
  at java.nio.Buffer.position(Buffer.java:244)
  at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:153)
  at java.nio.ByteBuffer.get(ByteBuffer.java:715)
  at org.apache.flink.hive.shaded.parquet.io.api.Binary$ByteBufferBackedBinary.getBytes(Binary.java:422)
  at org.apache.flink.hive.shaded.formats.parquet.vector.reader.BytesColumnReader.readBatchFromDictionaryIds(BytesColumnReader.java:79)
  at org.apache.flink.hive.shaded.formats.parquet.vector.reader.BytesColumnReader.readBatchFromDictionaryIds(BytesColumnReader.java:33)
  at org.apache.flink.hive.shaded.formats.parquet.vector.reader.AbstractColumnReader.readToVector(AbstractColumnReader.java:199)
  at org.apache.flink.hive.shaded.formats.parquet.ParquetVectorizedInputFormat$ParquetReader.nextBatch(ParquetVectorizedInputFormat.java:359)
  at org.apache.flink.hive.shaded.formats.parquet.ParquetVectorizedInputFormat$ParquetReader.readBatch(ParquetVectorizedInputFormat.java:328)
  at org.apache.flink.connector.file.src.impl.FileSourceSplitReader.fetch(FileSourceSplitReader.java:67)
  at org.apache.flink.connector.base.source.reader.fetcher.FetchTask.run(FetchTask.java:56)
  at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.runOnce(SplitFetcher.java:138)
  ... 6 more

(2)解決策

昨日私は問題を提出しました:https//issues.apache.org/jira/browse/FLINK-20951、YunxieはRuiLiに助けて見てもらうように頼みました。table.exec.hive.fallback-mapred-readerを設定する必要があります:本当。

昨日公式サイトをチェックしてこの設定を見ましたが、公式文書にはデフォルトで有効になっているとのことなので、手動で設定することをお勧めします。公式ウェブサイトでの説明によると、この構成を開始すると、FormatがORCまたはParquetタイプであり、複雑なタイプのハイブがない場合に、ハイブテーブルのベクトル化された読み取りが可能になります。
公式ウェブサイトのリンク:https//ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/connectors/hive/hive_read_write.html#vectorized-optimization-upon-read

a。sql-cliを使用して、flinkパッケージの下の/ confパッケージにあるsql-client-defaults.yamlファイルを構成します。

configuration:
  table.exec.hive.fallback-mapred-reader: true

b。コードでflinksqlを送信する場合は、次のように構成を構成します。

Configuration configuration = tableEnv.getConfig().getConfiguration();
configuration.setString("table.exec.hive.fallback-mapred-reader", "true");

3.ハイブテーブルに多数のパーティションがある場合、flinkのデフォルト構成は、多数のタスクマネージャーをオンにするのに役立ちます

(1)エラーを報告する

一度に1000が割り当てられているのがわかりますが、それを見てショックを受けました

画像

(2)解決策

公式ウェブサイトを見ると、Flinkはファイル数と各ファイルのブロック数に基づいてHiveリーダーに最適な並列処理を推測することがわかりましたが、現時点ではあまり良くないようです。

この構成をオフにして、独自のタスクに従って構成できます(このパラメーターは、すべてのハイブジョブに影響します。タスクを開始する前に、コードで適切な並列処理設定を開始することをお勧めします。または、sql-cliをsql-client-defaultsにすることもできます。 .yaml構成)

configuration.setString("table.exec.hive.infer-source-parallelism.max", "100");
configuration.setString("table.exec.hive.fallback-mapred-reader", "true");

継続的に更新…

おすすめ

転載: blog.csdn.net/weixin_44500374/article/details/112610629