Flink Sql on Zeppelin(1)——环境准备

环境准备

概述

  • 为什么会选择Sql
    • 目前开发Flink的方式有很多,一般来说都是开发同学写JAVA/SCALA/PYTHON项目,然后提交到集群上运行
      • 这种做法较为灵活,因为你在代码里面可以写任务东西,什么维表JOIN、参数调优,都能很轻松的搞定
      • 但是对开发同学的要求较高,有一定的学习成本。比如有些同学擅长JAVA,有些擅长PYTHON,而在我们的项目开发过程中,是不会允许多种语言共存的,一般来说都是选择JAVA作为我们的开发语言,那么,对于擅长PYTHON的同学来说,再从头开始攀爬JAVA这座大山,而且还得短期能够熟练使用,无疑是难上加难。
      • 所以,最好的选择是有一种学习成本低,大多数同学都学过、用过的语言,或者说上手很容易的语言。那就是Sql
  • 我另一个系列的博客就是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
    Interpreter
  • 在Zeppelin中可以使用3种不同的形式提交Flink任务,都需要配置FLINK_HOMEflink.execution.mode,第一个参数是Flink的安装目录,第二个参数是一个枚举值,有三种可以选
    • Local
      • 会启动个MiniCluster,适合POC阶段,只需要配置上面两个参数
    • Remote
      • 连接一个Standalone集群,除了要配置FLINK_HOMEflink.execution.mode以外,还需要配置flink.execution.remote.hostflink.execution.remote.port,具体配置内容可以查看flink-conf.yaml
    • Yarn
      • 我们之后要使用的模式,会在Yarn上启动一个Yarn-Session模式的Flink集群。除了要配置FLINK_HOMEflink.execution.mode以外,还需要配置HADOOP_CONF_DIR

验证

  • 进入首页,点击已有的Demo笔记本
    选择笔记本
  • 这是一个简单的WordCount,是Batch模式,代码由Scala编写
  • 点击运行按钮,等待输出结果
    启动
  • 同时,打开Yarn 的Web管理页面,发现页面上启动了一个Flink应用,并点击红色画框部分进入Flink Yarn Session集群
    yarn
  • 发现我们提交的任务正在运行
    Flink Cluster
  • 等任务完成后,回到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)
修改完之后重启,再次提交任务,应该就能正常提交任务了

  • 提交任务时报错——网络不通
    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
    
    目前没有真正确定这个报错的原因,我自己两台电脑都不行,两个都是Windows装的子系统Ubuntu,其次两个电脑上都装了docker,不知道是不是这两个原因,之后有机会再测一下。解决方法是将ZEPPELIN_LOCAL_IP注入到环境变量中。然后重启应用,再次提交任务就会解决了。如果大家也遇到了这个问题,可以在下面留言,我会及时回复的

最后,向大家宣传一下Flink on Zeppelin 的钉钉群,大家有问题可以在里面讨论,简锋大佬也在里面,有问题直接提问就好
钉钉群

猜你喜欢

转载自blog.csdn.net/weixin_47482194/article/details/106624432
今日推荐