
记录一个客户问题 客户用Spark SQL的repartition接口来解决Hive ORC表小文件的问题,发现文件膨胀的很厉害 比如原来有1000个小文件,总大小是500MBrepartition(10) 再 insert overwrite之后 10个文件 总大小是2~3GB 但是检查了一下最终的两个分区的 row count是一致的 调查结论 先说一下这两接口不同 repartition 把record完全打乱最终随机插入到10个文件 有Shufflecoalesce 把相邻的分区的数据捏在一起,没有Shuffle 为啥shuffle打乱数据会让最终的表输出文件变大 其实就是 ORC 数据编码问题原来的源分区其实是通过HashPartition的方式分布的,这样的数据分布可以让ORC的编码压缩得更加极致,而repartition完全打乱后导致本来在一个文件的相同记录分布到10个文件,那就是每个文件都有该记录的编码索引,那么最终文件就变大了 所以推荐使用 coalesce 接口来做类似的事情
引子 本来这个东西是没啥好写的,但是在帮客户解决问题的时候,发现链路太长,不能怪客户弄不出来,记录一下 需求列表 MaxCompute Spark包 (写文章时刻为版本 0.32.1, 请自行更新,本文不是文档) Spark 配置 spark.hadoop.odps.project.name = <安全信息> spark.hadoop.odps.access.id = <安全信息> spark.hadoop.odps.access.key = <安全信息> spark.executor.instances = 2 spark.executor.cores = 2 spark.executor.memory = 4g spark.driver.cores = 2 spark.driver.memory = 4g spark.master = yarn-cluster spark.hadoop.odps.task.major.version = cupid_v2 spark.sql.catalogImplementation=odps spark.hadoop.odps.cupid.container.image.enable = true spark.hadoop.odps.cupid.container.vm.engine.type = hyper spark.hadoop.odps.end.point = http://service.cn.maxcompute.aliyun.com/api spark.hadoop.odps.runtime.end.point = http://service.cn.maxcompute.aliyun-inc.com/api spark.sql.catalogImplementation = odps spark.hadoop.odps.cupid.vpc.domain.list = 参考文档 https://github.com/aliyun/MaxCompute-Spark/wiki/09.-VPC-Access%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E spark.hadoop.odps.cupid.smartnat.enable = 参考文档 https://github.com/aliyun/MaxCompute-Spark/wiki/09.-VPC-Access%E6%96%87%E6%A1%A3%E8%AF%B4%E6%98%8E Spark样例工程模版 hbase控制台的vpc id zk endpoint都是需要的信息 白名单添加 100.0.0.0/8 这样可以让maxcompute机器访问 hbase服务 最好下载hbase shell 来校验测试是否成功 执行步骤 测试代码路径 ~/spark-2.x/src/main/scala/com/aliyun/odps/spark/examples/SparkPi.scala 解压样例工程 mvn clean package 记得改掉SparkPi文件里的 zkAddress 之后才测试 如果表没有创建,需要用代码里面注释掉的创建表代码先创建表 执行命令 bin/spark-submit --master yarn-cluster --properties-file ~/SparkConf/spark-defaults.conf --class com.aliyun.odps.spark.examples.SparkPi ~/Code/github/mc-spark-examples/spark-2.x/target/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar --master local表示本地执行 zkAddress用的是hbase外网地址,如果是--master yarn-cluster则表示提交到集群执行,用的是专用网络地址 下载了hbase-shell之后,本地更改 conf/hbase-site.xml 并且记得把本地的公网ip加到hbase白名单里,不然也访问不了 <configuration> <property> <name>hbase.zookeeper.quorum</name> <value>这里填外网地址</value> </property> </configuration> hbase命令 bin/hbase shell list scan 'test' 如果hbase shell里能够看到你写入的记录,就差不多了同时需要关注的是,alihbase不能直接用社区的hbase client包访问,详细看样例工程还有他们的文档 https://help.aliyun.com/document_detail/166161.html?spm=a2c4g.11174283.6.833.1ec9363feo117z 本文档纯粹是自我记录 不是帮助文档
问题描述 Hive ORC table常规小文件过多问题,于是用Spark写了一个Application来自动的Merge分区数据,思路很简单大概就是 insert overwrite table partition (分区 XXX) select * from table where (分区 XXX)当然已经把该dataframe repartition到想要的目标并发度,来控制最终分区下的文件个数 但是发现生成的文件个数虽然是对的,但是最后整个分区的Size竟然几乎翻倍。 排查过程以及结论 怀疑是Spark SQL没有压缩或者压缩格式不对 https://stackoverflow.com/questions/48759909/how-to-check-if-zlib-compression-is-enabled-in-hive-tables 用这个链接的方式自查一下发现 hive 生成的文件默认是zlib而spark生成的文件默认是snappy 这个导致了最终文件大小相差较大
由于安全原因,用户无法触达生产集群的网络,所以MaxCompute Spark一直没有放开 yarn-client的支持,也就是Spark-Shell,Spark-SQL以及PYSPARK等交互式功能一直无法支持。最近调研了Zeppelin框架,配合MaxCompute Spark的相关特性以及组件,开发支持了Zeppelin on MaxCompute Spark来支持相对应的交互式探索需求。 步骤说明 因为配置以及启动比较繁琐,用户未必会对这方面的事情感兴趣,所以我封装了一个一键启动的脚本,见 spark-zeppelin-public.sh 下载脚本到本地后,运行 sh spark-zeppelin-public.sh 后,会自动下载相关组件如下 spark-zeppelin-public.conf spark-zeppelin-public.jar spark-2.3.0-odps0.32.0.tar.gz 第一次运行脚本会出现以下错误,这是因为默认的spark-zeppelin-public.conf并没有配置accessId,accessKey,projectName linxuewei:spark-zeppelin-public linxuewei$ sh spark-zeppelin-public.sh working dir: /Users/linxuewei/Desktop/spark-zeppelin-public download spark-zeppelin-public.conf download spark-zeppelin-public.jar download spark-2.3.0-odps0.32.0.tar.gz extract spark-2.3.0-odps0.32.0.tar.gz export SPARK_HOME spark-zeppelin-public.conf checking TBD count is 3, plz check config make sure id key project is written! config check failed, plz set id key project in spark-zeppelin-public.conf 正常配置 spark-zeppelin-public.conf 之后再运行 sh spark-zeppelin-public.sh linxuewei:spark-zeppelin-public linxuewei$ sh spark-zeppelin-public.sh working dir: /Users/linxuewei/Desktop/spark-zeppelin-public export SPARK_HOME spark-zeppelin-public.conf checking config check passed, start spark-submit 就会启动一个MaxCompute Spark作业,等待作业执行结束之后,可以回溯日志,找到logview http://logview.odps.aliyun.com/logview/?h=http://service.cn.maxcompute.aliyun.com/api&p=zky_test&i=20190710044052214gy6kc292&token=eXN6eFlsNmQzOFV4dUIzVEVndm9KQUtVSlVNPSxPRFBTX09CTzpwNF8yNDcwNjM5MjQ1NDg0NDc5NzksMTU2Mjk5Mjg1Mix7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6cHJvamVjdHMvemt5X3Rlc3QvaW5zdGFuY2VzLzIwMTkwNzEwMDQ0MDUyMjE0Z3k2a2MyOTIiXX1dLCJWZXJzaW9uIjoiMSJ9 打开 logview 点击 master-0 点击 StdOut # 日志中的这个url,就是zeppelin server的地址了 # 直接复制粘贴到浏览器上即可访问,弹出的url会需要云账号的登录 Please visit the following url for zeppelin interaction. http://20190710044052214gy6kc292-zeppelin.open.maxcompute.aliyun.com Log dir doesn't exist, create /worker/zeppelin_logs/ Pid dir doesn't exist, create /worker/zeppelin_pids/ Zeppelin start [60G[[0;32m OK [0;39m] 打开 zeppelin url 打开 Examples Notebook,有时候页面会显示endpoint not exist的日志,这是因为zeppelin还没有启动完毕的情况,稍等片刻就可以 如果页面弹出一个 interpreter binding的页面,直接点击Save即可,然后再点击ToolBar上的运行所有按钮即可执行Notebook上的代码的执行 从 examples 样例中我们可以看到,NoteBook支持三种语法 以 %spark 开头表示 scala 执行器 如果不写就默认是这个模式 以 %sql 开头表示 spark-sql 执行器,默认用ODPS External Catalog 以 pyspark 开头表示 pyspark 执行器,默认用我们打包好的 python2.7 问题咨询 有问题就找峰七(林学维)即可。有了这个Zeppelin,有时候我们有一些语法或者spark接口上面不清楚的就可以现在notebook上执行,然后再写进工程代码里,不用一遍一遍的提交那么没有效率了。 这个模式相对于local模式更有力的地方是,这个模式其实是真实用了yarn-cluster模式运行着的,local模式仅仅能验证语法是否正确,而zeppelin模式能以分布式的方式提供交互式查询,这个对于那种需要关注性能结果的debugging是有帮助的。 资源释放 本质上Zeppelin Server on MaxCompute Spark还是一个Spark作业,默认这个作业会存活三天,如果你想手动关闭这个作业的话,就请用odpscmd,用kill <instanceId>; 命令来停止作业释放资源吧。
MaxCompute Spark 是什么? 阿里云的用户大部分应该都听说过MaxCompute,但是MaxCompute Spark是什么?我尝试用几个问题来回答这个问题。 公司准备把Spark的业务和作业上阿里云,从以前的经验来看,运维Spark+Hadoop集群可是个重头活,存不存在这种提供Spark服务的PaaS产品? 公司的部分业务以及作业顺利迁移至MaxCompute了,Spark作业还得能够和MaxCompute的数据无缝集成呀? 云上的Spark作业成本不知道该怎么打算盘了? MaxCompute Spark提供了: 全托管、与MaxCompute一体化集成的Spark解决方案,只需关注Spark Application开发,没有集群运维的脏活累活。 从调度上、存储上,与MaxCompute native集成,性能最优解;并且能够无缝集成MaxCompute本身的数据。 Paas模式,单作业计费模式,比构建一个Spark集群更加便宜。 更多详情请看 https://help.aliyun.com/document_detail/102357.html?spm=a2c4g.11186623.6.765.326d7bc3Scfwxb 用MaxCompute Spark快速冒烟 我将以一个开发者的角色,以一个快速冒烟的Case,过一遍MaxCompute Spark的冒烟过程。 !!!前置依赖 !!!唯一的前置依赖是,已经是MaxCompute客户,并获取MaxCompute的 projectName accessId accessKey 步骤一 获取MaxCompute Spark客户端 spark-2.3.0 请下载Spark客户端并且解压到本地的任意目录 步骤二 配置spark-defaults.conf # 解压后的下述路径有一个配置的模版 ${SPARK_HOME}/conf/spark-defaults.conf.template # 需要做一个rename操作 mv spark-defaults.conf.template spark-defaults.conf # Edit 以下配置只需要填入projectName accessId accessKey即可 # OdpsAccount Info Setting spark.hadoop.odps.project.name = spark.hadoop.odps.access.id = spark.hadoop.odps.access.key = spark.hadoop.odps.end.point = http://service.cn.maxcompute.aliyun.com/api # this endpoint should not change spark.hadoop.odps.runtime.end.point = http://service.cn.maxcompute.aliyun-inc.com/api # Resource Requirement # spark.executor.instances = 1 # spark.executor.cores = 2 # spark.executor.memory = 6g # spark.driver.cores = 2 # spark.driver.memory = 4g # spark.master = yarn-cluster # Cupid Service Version spark.hadoop.odps.task.major.version = cupid_v2 # Odps Catalog spark.sql.catalogImplementation = odps # Cupid Longtime Job # spark.hadoop.odps.cupid.engine.running.type = longtime # spark.hadoop.odps.cupid.job.capability.duration.hours = 8640 # spark.hadoop.odps.moye.trackurl.dutation = 8640 # SparkR Setting # odps.cupid.spark.r.archive=/path/to/R-PreCompile-Package.zip spark.hadoop.odps.cupid.webproxy.endpoint: http://service.cn.maxcompute.aliyun-inc.com/api spark.hadoop.odps.moye.trackurl.host: http://jobview.odps.aliyun.com 步骤三 编写Spark Application 因为此Demo是冒烟意图,所以我们已经有一个写好了的SparkPi供客户直接使用 git clone git@github.com:aliyun/aliyun-cupid-sdk.git cd aliyun-cupid-sdk git checkout -b 3.3.3-public -t origin/3.3.3-public cd spark/spark-2.x/spark-examples/ mvn clean package # 编译完成后 以下jar包就是可以直接用来提交 /path/to/aliyun-cupid-sdk/spark/spark-2.x/spark-examples/target/spark-examples_2.11-3.3.3-public-shaded.jar 步骤四 spark-submit 提交作业 cd ${SPARK_HOME} bin/spark-submit --master yarn-cluster \ --class com.aliyun.odps.spark.examples.SparkPi \ /path/to/aliyun-cupid-sdk/spark/spark-2.x/spark-examples/target/spark-examples_2.11-3.3.3-public-shaded.jar # 正常提交我们可以看到两个URL # logview MaxCompute内置的WebUI http://logview.odps.aliyun.com/logview/?h=http://service.cn.maxcompute.aliyun.com/api&p=smoketest_ay20c&i=20190516110817581gbofkmim&token=RFZiMlNMUW5Ua2dUSHE5NkE5ZFRlUjRFTldJPSxPRFBTX09CTzoxNDM1NzcwMjYwMzQ2NTMxLDE1NTgyNjQwOTcseyJTdGF0ZW1lbnQiOlt7IkFjdGlvbiI6WyJvZHBzOlJlYWQiXSwiRWZmZWN0IjoiQWxsb3ciLCJSZXNvdXJjZSI6WyJhY3M6b2RwczoqOnByb2plY3RzL3Ntb2tldGVzdF9heTIwYy9pbnN0YW5jZXMvMjAxOTA1MTYxMTA4MTc1ODFnYm9ma21pbSJdfV0sIlZlcnNpb24iOiIxIn0= # jobview Spark内置的WebUI http://jobview.odps.aliyun.com/proxyview/jobview/?h=http://service.cn.maxcompute.aliyun-inc.com/api&p=smoketest_ay20c&i=20190516110817581gbofkmim&t=spark&id=application_1558004886350_754895007&metaname=20190516110817581gbofkmim&token=a2YxYnAraFVLbHVvM1poNjNHdDE5WThodFhFPSxPRFBTX09CTzoxNDM1NzcwMjYwMzQ2NTMxLDE1NTgyNjQxMzUseyJTdGF0ZW1lbnQiOlt7IkFjdGlvbiI6WyJvZHBzOlJlYWQiXSwiRWZmZWN0IjoiQWxsb3ciLCJSZXNvdXJjZSI6WyJhY3M6b2RwczoqOnByb2plY3RzL3Ntb2tldGVzdF9heTIwYy9pbnN0YW5jZXMvMjAxOTA1MTYxMTA4MTc1ODFnYm9ma21pbSJdfV0sIlZlcnNpb24iOiIxIn0= 这两个Url可以看到Spark作业的执行结果以及状态跟踪,至此,我们就非常简单的完成了Spark作业的提交。 技术支持 还是一句话,如果你想甩掉Spark集群的运维,并且以低成本高效的方式运行Spark服务,就来咨询我们团队吧! 用钉钉扫码咨询我们吧!
2019年07月