如何在非安全的CDH集群中部署多用户JupyterHub服务并集成Spark2

1.文档编写目的


Fayson在前一篇文章《如何在非安全的CDH集群中部署Jupyter并集成Spark2》中介绍了Jupyter Notebook的部署与Spark2集成。Jupyter提供的类似单机版Web服务,不能供给多个用户使用,对于个人用户可以满足需求,对于企业用户则相对麻烦。本篇文章Fayson主要介绍如何使用JupyterHub部署支持多用户的Jupyter Notebook服务并与集群的Spark2集成。

JupyterHub服务实现架构图:

  • 测试环境

1.CM5.15.0和CDH版本5.14.2

2.JupyterHub版本为0.9.2

3.Python版本为3.6.5

2.JupyterHub部署及配置


1.安装OS的依赖包

[root@cdh03 ~]# yum -y install npm nodejs-legacy

(可左右滑动)

2.在Python3中安装JupyterHub

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/pip install jupyterhub

(可左右滑动)

安装成功

3.使用nmp命令安装configurable-http-proxy服务

[root@cdh03 ~]# npm install -g configurable-http-proxy

(可左右滑动)

4.安装Notebook包

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/pip show notebook

(可左右滑动)

在Fayson的Python3环境中,默认已安装了Notebook。

5.测试JupyterHub及http代理是否安装成功

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/jupyterhub -h

(可左右滑动)

[root@cdh03 ~]# configurable-http-proxy -h

(可左右滑动)

6.生成JupyterHub配置文件,命令如下:

[root@cdh03 ~]# mkdir -p /etc/jupyterhub
[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/jupyterhub --generate-config -f /etc/jupyterhub/jupyterhub_config.py

(可左右滑动)

将Jupyterhub的配置文件生成到指定目录下(/etc/jupyterhub)。

7.修改jupyterhub_config.py配置文件,将配置修改为如下:

#Jupyterhub服务监听的ip与端口,在0.9之前版本通过c.JupyterHub.port和c.JupyterHub.ip来指定
c.JupyterHub.bind_url = 'http://:8000'
#指定jupyterhub-singleuser命令绝对路径
c.Spawner.cmd = ['/opt/cloudera/anaconda3/bin/jupyterhub-singleuser']
#指定Jupyterhub服务的管理员账号,该账号拥有管理权限
c.Authenticator.admin_users = {'admin'}

(可左右滑动)

8.启动Jupyterhub服务

[root@cdh03 jupyterhub]# /opt/cloudera/anaconda3/bin/jupyterhub –f /etc/jupyterhub/jupyterhub_config.py

(可左右滑动)

如上显示启动成功,在启动命令后添加--debug参数可以显示DEBUG日志,-f指定JupyterHub启动加载的配置文件。

9.在浏览器输入http://cdh03.fayson.com:8000访问JupyterHub服务

上图可以看到Jupyterhub的登录界面,这里Fayson设置了admin用户为管理员,但并为设置该用户的密码。JupyterHub服务的用户使用的是OS的用户,JupyterHub基于OS的PAM模块进行用户认证,所以需要为OS上的admin用户设置密码即可。

[root@cdh03 ~]# id admin
uid=1006(admin) gid=1006(admin) groups=1006(admin)
[root@cdh03 ~]# passwd admin
Changing password for user admin.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@cdh03 ~]# 

(可左右滑动)

