本文作者:KTV免费预定

spark配置日志服务器(spark环境搭建报告)

KTV免费预定 2024年09月11日 16:57:16 1

本文目录一览:

如何使用OpenStack,Docker和Spark打造一个云服务

蘑菇街基于 OpenStack 和 Docker 的私有云实践

本次主要想分享一下过去一年时间里,我们在建设基于Docker的私有云实践过程中,曾经遇到过的问题,如何解决的经验,还有我们的体会和思考,与大家共勉。

在生产环境中使用Docker有一些经历和经验。私有云项目是2014年圣诞节期间上线的,从无到有,经过了半年多的发展,经历了3次大促,已经逐渐形成了一定的规模。

架构

集群管理

大家知道,Docker自身的集群管理能力在当时条件下还很不成熟,因此我们没有选择刚出现的 Swarm,而是用了业界最成熟的OpenStack,这样能同时管理Docker和KVM。我们把Docker当成虚拟机来跑,是为了能满足业务上对虚拟化的需求。今后的思路是微服务化,把应用进行拆分,变成一个个微服务,实现PaaS基于应用的部署和发布。

通过OpenStack如何管理Docker?我们采用的是OpenStack+nova-docker+Docker的架构模式。nova- docker是StackForge上一个开源项目,它做为nova的一个插件,通过调用Docker的RESTful接口来控制容器的启停等动作。

我们在IaaS基础上自研了编排调度等组件,支持应用的弹性伸缩、灰度升级等功能,并支持一定的调度策略,从而实现了PaaS层的主要功能。

同时,基于Docker和Jenkins实现了持续集成(CI)。Git中的项目如果发生了git push等动作,便会触发Jenkins Job进行自动构建,如果构建成功便会生成Docker Image并push到镜像仓库。基于CI生成的Docker Image,可以通过PaaS的API或界面,进行开发测试环境的实例更新,并最终进行生产环境的实例更新,从而实现持续集成和持续交付。

网络和存储

网络方面,我们没有采用Docker默认提供的NAT网络模式,NAT会造成一定的性能损失。通过OpenStack,我们支持Linux bridge和Open vSwitch,不需要启动iptables,Docker的性能接近物理机的95%。

容器的监控

监控方面,我们自研了container tools,实现了容器load值的计算,替换了原有的top、free、iostat、uptime等命令。这样业务方在容器内使用常用命令时看到的是容器的值,而不是整个物理机的。目前我们正在移植Lxcfs到我们的平台上。

我们还在宿主机上增加了多个阈值监控和报警,比如关键进程监控、日志监控、实时pid数量、网络连接跟踪数、容器oom报警等等。

冗灾和隔离性

冗灾和隔离性方面,我们做了大量的冗灾预案和技术准备。我们能够在不启动docker daemon的情况下,离线恢复Docker中的数据。同时,我们支持Docker的跨物理机冷迁移,支持动态的CPU扩容/缩容,网络IO磁盘IO的限速。

遇到的问题及解决方法

接近一年不到的产品化和实际使用中我们遇到过各种的问题,使用Docker的过程也是不断优化Docker、不断定位问题、解决问题的过程。

我们现在的生产环境用的是CentOS 6.5。曾经有个业务方误以为他用的Docker容器是物理机,在Docker容器里面又装了一个Docker,瞬间导致内核crash,影响了同一台物理机的其他Docker容器。

经过事后分析是2.6.32-431版本的内核对network namespace支持不好引起的,在Docker内创建bridge会导致内核crash。upstream修复了这个bug,从2.6.32-431升级到2.6.32-504后问题解决。

还有一个用户写的程序有bug,创建的线程没有及时回收,容器中产生了大量的线程,最后在宿主机上都无法执行命令或者ssh登陆,报的错是"bash: fork: Cannot allocate memory",但通过free看空闲的内存却是足够的。

经过分析,发现是内核对pid的隔离性支持不完善,pid_max(/proc/sys/kernel/pid_max)是全局共享的。当一个容器中的pid数目达到上限32768,会导致宿主机和其他容器无法创建新的进程。最新的4.3-rc1才支持对每个容器进行pid_max限制。

我们还观察到docker的宿主机内核日志中会产生乱序的问题。经过分析后发现是由于内核中只有一个log_buf缓冲区,所有printk打印的日志先放到这个缓冲区中,docker host以及container上的rsyslogd都会通过syslog从kernel的log_buf缓冲区中取日志,导致日志混乱。通过修改 container里的rsyslog配置,只让宿主机去读kernel日志,就能解决这个问题。

