Flink SQL 1.11 on Zeppelin集成指南

前言

大數據領域SQL化開發的風潮方興未艾(所謂"Everybody knows SQL"),Flink自然也不能“免俗”。Flink SQL是Flink系統內部最高級別的API,也是流批一體思想的集大成者。用戶可以通過簡單明瞭的SQL語句像查表一樣執行流任務或批任務,屏蔽了底層DataStream/DataSet API的複雜細節,降低了使用門檻。

但是,Flink SQL的默認開發方式是通過Java/Scala API編寫,與純SQL化、平臺化的目標相去甚遠。目前官方提供的Flink SQL Client僅能在配備Flink客戶端的本地使用,侷限性很大。而Ververica開源的Flink SQL Gateway組件是基於REST API的,仍然需要二次開發才能供給上層使用,並不是很方便。

鑑於有很多企業都無法配備專門的團隊來解決Flink SQL平臺化的問題,那麼到底有沒有一個開源的、開箱即用的、功能相對完善的組件呢?答案就是本文的主角——Apache Zeppelin。

Flink SQL on Zeppelin!

Zeppelin是基於Web的交互式數據分析筆記本,支持SQL、Scala、Python等語言。Zeppelin通過插件化的Interpreter(解釋器)來解析用戶提交的代碼,並將其轉化到對應的後端(計算框架、數據庫等)執行,靈活性很高。其架構簡圖如下所示。

Flink Interpreter就是Zeppelin原生支持的衆多Interpreters之一。只要配置好Flink Interpreter以及相關的執行環境,我們就可以將Zeppelin用作Flink SQL作業的開發平臺了(當然,Scala和Python也是沒問題的)。接下來本文就逐步介紹Flink on Zeppelin的集成方法。

配置Zeppelin

目前Zeppelin的最新版本是0.9.0-preview2,可以在官網下載包含所有Interpreters的zeppelin-0.9.0-preview2-bin-all.tgz,並解壓到服務器的合適位置。

接下來進入conf目錄。將環境配置文件zeppelin-env.sh.template更名爲zeppelin-env.sh,並修改:

# JDK目錄
export JAVA_HOME=/opt/jdk1.8.0_172
# 方便之後配置Interpreter on YARN模式。注意必須安裝Hadoop,且hadoop必須配置在系統環境變量PATH中
export USE_HADOOP=true
# Hadoop配置文件目錄
export HADOOP_CONF_DIR=/etc/hadoop/hadoop-conf

將服務配置文件zeppelin-site.xml.template更名爲zeppelin-site.xml,並修改:

<!-- 服務地址。默認爲127.0.0.1,改爲0.0.0.0使得可以在外部訪問 -->
<property>
  <name>zeppelin.server.addr</name>
  <value>0.0.0.0</value>
  <description>Server binding address</description>
</property>

<!-- 服務端口。默認爲8080,如果已佔用,可以修改之 -->
<property>
  <name>zeppelin.server.port</name>
  <value>18080</value>
  <description>Server port.</description>
</property>

最基礎的配置就完成了。運行bin/zeppelin-daemon.sh start命令,返回Zeppelin start [ OK ]的提示之後,訪問<服務器地址>:18080,出現下面的頁面,就表示Zeppelin服務啓動成功。

當然,爲了一步到位適應生產環境,也可以適當修改zeppelin-site.xml中的以下參數:

<!-- 將Notebook repo更改爲HDFS存儲 -->
<property>
  <name>zeppelin.notebook.storage</name>
  <value>org.apache.zeppelin.notebook.repo.FileSystemNotebookRepo</value>
  <description>Hadoop compatible file system notebook persistence layer implementation, such as local file system, hdfs, azure wasb, s3 and etc.</description>
</property>

<!-- Notebook在HDFS上的存儲路徑 -->
<property>
  <name>zeppelin.notebook.dir</name>
  <value>/zeppelin/notebook</value>
  <description>path or URI for notebook persist</description>
</property>

<!-- 啓用Zeppelin的恢復功能。當Zeppelin服務掛掉並重啓之後,能連接到原來運行的Interpreter -->
<property>
  <name>zeppelin.recovery.storage.class</name>
  <value>org.apache.zeppelin.interpreter.recovery.FileSystemRecoveryStorage</value>
  <description>ReoveryStorage implementation based on hadoop FileSystem</description>
</property>

<!-- Zeppelin恢復元數據在HDFS上的存儲路徑 -->
<property>
  <name>zeppelin.recovery.dir</name>
  <value>/zeppelin/recovery</value>
  <description>Location where recovery metadata is stored</description>
</property>

