环境准备
概述
- 为什么会选择Sql
- 目前开发Flink的方式有很多,一般来说都是开发同学写JAVA/SCALA/PYTHON项目,然后提交到集群上运行
- 这种做法较为灵活,因为你在代码里面可以写任务东西,什么维表JOIN、参数调优,都能很轻松的搞定
- 但是对开发同学的要求较高,有一定的学习成本。比如有些同学擅长JAVA,有些擅长PYTHON,而在我们的项目开发过程中,是不会允许多种语言共存的,一般来说都是选择JAVA作为我们的开发语言,那么,对于擅长PYTHON的同学来说,再从头开始攀爬JAVA这座大山,而且还得短期能够熟练使用,无疑是难上加难。
- 所以,最好的选择是有一种学习成本低,大多数同学都学过、用过的语言,或者说上手很容易的语言。那就是Sql
- 目前开发Flink的方式有很多,一般来说都是开发同学写JAVA/SCALA/PYTHON项目,然后提交到集群上运行
- 我另一个系列的博客就是Flink Sql,那么为什么还要新开个Flink Sql的系列呢?
- 首先,我的代码也是在IDEA里面编写然后运行的,里面夹杂着JAVA和SQL,会让一些人产生疑惑,这到底是Flink JAVA教程还是Flink SQL教程呢?
- 其次,虽然说我所在的公司有自己的Flink Sql平台,但是受限于各种情况,并不能演示给大家看
- 社区目前也在推进纯Sql的平台,比如Flink自带的
sql-client
命令行工具,虽说大多数功能都已支持,包括CREATE VIEW
这种尚未在代码中支持的语句,但是功能实在单一,且不支持REST
方式去提交我们的代码,总不能让每个人都在自己电脑上配上Flink的客户端吧?其他的缺点还有很多,就不一一列举了。就我看来,sql-client
目前还只是个大玩具,等大家成熟了,就会抛弃它 - ververica目前也推出了一个Sql客户端——
Flink SQL Gateway
+flink-jdbc-driver
,将两者结合使用,也能够很好的构架一个纯Sql的开发平台。缺点也很明显,首先没有可视化界面,也是通过命令行或者自己封装的方式来使用;其次,社区规模小,活跃度低,很多人都不一定知道这个东西。 - 那么,有没有一个有图形化界面、功能完善、社区活跃度高的工具呢?
- Apache Zeppelin!
- Zeppelin, a web-based notebook that enables interactive data analytics. You can make beautiful data-driven, interactive and collaborative documents with SQL, Scala and more.
- 上面的介绍来自官网,大概意思是:Zeppelin 是一个提供交互数据分析且基于Web的笔记本。方便你做出可数据驱动的、可交互且可协作的精美文档,并且支持多种语言,包括 Scala、Sql等等。想了解更多信息可以访问官网
- 这里先卖个关子,先不介绍Zeppelin的优势,让大家在学习的过程中,跟随我慢慢体验~~(主要我也是第一次使用Zeppelin)~~
安装&配置
- 想在Zeppelin中使用Flink,需要下载最新的Zeppelin 0.9.0 以及 Flink 1.10 。截止到2020年6月8日,Zeppelin 0.9.0 尚未正式发布。不过,简锋大佬已经帮大家编译好了,链接:https://pan.baidu.com/s/1P93evudRiUzh6y-6X5lNFg 提取码:n1rd
- 也可以自行拉取代码然后编译,GitHub传送门:点我
- 另外,我使用的是Flink 1.10的版本,同时,Scala版本是2.11,已经下载并安装好,这里就默认大家都配置完了。之前和我一样在IDEA里面运行的同学,戳我下载,下载并解压应该就可以了,如果遇到什么问题可以联系我
- 下面,跟着我一起,配置Zeppelin吧
#1.1解压 tar -zxvf zeppelin-0.9.0-SNAPSHOT.tar.gz #1.2进入conf目录 cd zeppelin-0.9.0-SNAPSHOT/conf #1.3修改配置文件名,不然应用无法正确加载到 mv zeppelin-env.sh.template zeppelin-env.sh #1.4.1修改配置文件 vim zeppelin-env.sh #1.4.2在编辑器页面,插入两行内容 export JAVA_HOME=这里改成jdk的目录!请勿照抄 export ZEPPELIN_ADDR=这里写要绑定的IP,如果Zeppelin没有装在本机,那就不要写127.0.0.1,否则别的机器无法通过ip+port进行访问 #1.4.3保存并退出。 #2.1因为我打算把Flink跑在Yarn上,加上之后要连接Hive,所以,现在去Flink的目录添加几个Jar包,不打算跑在Yarn的同学可以直接跳到步骤3.1 cd ~/flink/lib #2.2下载Flink On Yarn的相关Jar包,Jar包版本要和你Flink以及Hadoop版本对应,我的Hadoop版本是2.7.1 wget https://repo1.maven.org/maven2/org/apache/flink/flink-hadoop-compatibility_2.11/1.10.0/flink-hadoop-compatibility_2.11-1.10.0.jar wget https://repo1.maven.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.7.5-9.0/flink-shaded-hadoop-2-uber-2.7.5-9.0.jar #2.3下载Flink 连接 Hive的相关Jar包,我的Hive版本是2.1.1。这里因为Hive版本可能和大家不同,可以参考一下官网的文档,https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/hive/#dependencies wget https://repo1.maven.org/maven2/org/apache/hive/hive-exec/2.1.1/hive-exec-2.1.1.jar wget https://repo1.maven.org/maven2/org/apache/flink/flink-connector-hive_2.11/1.10.0/flink-connector-hive_2.11-1.10.0.jar #3.1上面的步骤完成来,来到Zeppelin的bin目录 cd ~/zeppelin-0.9.0-SNAPSHOT/bin #3.2启动! ./zeppelin-daemon.sh start
- 如果看到控制台正常输出
Zeppelin start [ OK ]
,那就说明安装完成,否则去zeppelin的log目录下,查看日志,分析启动失败原因 - 然后打开浏览器,输入服务器地址和端口,默认端口是8080,如果能看到下面的页面,说明正常,否则一样去分析日志
- 接下来我们在页面上配置Interpreter,点击右上角的用户名
anonymous
,单击Interpreter
进入配置页面 - 在这里筛选我们的Interpreter
- 在Zeppelin中可以使用3种不同的形式提交Flink任务,都需要配置
FLINK_HOME
和flink.execution.mode
,第一个参数是Flink的安装目录,第二个参数是一个枚举值,有三种可以选- Local
- 会启动个MiniCluster,适合POC阶段,只需要配置上面两个参数
- Remote
- 连接一个Standalone集群,除了要配置
FLINK_HOME
和flink.execution.mode
以外,还需要配置flink.execution.remote.host
和flink.execution.remote.port
,具体配置内容可以查看flink-conf.yaml
- 连接一个Standalone集群,除了要配置
- Yarn
- 我们之后要使用的模式,会在Yarn上启动一个Yarn-Session模式的Flink集群。除了要配置
FLINK_HOME
和flink.execution.mode
以外,还需要配置HADOOP_CONF_DIR
- 我们之后要使用的模式,会在Yarn上启动一个Yarn-Session模式的Flink集群。除了要配置
- Local
验证
- 进入首页,点击已有的Demo笔记本
- 这是一个简单的WordCount,是Batch模式,代码由Scala编写
- 点击运行按钮,等待输出结果
- 同时,打开Yarn 的Web管理页面,发现页面上启动了一个Flink应用,并点击红色画框部分进入Flink Yarn Session集群
- 发现我们提交的任务正在运行
- 等任务完成后,回到Zeppelin页面,发现已经输出了结果
- 至此,我们完成了Zeppelin 的安装及配置,并且能够成功提交Flink 作业跑在Yarn集群上,同时输出正确的结果
踩坑记录
- 提交任务时报错——JAVA版本过低
org.apache.zeppelin.interpreter.InterpreterException: java.io.IOException: Fail to launch interpreter process: Apache Zeppelin requires either Java 8 update 151 or newer at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.open(RemoteInterpreter.java:134) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.getFormType(RemoteInterpreter.java:298) at org.apache.zeppelin.notebook.Paragraph.jobRun(Paragraph.java:433) at org.apache.zeppelin.notebook.Paragraph.jobRun(Paragraph.java:75) at org.apache.zeppelin.scheduler.Job.run(Job.java:172) at org.apache.zeppelin.scheduler.AbstractScheduler.runJob(AbstractScheduler.java:130) at org.apache.zeppelin.scheduler.RemoteScheduler$JobRunner.run(RemoteScheduler.java:159) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Fail to launch interpreter process: Apache Zeppelin requires either Java 8 update 151 or newer at org.apache.zeppelin.interpreter.remote.RemoteInterpreterManagedProcess.start(RemoteInterpreterManagedProcess.java:130) at org.apache.zeppelin.interpreter.ManagedInterpreterGroup.getOrCreateInterpreterProcess(ManagedInterpreterGroup.java:65) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.getOrCreateInterpreterProcess(RemoteInterpreter.java:110) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.internal_create(RemoteInterpreter.java:163) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.open(RemoteInterpreter.java:131) ... 13 more
出现这个问题的原因是,我们服务器上环境变量JAVA_HOME
对应的JAVA版本是1.8.0_72-b15
,虽然说我们在上面修改zeppelin-env.sh
的时候,已经配置了新的环境变量,但是zeppelin启动Interpreter的时候,没有把环境变量传入导致,之后我会看一下社区有没有修复这个bug,没有的话我就去jira提交一下。修改的方式有两种
- 修改环境变量JAVA_HOME
对应的JAVA地址,修改完重启zeppelin
- 因为服务器上还有别的应用,不然冒然升级JDK,那么就修改zeppelin/bin
目录下的common.sh
文件。
bash vim ~/zeppelin/bin/common.sh #跳到66行,将java_ver_output=$("${JAVA:-后面的java修改为你的高版本jdk地址,比如的我jdk地址是/home/data/programs/jdk,那么,第66行就被修改为 java_ver_output=$("${JAVA:-/home/data/programs/jdk/bin/java}" -version 2>&1)
修改完之后重启,再次提交任务,应该就能正常提交任务了
- 提交任务时报错——网络不通
目前没有真正确定这个报错的原因,我自己两台电脑都不行,两个都是Windows装的子系统Ubuntu,其次两个电脑上都装了docker,不知道是不是这两个原因,之后有机会再测一下。解决方法是将Exception in thread "main" org.apache.zeppelin.shaded.org.apache.thrift.transport.TTransportException: java.net.SocketException: Network is unreachable (connect failed) at org.apache.zeppelin.shaded.org.apache.thrift.transport.TSocket.open(TSocket.java:226) at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer.<init>(RemoteInterpreterServer.java:167) at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer.<init>(RemoteInterpreterServer.java:152) at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer.main(RemoteInterpreterServer.java:321) Caused by: java.net.SocketException: Network is unreachable (connect failed) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:606) at org.apache.zeppelin.shaded.org.apache.thrift.transport.TSocket.open(TSocket.java:221) ... 3 more at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.internal_create(RemoteInterpreter.java:166) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.open(RemoteInterpreter.java:131) ... 13 more
ZEPPELIN_LOCAL_IP
注入到环境变量中。然后重启应用,再次提交任务就会解决了。如果大家也遇到了这个问题,可以在下面留言,我会及时回复的
最后,向大家宣传一下Flink on Zeppelin 的钉钉群,大家有问题可以在里面讨论,简锋大佬也在里面,有问题直接提问就好