除此之外,我们还解决了device mapper的dm-thin discard导致内核crash等问题。

体会和思考

最后分享一下我们的体会和思考,相比KVM比较成熟的虚拟化技术,容器目前还有很多不完善的地方,除了集群管理、网络和存储,最重要的还是稳定性。影响稳定性的主要还是隔离性的不完善造成的,一个容器内引起的问题可能会影响整个系统。

容器的memcg无法回收slab cache,也不对dirty cache量进行限制,更容易发生OOM问题。还有,procfs上的一些文件接口还无法做到per-container,比如pid_max。

另外一点是对容器下的运维手段和运维经验的冲击。有些系统维护工具,比如ss,free,df等在容器中无法使用了,或者使用的结果跟物理机不一致,因为系统维护工具一般都会访问procfs下的文件,而这些工具或是需要改造,或是需要进行适配。

虽然容器还不完善,但是我们还是十分坚定的看好容器未来的发展。Kubernetes、Mesos、Hyper、CRIU、runC等容器相关的开源软件,都是我们关注的重点。

QA

Q:请问容器间的负载均衡是如何做的?

A: 容器间的负载均衡,更多是PaaS和SaaS层面的。我们的P层支持4层和7层的动态路由,通过域名的方式,或者名字服务来暴露出对外的接口。我们能够做到基于容器的灰度升级,和弹性伸缩。

Q:请问你们的OpenStack是运行在CentOS 6.5上的吗?

A: 是的,但是我们针对OpenStack和Docker依赖的包进行了升级。我们维护了内部的yum源。

Q:请问容器IP是静态编排还是动态获取的?

A: 这个跟运维所管理的网络模式有关,我们内部的网络没有DHCP服务,因此对于IaaS层,容器的IP是静态分配的。对于PaaS层来说,如果有DHCP服务,容器的App所暴露出来IP和端口就可以做到动态的。

Q:请问你们当时部署的时候有没有尝试过用Ubuntu,有没有研究过两个系统间的区别,另外请问你们在OpenStack上是怎样对这些虚拟机监控的?

A: 我们没有尝试过Ubuntu,因为公司生产环境上用的是CentOS。我们的中间件团队负责公司机器的监控,我们和监控团队配合,将监控的agent程序部署到宿主机和每个容器里,这样就可以当成虚拟机来进行监控。

当然,容器的数据是需要从cgroups里来取,这部分提取数据的工作,是我们来实现的。

Q:容器间的网络选型有什么建议,据说采用虚拟网卡比物理网卡有不小的性能损失,Docker自带的weaves和ovs能胜任吗?

A: 容器的网络不建议用默认的NAT方式,因为NAT会造成一定的性能损失。之前我的分享中提到过,不需要启动iptables,Docker的性能接近物理机的95%。Docker的weaves底层应该还是采用了网桥或者Open vSwitch。建议可以看一下nova-docker的源码,这样会比较容易理解。

Q:静态IP通过LXC实现的吗?

A: 静态IP的实现是在nova-docker的novadocker/virt/docker/vifs.py中实现的。实现的原理就是通过ip命令添加 veth pair,然后用ip link set/ip netns exec等一系列命令来实现的,设置的原理和weaves类似。

Q:容器内的进程gdb你们怎么弄的,把gdb打包到容器内吗?

A: 容器内的gdb不会有问题的,可以直接yum install gdb。

Q:共享存储能直接mount到容器里吗?

A: 虽然没试过,但这个通过docker -v的方式应该没什么问题。

Q:不启动Docker Daemon的情况下,离线恢复Docker中的数据是咋做到的?

A: 离线恢复的原理是用dmsetup create命令创建一个临时的dm设备,映射到Docker实例所用的dm设备号,通过mount这个临时设备,就可以恢复出原来的数据。

Q:Docker的跨物理机冷迁移,支持动态的CPU扩容/缩容,网络IO磁盘IO的限速,是怎么实现的,能具体说说吗?

A:Docker的冷迁移是通过修改nova-docker,来实现OpenStack迁移的接口,具体来说,就是在两台物理机间通过docker commit,docker push到内部的registry,然后docker pull snapshot来完成的。

动态的CPU扩容/缩容,网络IO磁盘IO的限速主要是通过novadocker来修改cgroups中的cpuset、iops、bps还有TC的参数来实现的。

Q:请问你们未来会不会考虑使用Magnum项目,还是会选择Swarm?