<!-- 禁止使用匿名用戶 -->
<property>
  <name>zeppelin.anonymous.allowed</name>
  <value>true</value>
  <description>Anonymous user allowed by default</description>
</property>

Zeppelin集成了Shiro實現權限管理。禁止使用匿名用戶之後,可以在conf目錄下的shiro.ini中配置用戶名、密碼、角色等,不再贅述。注意每次修改配置都需要運行bin/zeppelin-daemon.sh restart重啓Zeppelin服務。

配置Flink Interpreter on YARN

在使用Flink Interpreter之前,我們有必要對它進行配置,使Flink作業和Interpreter本身在YARN環境中運行。

點擊首頁用戶名區域菜單中的Interpreter項(上一節圖中已經示出),搜索flink,就可以看到參數列表。

Interpreter Binding

首先,將Interpreter Binding模式修改爲Isolated per Note,如下圖所示。

在這種模式下,每個Note在執行時會分別啓動Interpreter進程,類似於Flink on YARN的Per-job模式,最符合生產環境的需要。

Flink on YARN參數

以下是需要修改的部分基礎參數。注意這些參數也可以在Note中指定,每個作業自己的配置會覆蓋掉這裏的默認配置。

  • FLINK_HOME:Flink 1.11所在的目錄;
  • HADOOP_CONF_DIR:Hadoop配置文件所在的目錄;
  • flink.execution.mode:Flink作業的執行模式,指定爲yarn以啓用Flink on YARN;
  • flink.jm.memory:JobManager的內存量(MB);
  • flink.tm.memory:TaskManager的內存量(MB);
  • flink.tm.slot:TaskManager的Slot數;
  • flink.yarn.appName:YARN Application的默認名稱;
  • flink.yarn.queue:提交作業的默認YARN隊列。

Hive Integration參數

如果我們想訪問Hive數據,以及用HiveCatalog管理Flink SQL的元數據,還需要配置與Hive的集成。

  • HIVE_CONF_DIR:Hive配置文件(hive-site.xml)所在的目錄;
  • zeppelin.flink.enableHive:設爲true以啓用Hive Integration;
  • zeppelin.flink.hive.version:Hive版本號。
  • 複製與Hive Integration相關的依賴到$FLINK_HOME/lib目錄下,包括:
    • flink-connector-hive_2.11-1.11.0.jar
    • flink-hadoop-compatibility_2.11-1.11.0.jar
    • hive-exec-*.*.jar
    • 如果Hive版本是1.x,還需要額外加入hive-metastore-1.*.jar、libfb303-0.9.2.jar和libthrift-0.9.2.jar
  • 保證Hive元數據服務(Metastore)啓動。注意不能是Embedded模式,即必須以外部數據庫(MySQL、Postgres等)作爲元數據存儲。

Interpreter on YARN參數

在默認情況下,Interpreter進程是在部署Zeppelin服務的節點上啓動的。隨着提交的任務越來越多,就會出現單點問題。因此我們需要讓Interpreter也在YARN上運行,如下圖所示。

  • zeppelin.interpreter.yarn.resource.cores:Interpreter Container佔用的vCore數量;
  • zeppelin.interpreter.yarn.resource.memory:Interpreter Container佔用的內存量(MB);
  • zeppelin.interpreter.yarn.queue:Interpreter所處的YARN隊列名稱。

配置完成之後,Flink on Zeppelin集成完畢,可以測試一下了。

測試Flink SQL on Zeppelin

創建一個Note,Interpreter指定爲flink。然後寫入第一個Paragraph:

%flink.conf標記的Paragraph用於指定這個Note中的作業配置,支持Flink的所有配置參數(參見Flink官網)。另外,flink.execution.packages參數支持以Maven GAV座標的方式引入外部依賴項。

接下來創建第二個Paragraph,創建Kafka流表:

%flink.ssql表示利用StreamTableEnvironment執行流處理SQL,相對地,%flink.bsql表示利用BatchTableEnvironment執行批處理SQL。注意表參數中的properties.bootstrap.servers利用了Zeppelin Credentials來填寫,方便不同作業之間複用。

執行上述SQL之後會輸出信息:

同時在Hive中可以看到該表的元數據。

最後寫第三個Paragraph,從流表中查詢,並實時展現出來:

點擊右上角的FLINK JOB標記,可以打開作業的Web UI。上述作業的JobGraph如下。

除SELECT查詢外,通過Zeppelin也可以執行INSERT查詢,實現更加豐富的功能。關於Flink SQL on Zeppelin的更多應用,筆者在今後的文章中會繼續講解,今天就到這裏吧。

The End

民那晚安晚安。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章