接下来在登录界面输入admin/****登录即可,登录成功后显示如下界面

3.Spark2集成


Spark支持Sacla、Python、R语言,下面Fayson主要使用Apache Toree来实现Jupyter与CDH集群中的Spark2集成,通过Toree来生成集群Spark2的不同语言的内核。

1.通过如下命令查看Jupyter中默认支持的Kernel

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/jupyter kernelspec list

(可左右滑动)

上图可以看到默认Jupyter只有python3的kernel

2.在Python中安装toree包,执行命令如下:

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/pip install --upgrade toree

(可左右滑动)

安装的toree版本为0.2.0

3.使用toree安装Spark2 Scala语言的kernel,命令如下:

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/jupyter toree install --spark_home=/opt/cloudera/parcels/SPARK2/lib/spark2

(可左右滑动)

查看Jupyter的Kernel

上图显示多了一个apache_toree_scala的kernel

4.使用上一步命令默认的只安装了Spark Scala的Kernel,那pyspark、sparkr及SparkSQL的Kernel生成命令如下:

[root@cdh03 ~]# /opt/cloudera/anaconda3/bin/jupyter toree install --interpreters=PySpark,SparkR,SQL --spark_home=/opt/cloudera/parcels/SPARK2/lib/spark2

(可左右滑动)

查看Jupyter的Kernel

5.以上步骤就完成了Jupyterhub与Spark2的集成,重启Jupyterhub服务

4.JupyterHub使用


1.使用管理员账号登录JupyterHub,登录成功后默认的启动一个Jupyter Notebook

2.点击“New”新建一个Notebook,这里Fayson选择“Apache Toree- PySpark”

打开新的创建

3.运行PySpark测试代码,读取HDFS的/tmp/test.txt文件、统计行数并输出第一行内容

textFile = spark.read.text("/tmp/test.txt")
textFile.count()
textFile.first()

(可左右滑动)

运行成功结果显示如下:

4.查看CDH集群Yarn的8088界面作业

5.总结


1.JupyterHub与Jupyter的区别是支持了多用户访问,用于创建、管理、代理多个Jupyter Notebook示例。

2.JupyterHub与Spark2集成时同样使用Apache Toree实现,与Jupyter公用一套kernel配置

3.在部署Jupyter的节点,需要安装Spark的Gateway角色

4.由于JupyterHub是基于OS的PAM模块进行用户认证,所以我们的用户需要在OS上存在,如果需要使用OPenLDAP上的用户登录,则需要在JupyterHub服务所在服务器上安装OpenLDAP客户端使用SSSD服务同步用户并集成SSH登录,否则OPenLDAP的用户是无法登录JupyterHub。

具体可以参考Fayson前面的文章关于OpenLDAP的安装与SSH集群

《1.如何在RedHat7上安装OpenLDA并配置客户端》

《2.如何在RedHat7中实现OpenLDAP集成SSH登录并使用sssd同步用户》

关于集成SSH登录并使用SSSD同步用户,需要确保OpenLDAP服务支持TLS。

下面演示使用OpenLDAP用户登录JupyterHub,在OpenLDAP上添加一个testldap用户(添加用户步骤省略)

[root@cdh03 ~]# more /etc/passwd |grep testldap
[root@cdh03 ~]# id testldap
uid=1234(testldap) gid=1234(testldap) groups=1234(testldap)
[root@cdh03 ~]# su testldap
[testldap@cdh03 root]$ su testldap
Password: 
[testldap@cdh03 root]$ 

使用testldap用户登录JupyterHub

登录成功

关于JupyterHub更多功能及说明参考官网:

https://jupyterhub.readthedocs.io/en/0.9.0/index.html

https://github.com/jupyterhub/jupyterhub

本文分享自微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构

阿里分布式服务框架Dubbo的架构总结总体架构参考补充

22240
来自专栏周明礼的专栏

一步一步带你搭建一个“摩登”的前端开发环境

最近几年也陆续推出了多种不同的js类型系统用于增强js的健壮性,其中像 typescript 就是其中的佼佼者。当然我今天要讲的并不是typescript,而是...

1.6K00
来自专栏阿杜的世界

【转】Dubbo架构设计详解总体架构核心要点参考资料

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度...

13150
来自专栏数据之美

玩转 Nginx 之:使用 Lua 扩展 Nginx 功能

1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应...

1.5K70
来自专栏java一日一条

HDFS知识点总结

HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用...

13920
来自专栏FreeBuf

Frida之Pin码破解实验

0×00前言 在网上搜了一些frida破解Pin码的文章,不动手写点代码总感觉理解不深入的念头又升起来了,于是决定找一个开源pin码,然后改一改再破解。 特别感...

40670
来自专栏伦少的博客

Spark Streamming+Kafka提交offset实现有且仅有一次

82020
来自专栏牛肉圆粉不加葱

YARN Capacity Scheduler(容量调度器)

以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时...

21930
来自专栏Java后端技术栈

【动画】当我们在读写Socket时,我们究竟在读写什么?

套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它。我们熟悉的web服务器底层依赖它,我们用到的MySQL...

13620
来自专栏我是攻城师

如何在Scala中读取Hadoop集群上的gz压缩文件

37740

扫码关注云+社区

领取腾讯云代金券