A:这些都是我们备选的方案,可能会考虑Swarm。因为Magnum底层还是调用了Kubernetes这样的集群管理方案,与其用Magnum,不如直接选择Swarm或者是Kubernetes。当然,这只是我个人的看法。

Q:你们的业务是基于同一个镜像么,如果是不同的镜像,那么计算节点如何保证容器能够快速启动?

A:运维会维护一套统一的基础镜像。其他业务的镜像会基于这个镜像来制作。我们在初始化计算节点的时候就会通过docker pull把基础镜像拉到本地,这也是很多公司通用的做法,据我了解,腾讯、360都是类似的做法。

Q:做热迁移,有没有考虑继续使用传统共享存储的来做?

A: 分布式存储和共享存储都在考虑范围内,我们下一步,就计划做容器的热迁移。

Q:请问你们是直接将公网IP绑定到容器吗,还是通过其他方式映射到容器的私有IP,如果是映射如何解决原本二层的VLAN隔离?

A:因为我们是私有云,不涉及floating ip的问题,所以你可以认为是公网IP。VLAN的二层隔离完全可以在交换机上作。我们用Open vSwitch划分不同的VLAN,就实现了Docker容器和物理机的网络隔离。

Q:Device mapper dm-thin discard问题能说的详细些吗?

A:4月份的时候,有两台宿主机经常无故重启。首先想到的是查看/var/log/messages日志,但是在重启时间点附近没有找到与重启相关的信息。而后在/var/crash目录下,找到了内核crash的日志vmcore-dmesg.txt。日志的生成时间与宿主机重启时间一致,可以说明宿主机是发生了kernel crash然后导致的自动重启。“kernel BUG at drivers/md/persistent-data/dm-btree-remove.c:181!”。 从堆栈可以看出在做dm-thin的discard操作(process prepared discard),虽然不知道引起bug的根本原因,但是直接原因是discard操作引发的,可以关闭discard support来规避。

我们将所有的宿主机配置都禁用discard功能后,再没有出现过同样的问题。

在今年CNUTCon的大会上,腾讯和大众点评在分享他们使用Docker的时候也提到了这个crash,他们的解决方法和我们完全一样。

Q:阈值监控和告警那块,有高中低多种级别的告警吗,如果当前出现低级告警,是否会采取一些限制用户接入或者砍掉当前用户正在使用的业务,还是任由事态发展?

A:告警这块,运维有专门的PE负责线上业务的稳定性。当出现告警时,业务方和PE会同时收到告警信息。如果是影响单个虚拟机的,PE会告知业务方,如果严重的,甚至可以及时下掉业务。我们会和PE合作,让业务方及时将业务迁移走。

Q:你们自研的container tools有没有开源,GitHub上有没有你们的代码,如何还没开源,后期有望开源吗,关于监控容器的细粒度,你们是如何考虑的?

A:虽然我们目前还没有开源,单我觉得开源出来的是完全没问题的,请大家等我们的好消息。关于监控容器的细粒度,主要想法是在宿主机层面来监控容器的健康状态,而容器内部的监控,是由业务方来做的。

Q:请问容器的layer有关心过层数么,底层的文件系统是ext4么,有优化策略么?

A:当然有关心,我们通过合并镜像层次来优化docker pull镜像的时间。在docker pull时,每一层校验的耗时很长,通过减小层数,不仅大小变小,docker pull时间也大幅缩短。

Q:容器的memcg无法回收slab cache,也不对dirty cache量进行限制,更容易发生OOM问题。----这个缓存问题你们是怎么处理的?

A:我们根据实际的经验值,把一部分的cache当做used内存来计算,尽量逼近真实的使用值。另外针对容器,内存报警阈值适当调低。同时添加容器OOM的告警。如果升级到CentOS 7,还可以配置kmem.limit_in_bytes来做一定的限制。

Q:能详细介绍下你们容器网络的隔离?

A:访问隔离,目前二层隔离我们主要用VLAN,后面也会考虑VXLAN做隔离。 网络流控,我们是就是使用OVS自带的基于port的QoS,底层用的还是TC,后面还会考虑基于flow的流控。

Q:请问你们这一套都是用的CentOS 6.5吗,这样技术的实现。是运维还是开发参与的多?

A:生产环境上稳定性是第一位的。CentOS 6.5主要是运维负责全公司的统一维护。我们会给运维在大版本升级时提建议。同时做好虚拟化本身的稳定性工作。

Q:请问容器和容器直接是怎么通信的?网络怎么设置?

