本篇文章为自己总结,都是干货和精华。其中有许多文章引用,我直接粘贴在代码里,请注意。
1.idea集成开发环境
https://blog.csdn.net/u012373815/article/details/53266301
2.报错:
scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps
解决办法:
https://blog.csdn.net/weixin_42129080/article/details/80961878
3.报错
ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
解决办法:
(1)下载工具
hadoop2.2版本可以在这里下载https://github.com/srccodes/hadoop-common-2.2.0-bin
hadoop2.6版本可以在这里下载https://github.com/amihalik/hadoop-common-2.6.0-bin
(2)配置环境变量
①增加系统变量HADOOP_HOME,值是下载的zip包解压的目录,我这里解压后将其重命名为hadoop-common-2.6.0
②在系统变量path里增加%HADOOP_HOME%\bin
作者:PunkP
链接:https://www.jianshu.com/p/55d36c47cc33
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
4.报错
ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Could not parse Master URL: '192.168.10.166'
5.执行:
./spark-submit --class bi.demo.MySpark --master localhost:7077 /home/zybigdata/bak/bi.jar
首先找到spark的bin目录,使用脚本 whereis spark
其次,上传jar文件,到linux目录
最后确定class的主类:bi.demo.MySpark
6.spark结合hive开发
参考:http://dblab.xmu.edu.cn/blog/1086-2/
首先来测试是否有hive:
cd /usr/local/spark
./bin/spark-shell
Shell 命令
这样就启动进入了spark-shell,然后在scala命令提示符下输入:
scala> import org.apache.spark.sql.hive.HiveContext
<console>:25: error: object hive is not a member of package org.apache.spark.sql
import org.apache.spark.sql.hive.HiveContext
^
scala
看到了吧,会返回错误信息,也就是spark无法识别org.apache.spark.sql.hive.HiveContext,这就说明你当前电脑上的Spark版本不包含Hive支持。
如果你当前电脑上的Spark版本包含Hive支持,那么应该显示下面的正确信息:
scala> import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.hive.HiveContext
其次来测试一把用spark操作hive吧。
scala> import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.hive.HiveContext
scala> val hiveCtx = new HiveContext(sc)
warning: there was one deprecation warning; re-run with -deprecation for details
hiveCtx: org.apache.spark.sql.hive.HiveContext = org.apache.spark.sql.hive.HiveContext@1d67348a
scala> val studentRDD = hiveCtx.sql("show databases").rdd
studentRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[3] at rdd at <console>:27
scala> val studentRDD = hiveCtx.sql("select * from zy_dm.dm_prod_profit_dtl_tc_d limit 10").rdd
studentRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[13] at rdd at <console>:27
scala> studentRDD.foreach(t => print("org_id"+t(3)))
org_id201809org_id201802org_id201806org_id201801org_id201805org_id201803org_id201804org_id201806org_id201804org_id201804
scala>
7.操作hive
接下来开始尝试测试操作hive
package bi.spark4Hive
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.hive.HiveContext
object Spark4Hive {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("test").setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new HiveContext(sc)
sqlContext.table("zy_dm.dm_prod_profit_dtl_tc_d") // 库名.表名 的格式
.registerTempTable("tmp_dm_prod_profit_dtl_tc_d") // 注册成临时表
sqlContext.sql(
"""
| select *
| from tmp_dm_prod_profit_dtl_tc_d
| limit 10
""".stripMargin).show()
sc.stop()
}
}
[zybigdata@etl /usr/local/spark/bin]$ ./spark-submit --class bi.spark4Hive.Spark4Hive --master localhost:7077 /home/zybigdata/bak/bi.jar
+----------+---------+------+------+----------------+------------------+------------+
|snapt_date|model_ind|org_id|cur_ym|prod_category_id|prod_category_name|gross_profit|
+----------+---------+------+------+----------------+------------------+------------+
|2018-10-14| 0| 1|201809| 4| 体检| 0.00000|
|2018-10-14| 0| 5|201802| 1| 其他|904227.25000|
|2018-10-14| 0| 5|201806| 2| 人事代理| 25477.00000|
|2018-10-14| 0| 12|201801| 1| 其他|603420.36000|
|2018-10-14| 0| 12|201805| 2| 人事代理| 0.00000|
|2018-10-14| 0| 26|201803| 2| 人事代理| 8360.00000|
|2018-10-14| 0| 36|201804| 4| 体检| 0.00000|
|2018-10-14| 0| 375|201806| 3| 工资服务| 17171.37000|
|2018-10-14| 0| 2989|201804| 2| 人事代理| 0.00000|
|2018-10-14| 0| 5607|201804| 1| 其他| 8100.00000|
+----------+---------+------+------+----------------+------------------+------------+
[zybigdata@etl /usr/local/spark/bin]$
8.sql太长了,跑任务报错
18/10/15 15:01:16 WARN Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
[Stage 7:=============================> (1 + 1) / 2]18/10/15 15:04:17 ERROR Utils: Aborting task
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.IllegalArgumentException: No enum constant org.apache.hadoop.io.SequenceFile.CompressionType.block
at org.apache.hadoop.hive.ql.io.HiveFileFormatUtils.getHiveRecordWriter(HiveFileFormatUtils.java:249)
at org.apache.spark.sql.hive.execution.HiveOutputWriter.<init>(HiveFileFormat.scala:123)
at org.apache.spark.sql.hive.execution.HiveFileFormat$$anon$1.newInstance(HiveFileFormat.scala:103)
at org.apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.newOutputWriter(FileFormatWriter.scala:305)
at org.apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.execute(FileFormatWriter.scala:314)
解决办法:
/usr/local/spark/bin/spark-submit --conf spark.debug.maxToStringFields=100 --class bi.spark4Hive.Spark4Hive_test04 --master localhost:7077 /home/zybigdata/jar/bi.jar
python脚本
9.好多报错总结,很好的博文
https://www.cnblogs.com/qifengle-2446/p/6424377.html
https://www.cnblogs.com/hadoop-dev/p/6742677.html
hive目录
/usr/lib/hive
hive配置路径
/usr/lib/hive/conf
hive的jar路径
/home/zybigdata/lib
spark依赖jar包
/usr/local/spark/jars/mysql-connector-java-5.1.34-bin.jar
spark写东西到pg中
https://blog.csdn.net/dream_an/article/details/54962464
10.spark 的set local
setMaster("local")可以运行,但是设置成setMaster("local[3]")或setMaster("local[*]")则报错。
一、Spark中本地运行模式
Spark中本地运行模式有3种,如下
(1)local 模式:本地单线程运行;
(2)local[k]模式:本地K个线程运行;
(3)local[*]模式:用本地尽可能多的线程运行。
11.spark日志级别设置
https://blog.csdn.net/a123demi/article/details/72821488
12.spark dataframe 操作介绍
https://www.cnblogs.com/rxingyue/p/7113235.html
13.所有hadoop、spark集群搭建。
https://www.cnblogs.com/purstar/p/6293605.html
该文档为spark集群搭建文档
14.spark Scala中的Implicit详解
https://www.jianshu.com/p/1d119c937015
Scala在面对编译出现类型错误时,提供了一个由编译器自我修复的机制,编译器试图去寻找
一个隐式implicit的转换方法,转换出正确的类型,完成编译。这就是implicit 的意义。
注意!
需要注意的是,进一步简化之后,代码的可读性有所损失,调用方并不知道startServer需要一个隐式的
配置对象,要么加强文档说明,要么选用显式的申明,这种权衡需要团队达成一致。