A:你是指同一台物理机上的吗?我们目前还是通过IP方式来进行通信。具体的网络可以采用网桥模式,或者VLAN模式。我们用Open vSwitch支持VLAN模式,可以做到容器间的隔离或者通信。

Q:你们是使用nova-api的方式集成Dcoker吗,Docker的高级特性是否可以使用,如docker-api,另外为什么不使用Heat集成Docker?

A:我们是用nova-docker这个开源软件实现的,nova-docker是StackForge上一个开源项目,它做为nova的一个插件,替换了已有的libvirt,通过调用Docker的RESTful接口来控制容器的启停等动作。

使用Heat还是NOVA来集成Docker业界确实一直存在争议的,我们更多的是考虑我们自身想解决的问题。Heat本身依赖的关系较为复杂,其实业界用的也并不多,否则社区就不会推出Magnum了。

Q:目前你们有没有容器跨DC的实践或类似的方向?

A:我们已经在多个机房部署了多套集群,每个机房有一套独立的集群,在此之上,我们开发了自己的管理平台,能够实现对多集群的统一管理。同时,我们搭建了Docker Registry V1,内部准备升级到Docker Registry V2,能够实现Docker镜像的跨DC mirror功能。

Q:我现在也在推进Docker的持续集成与集群管理,但发现容器多了管理也是个问题,比如容器的弹性管理与资源监控,Kubernetes、Mesos哪个比较好一些,如果用在业务上,那对外的域名解析如何做呢,因为都是通过宿主机来通信,而它只有一个对外IP?

A: 对于Kubernetes和Mesos我们还在预研阶段,我们目前的P层调度是自研的,我们是通过etcd来维护实例的状态,端口等信息。对于7层的可以通过Nginx来解析,对于4层,需要依赖于naming服务。我们内部有自研的naming服务,因此我们可以解决这些问题。对外虽然只有一个IP,但是暴露的端口是不同的。

Q:你们有考虑使用Hyper Hypernetes吗? 实现容器与宿主机内核隔离同时保证启动速度?

A:Hyper我们一直在关注,Hyper是个很不错的想法,未来也不排除会使用Hyper。其实我们最希望Hyper实现的是热迁移,这是目前Docker还做不到的。

Q:你们宿主机一般用的什么配置?独立主机还是云服务器?

A:我们有自己的机房,用的是独立的服务器,物理机。

Q:容器跨host通信使用哪一种解决方案?

A: 容器跨host就必须使用3层来通信,也就是IP,容器可以有独立的IP,或者宿主机IP+端口映射的方式来实现。我们目前用的比较多的还是独立ip的方式,易于管理。

Q:感觉贵公司对Docker的使用比较像虚拟机,为什么不直接考虑从容器的角度来使用,是历史原因么?

A:我们首先考虑的是用户的接受程度和改造的成本。从用户的角度来说,他并不关心业务是跑在容器里,还是虚拟机里,他更关心的是应用的部署效率,对应用本身的稳定性和性能的影响。从容器的角度,一些业务方已有的应用可能需要比较大的改造。比如日志系统,全链路监控等等。当然,最主要的是对已有运维系统的冲击会比较大。容器的管理对运维来说是个挑战,运维的接受是需要一个过程的。

当然,把Docker当成容器来封装应用,来实现PaaS的部署和动态调度,这是我们的目标,事实上我们也在往这个方向努力。这个也需要业务方把应用进行拆分,实现微服务化,这个需要一个过程。

Q:其实我们也想用容器当虚拟机使用。你们用虚拟机跑什么中间件?我们想解决测试关键对大量相对独立环境WebLogic的矛盾?

A:我们跑的业务有很多,从前台的主站Web,到后端的中间件服务。我们的中间件服务是另外团队自研的产品,实现前后台业务逻辑的分离。

Q:贵公司用OpenStack同时管理Docker和KVM是否有自己开发Web配置界面,还是单纯用API管理?

A:我们有自研的Web管理平台,我们希望通过一个平台管理多个集群,并且对接运维、日志、监控等系统,对外暴露统一的API接口。

Q:上面分享的一个案例中,关于2.6内核namespace的bug,这个低版本的内核可以安装Docker环境吗,Docker目前对procfs的隔离还不完善,你们开发的container tools是基于应用层的还是需要修改内核?

A:安装和使用应该没问题,但如果上生产环境,是需要全面的考虑的,主要还是稳定性和隔离性不够,低版本的内核更容易造成系统 crash或者各种严重的问题,有些其实不是bug,而是功能不完善,比如容器内创建网桥会导致crash,就是network namespace内核支持不完善引起的。

我们开发的container tools是基于应用的,不需要修改内核。

Q:关于冗灾方面有没有更详细的介绍,比如离线状态如何实现数据恢复的?

A:离线状态如何实现恢复数据,这个我在之前已经回答过了,具体来说,是用dmsetup create命令创建一个临时的dm设备,映射到docker实例所用的dm设备号,通过mount这个临时设备,就可以恢复出原来的数据。其他的冗灾方案,因为内容比较多,可以再另外组织一次分享了。你可以关注一下,到时候我们会分享出来。

Q:贵公司目前线上容器化的系统,无状态为主还是有状态为主,在场景选择上有什么考虑或难点?

A:互联网公司的应用主要是以无状态的为主。有状态的业务其实从业务层面也可以改造成部分有状态,或者完全不状态的应用。不太明白你说的场景选择,但我们尽量满足业务方的各种需求。

对于一些本身对稳定性要求很高,或对时延IO特别敏感,比如redis业务,无法做到完全隔离或者无状态的,我们不建议他们用容器。

多进程好还是多线程好等等,并不是说因为Spark很火就一定要使用它。在遇到这些问题的时候、图计算,目前我们还在继续这方面的工作:作为当前流行的大数据处理技术? 陈,它能快速创建一个Spark集群供大家使用,我们使用OpenStack? 陈。 问,Hadoop软硬件协同优化,在OpenPOWER架构的服务器上做Spark的性能分析与优化:您在本次演讲中将分享哪些话题。 问。多参与Spark社区的讨论。曾在《程序员》杂志分享过多篇分布式计算、Docker和Spark打造SuperVessel大数据公有云”,给upstrEAM贡献代码都是很好的切入方式、SQL,并拥有八项大数据领域的技术专利,MapReduce性能分析与调优工具。例如还有很多公司在用Impala做数据分析:企业想要拥抱Spark技术,对Swift对象存储的性能优化等等。例如与Docker Container更好的集成,大数据云方向的技术负责人,Spark还是有很多工作可以做的?企业如果想快速应用Spark 应该如何去做,具体的技术选型应该根据自己的业务场景,Docker Container因为在提升云的资源利用率和生产效率方面的优势而备受瞩目,高性能FPGA加速器在大数据平台上应用等项目,再去调整相关的参数去优化这些性能瓶颈,一些公司在用Storm和Samaza做流计算: 相比于MapReduce在性能上得到了很大提升?

Spark端口总结

Spark的端口总结

Master节点的web端口是8080,work节点的web端口是8081

spark master web ui 默认端口为8080,当系统有其它程序也在使用该接口(比如:Tomcat)时,启动master时也不会报错,spark自己会改用其它端口,自动端口号加1,也可以自行设置,修改方法:

1、cd $SPARK_HOME/sbin

2、vi start-master.sh

if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then

SPARK_MASTER_WEBUI_PORT=8080 #可以修改端口号

fi

8080端口:master WEB端口

8081端口:work WEB端口

7077端口:

master通信端口

18080端口:spark历史服务器端口

相关配置:

conf目录下

cp spark-defaults.conf.template spark-defaults.conf

编辑spark-defaults.conf这个文件

编辑spark-env.sh文件

使用sbin/start-history-server.sh脚本启动

启动日志:

执行spark任务

启动日志:

Web界面

4040端口:

2.3  Spark当前执行的任务页面查看端口4040(例如:使用spark-shell启动spark,此时的任务可以在4040端口页面查看),如果任务结束了4040端口页面不能访问

默认是4040,我改配置改了下

Spark History Server自动删除日志文件

公司spark配置日志服务器的计算平台上spark配置日志服务器,写入spark-history目录日志文件数超过设定阈值( 1048576 )spark配置日志服务器,导致任务失败。

mv spark-history spark-history_bak ,并新建 spark-history 空目录,新起的任务日志可以往新的空目录下写入,不过,如果之前有任务往旧目录写入日志,在重定向过程中,append写入新的日志数据,就会报错,还是影响到spark配置日志服务器了业务。

另外,该目录下有将近100W的文件数,常规 hdfs dfs 命令操作的话,报 out of mememory gc overlimit exceed 之类的错误,

通过 export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Xmx6000m" 加大hadoop客户端堆内存,遍历出文件数,发现这些文件是最近一个月产生的。

自动删除日志文件的机制并没有work。

spark.history.fs.update.interval 默认值 10秒

指定刷新日志的时间,更短的时间可以更快检测到新的任务以及任务执行情况,但过快会加重服务器负载

spark.history.ui.maxApplication 默认值 intMaxValue

这个参数指定UI上最多显示的作业的数目

spark.history.ui.port 默认值 18080

这个参数指定history-server的网页UI端口号

spark.history.fs.cleaner.enabled 默认为 false

这个参数指定history-server的日志是否定时清除,true为定时清除,false为不清除。这个值一定设置成true啊,不然日志文件会越来越大。

spark.history.fs.cleaner.interval 默认值为 1d

这个参数指定history-server的日志检查间隔,默认每一天会检查一下日志文件

spark.history.fs.cleaner.maxAge 默认值为 7d

指定history-server日志生命周期,当检查到某个日志文件的生命周期为7d时,则会删除该日志文件

spark.eventLog.compress 默认值为 false

设置history-server产生的日志文件是否使用压缩,true为使用,false为不使用。这个参数务可以成压缩哦,不然日志文件岁时间积累会过大

spark.history.retainedApplications  默认值: 50

在内存中保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,当再次访问已被删除的应用信息时需要重新构建页面。

虽然通过ambari页面设置spark配置日志服务器了该清理文件的时间,不过到 spark-historyserver 服务器,

cd /usr/xdp/current/spark-history-server 目录的conf文件下面

看到并没有反映到里面来,只能手动加入。重启 History Server 。

spark必须要hadoop吗

Sparkspark配置日志服务器的安装分为几种模式spark配置日志服务器,其中一种是本地运行模式,只需要在单节点上解压即可运行,这种模式不需要依赖Hadoop 环境。

运行 spark-shell

本地模式运行spark-shell非常简单,只要运行以下命令即可,假设当前目录是$SPARK_HOME

$ MASTER=local $ bin/spark-shell

MASTER=local就是表明当前运行在单机模式。如果一切顺利,将看到下面的提示信息:

Created spark context..

Spark context available as sc.

这表明spark-shell中已经内置了Spark context的变量,名称为sc,我们可以直接使用该变量进行后续的操作。

spark-shell 后面设置 master 参数,可以支持更多的模式,

我们在sparkshell中运行一下最简单的例子,统计在README.md中含有Spark的行数有多少,在spark-shell中输入如下代码:

scalasc.textFile("README.md").filter(_.contains("Spark")).count

如果你觉得输出的日志太多,你可以从模板文件创建 conf/log4j.properties :

$ mv conf/log4j.properties.template conf/log4j.properties

然后修改日志输出级别为WARN:

log4j.rootCategory=WARN, console

如果你设置的 log4j 日志等级为 INFO,则你可以看到这样的一行日志 INFO SparkUI: Started SparkUI at ,意思是 Spark 启动了一个 web 服务器,你可以通过浏览器访问来查看 Spark 的任务运行状态等信息。

pyspark

运行 bin/pyspark 的输出为:

$ bin/pyspark

Python 2.7.6 (default, Sep 9 2014, 15:04:36)

[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

Spark assembly has been built with Hive, including Datanucleus jars on classpath

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

15/03/30 15:19:07 WARN Utils: Your hostname, june-mac resolves to a loopback address: 127.0.0.1; using 10.9.4.165 instead (on interface utun0)

15/03/30 15:19:07 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address

15/03/30 15:19:07 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Welcome to

____ __

/ __/__ ___ _____/ /__

_\ \/ _ \/ _ / __/ _/

/__ / .__/\_,_/_/ /_/\_\ version 1.3.0

/_/

Using Python version 2.7.6 (default, Sep 9 2014 15:04:36)

SparkContext available as sc, HiveContext available as sqlCtx.

你也可以使用 IPython 来运行 Spark:

IPYTHON=1 ./bin/pyspark

如果要使用 IPython NoteBook,则运行:

IPYTHON_OPTS="notebook" ./bin/pyspark

从日志可以看到,不管是 bin/pyspark 还是 bin/spark-shell,他们都有两个内置的变量:sc 和 sqlCtx。

SparkContext available as sc, HiveContext available as sqlCtx

sc 代表着 Spark 的上下文,通过该变量可以执行 Spark 的一些操作,而 sqlCtx 代表着 HiveContext 的上下文。

spark-submit

在Spark1.0之后提供了一个统一的脚本spark-submit来提交任务。

对于 python 程序,我们可以直接使用 spark-submit:

$ mkdir -p /usr/lib/spark/examples/python$ tar zxvf /usr/lib/spark/lib/python.tar.gz -C /usr/lib/spark/examples/python$ ./bin/spark-submit examples/python/pi.py 10

对于 Java 程序,我们需要先编译代码然后打包运行:

$ spark-submit --class "SimpleApp" --master local[4] simple-project-1.0.jar

Spark 运行模式

Spark 的运行模式多种多样、灵活多变,部署在单机上时,既可以用本地模式运行,也可以用伪分布式模式运行,而当以分布式集群的方式部署时,也有众多的运行模式可以供选择,这取决于集群的实际情况,底层的资源调度既可以依赖于外部的资源调度框架,也可以使用 Spark 内建的 Standalone 模式。对于外部资源调度框架的支持,目前的实现包括相对稳定的 Mesos 模式,以及还在持续开发更新中的 Hadoop YARN 模式。

在实际应用中,Spark 应用程序的运行模式取决于传递给 SparkContext 的 MASTER 环境变量的值,个别模式还需要依赖辅助的程序接口来配合使用,目前所支持的 MASTER 环境变量由特定的字符串或 URL 所组成。例如:

Local[N]:本地模式,使用 N 个线程。

Local Cluster[Worker,core,Memory]:伪分布式模式,可以配置所需要启动的虚拟工作节点的数量,以及每个工作节点所管理的 CPU 数量和内存尺寸。

Spark://hostname:port:Standalone 模式,需要部署 Spark 到相关节点,URL 为 Spark Master 主机地址和端口。

Mesos://hostname:port:Mesos 模式,需要部署 Spark 和 Mesos 到相关节点,URL 为 Mesos 主机地址和端口。

YARN standalone/Yarn cluster:YARN 模式一,主程序逻辑和任务都运行在 YARN 集群中。

YARN client:YARN 模式二,主程序逻辑运行在本地,具体任务运行在 YARN 集群中。

运行 Spark

通过命令行运行 Spark ,有两种方式:bin/pyspark 和 bin/spark-shell。

运行 bin/spark-shell 输出的日志如下:

$ ./bin/spark-shell --master local

你可以从模板文件创建 conf/log4j.properties ,然后修改日志输出级别:

mv conf/log4j.properties.template conf/log4j.properties

修改 log4j.rootCategory 的等级为输出 WARN 级别的日志:

log4j.rootCategory=WARN, console

如果你设置的 log4j 日志等级为 INFO,则你可以看到这样的一行日志 INFO SparkUI: Started SparkUI at ,意思是 Spark 启动了一个 web 服务器,你可以通过浏览器访问 来查看 Spark 的任务运行状态。

从日志可以看到,不管是 bin/pyspark 还是 bin/spark-shell,他们都有两个内置的变量:sc 和 sqlCtx。

SparkContext available as sc, HiveContext available as sqlCtx

sc 代表着 Spark 的上下文,通过该变量可以执行 Spark 的一些操作,而 sqlCtx 代表着 HiveContext 的上下文。

Spark从入门到精通3:Spark全分布模式的安装和配置

Spark的安装模式一般分为三种:1.伪分布模式:即在一个节点上模拟一个分布式环境spark配置日志服务器,master和worker共用一个节点spark配置日志服务器,这种模式一般用于开发和测试Spark程序spark配置日志服务器;2.全分布模式:即真正的集群模式,master和worker部署在不同的节点之上,一般至少需要3个节点(1个master和2个worker),这种模式一般用于实际的生产环境;3.HA集群模式:即高可用集群模式,一般至少需要4台机器(1个主master,1个备master,2个worker),这种模式的优点是在主master宕机之后,备master会立即启动担任master的职责,可以保证集群高效稳定的运行,这种模式就是实际生产环境中多采用的模式。本小节来介绍Spark的全分布模式的安装和配置。

安装介质:

jdk-8u162-linux-x64.tar.gz 提取码:2bh8

hadoop-2.7.3.tar.gz 提取码:d4g2

scala-2.12.6.tgz 提取码:s2ly

spark-2.1.0-bin-hadoop2.7.tgz 提取码:5kcf

准备3台Linux主机,按照下面的步骤在每台主机上执行一遍,设置成如下结果:

安装Linux操作系统比较简单,这里不再详细。参考:《 Linux从入门到精通1:使用 VMware Workstation 14 Pro 安装 CentOS 7 详细图文教程 》

编辑hosts配置文件:# vi /etc/hosts,追加3行:

测试主机名是否可用:

(1)使用ssh-keygen工具生成秘钥对:

(2)将生成的公钥发给三台主机:master、slave1、slave2:

(3)测试秘钥认证是否成功:

由于各个主机上的时间可能不一致,会导致执行Spark程序出现异常,因此需要同步各个主机的时间。在实际生成环境中,一般使用时间服务器来同步时间,但是搭建时间服务器相对较为复杂。这里介绍一种简单的方法来快速同步每台主机主机的时间。我们知道,使用date命令可以设置主机的时间,因此这里使用putty的插件MTPuTTY来同时向每一台主机发送date命令,以到达同步时间的目的。

(1)使用MTPuTTY工具连接三台主机,点击MTPuTTY工具的Tools菜单下的“Send script…”子菜单,打开发送脚本工具窗口。

(2)输入命令:date -s 2018-05-28,然后回车(注意:一定要回车,否则只发送不执行),在下面服务器列表中选择要同步的主机,然后点击“Send script”,即可将时间同步为2018-05-28 00:00:00。

使用winscp工具将JDK安装包 jdk-8u144-linux-x64.tar.gz 上传到/root/tools/目录中,该目录是事先创建的。

进入/root/tools/目录,将jdk安装包解压到/root/training/目录中,该目录也是事先创建的。

使用winscp工具将Hadoop安装包 hadoop-2.7.3.tar.gz 上传到master节点的/root/tools/目录中,该目录是事先创建的。

进入/root/tools/目录,将hadoop安装包解压到/root/training/目录中,该目录也是事先创建的。

进入Hadoop配置文件目录:

(1) 配置hadoop-env.sh文件:

(2) 配置hdfs-site.xml文件:

(3) 配置core-site.xml文件:

(4) 配置mapred-site.xml文件:

将模板文件mapred-site.xml.template拷贝一份重命名为mapred-site.xml然后编辑:

(5) 配置yarn-site.xml文件:

(6) 配置slaves文件:

将master上配置好的Hadoop安装目录分别复制给两个从节点slave1和slave2,并验证是否成功。

第一次启动需要输入yes继续。

启动成功后,使用jps命令查看各个节点上开启的进程:

使用命令行查看HDFS的状态:

使用浏览器查看HDFS的状态:

使用浏览器查看YARN的状态:

(1) 在HDFS上创建输入目录/input:

(2) 将本地数据文件data.txt上传至该目录:

(3) 进入到Hadoop的示例程序目录:

(4) 执行示例程序中的Wordcount程序,以HDFS上的/input/data.txt作为输入数据,输出结果存放到HDFS上的/out/wc目录下:

(5) 查看进度和结果:

可以通过终端打印出来的日志信息知道执行进度:

执行结束后可以在HDFS上的/out/wc目录下查看是否有_SUCCESS标志文件来判断是否执行成功。

如果执行成功,可以在输出目录下看到_SUCCESS标志文件,且可以在part-r-00000文件中查看到wordcount程序的结果:

由于Scala只是一个应用软件,只需要安装在master节点即可。

使用winscp工具将Scala安装包上传到master节点的/root/tools目录下:

进入/root/tools目录,将Scala安装包解压到安装目录/root/training/:

将Scala的家目录加入到环境变量PATH中:

使环境变量生效:

输入scala命令,如下进入scala环境,则证明scala安装成功:

我们先在master节点上配置好参数,再分发给两个从节点slave1和slave2。

使用winscp工具将Spark安装包上传到master节点的/root/tools目录下:

进入/root/tools目录,将Spark安装包解压到安装目录/root/training/下:

注意:由于Spark的命令脚本和Hadoop的命令脚本有冲突(比如都有start-all.sh和stop-all.sh等),

所以这里需要注释掉Hadoop的环境变量,添加Spark的环境变量:

按Esc:wq保存退出,使用source命令使配置文件立即生效:

进入Spark的配置文件目录下:

(1) 配置spark-env.sh文件:

(2) 配置slaves文件:

将master上配置好的Spark安装目录分别复制给两个从节点slave1和slave2,并验证是否成功。

启动后查看每个节点上的进程:

使用浏览器监控Spark的状态:

使用spark-shell命令进入SparkContext(即Scala环境):

启动spark配置日志服务器了spark-shell之后,可以使用4040端口访问其Web控制台页面(注意:如果一台机器上启动了多个spark-shell,即运行了多个SparkContext,那么端口会自动连续递增,如4041,4042,4043等等):

注意:由于我们将Hadoop从环境变量中注释掉了,这时只能手动进入到Hadoop的sbin目录停止Hadoop:

Spark中常用的端口总结:

阅读
分享