[笔记] 用单节点HIVE+SPARK执行ETL任务

动机

本身是java码农. 运维的Hadoop小集群上硬盘故障已经成为每天日常, 有各种hdfs故障. 最严重一次,文件没法从datanode同步到namenode的情况,导致集群完全不可用.

目前很多ELT任务都是用Spark和Hive实现的从kafka导入数据到HDFS,清洗后导入数据库. ETL代码里可能完全看不到Hdfs, 大部分都是Hive的sql操作或者Spark的rdd操作, 但Hadoop作为承载数据的基础设施, 是Hive和Spark的重要依赖. 在没有Hadoop集群运行的情况下, ETL任务还能不能运行呢?
(Hive on Spark on Yarn on Hadoop 是一般标准配置....每一层都是可以换的)

准备

1. 安装Hadoop(大概步骤,完整安装过程请参考其他文章)

wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.0.3/hadoop-3.0.3-src.tar.gz
1.1. 配置环境变量(~/.bash_profile或者其他系统环境变量)
export HADOOP_CONF_DIR=hadoop安装目录/etc/hadoop

只是安装,不需要启动

2. 安装Hive

wget http://mirror.bit.edu.cn/apache/hive/hive-3.1.1/apache-hive-3.1.1-bin.tar.gz
2.1. 配置环境变量(~/.bash_profile或者其他系统环境变量)
export HIVE_HOME=Hive安装目录
2.2. 执行metastore初始化
cd Hive安装目录/bin
./schematool -dbType mysql -initSchema -url jdbc:mysql://mysql数据库:3306/metastore数据库名 -userName 数据库用户名 -passWord 数据库密码

执行成功后, 到数据库里就能看到hive初始化了一堆表来存储元数据,(恩,Hive作为一个数据仓库,用其他数据库来存储Hive的元数据)

2.3. 启动metastore
cd Hive安装目录/bin
hive --service metastore

3. 安装Spark

wget http://mirror.bit.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0.tgz
3.1.编译Spark

注意这里下载的是spark源代码,因为spark本身带一个Hive1.21的实现,要在编译的时候去掉.
(实际上Hive on Spark还有一些其他细节....)

tar xzf spark-2.4.0.tgz
cd spark-2.4.0
export MAVEN_OPTS="-Xmx8g -XX:ReservedCodeCacheSize=2048m"; ./dev/make-distribution.sh --name "without-hive" --tgz "-Pscala-2.12,-Pyarn,hadoop-provided,hadoop-3.1,parquet-provided,orc-provided,-DskipTests"

编译完成后会在当前目录下生成 spark-2.4.0-bin-without-hive.tgz,解压到安装路径后配置环境变量

export SPARK_HOME=安装路径/spark-2.4.0-bin-without-hive

(免责)以下配置(作死)都是针对以上安装的版本, 换别的版本绝对会炸.

4 配置Hive on Spark

4.1 配置 Hive安装路径/conf/hive-env.sh
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=$SPARK_HOME/jars

我观察到hive执行的classpath大概顺序是

  1. Hive安装路径下的lib里的jar
  2. HIVE_AUX_JARS_PATH变量指定的路径下的jar
  3. Hadoop安装路径/share下的jar
    很重要, 版本冲突的jar可能很雷
4.1 配置 Hive安装路径/conf/hive-site.xml
<property>
    <name>fs.default.name</name>
<!-- 没有hdfs用,配置一个本地路径,内存大的土豪可以搞个内存映射盘,美滋滋(๑¯ิε ¯ิ๑)
    <value>hdfs://hadoop-3-cluster/user/hive/warehouse</value>-->
    <value>file:///data/hive</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
<!-- <value>hdfs://hadoop-3-cluster/user/hive/warehouse</value>-->
    <value>file:///data/hive/warehouse</value>
</property>
<!-- 配置spark的话 -->
 <property>
    <name>hive.execution.engine</name>
    <value>spark</value>
</property>
 <property>
    <name>spark.master</name>
    <value>local</value> <!-- 本地模式,不依赖集群, 和Hive运行在一个进程中 -->
</property>
4.2 解决jar包冲突(折腾了几天 ( ╯-_-)╯┴—┴ )

在Hive安装路径/lib下, Jackson是这个版本

jackson-annotations-2.9.4.jar  
jackson-core-2.9.4.jar  
jackson-databind-2.9.4.jar  

而Spark安装路径/jar下,Jackson是这个版本

jackson-annotations-2.6.7.jar
jackson-core-2.6.7.jar
jackson-databind-2.6.7.1.jar
jackson-module-paranamer-2.7.9.jar
jackson-module-scala_2.12-2.6.7.1.jar

当Spark调用jackson处理json时,因为hive的classpath的顺序,调用2.9.4的包.
所以把Spark安装路径/jar下Jackson的jar都换成和Hive安装路径/lib下一致的2.9.4版

jackson-annotations-2.9.4.jar
jackson-core-2.9.4.jar
jackson-databind-2.9.4.jar
jackson-module-paranamer-2.9.4.jar
jackson-module-scala_2.12-2.9.4.jar

那么,在哪里能找到这些jar包呢?
答案和maven一样,在maven仓库搜索

Capture.PNG

第二个jar包冲突是paramname
Hive安装目录/lib是paranamer-2.3.jar
Spark安装目录/jars是paranamer-2.8.jar
将Hive安装目录/lib里paranamer-2.3.jar换成和Spark一致, paranamer-2.8.jar.(一般尽量往高版本升级)

第三个jar包冲突很隐蔽,是lz4-java-1.4.0.jar
Spark安装目录/jars是lz4-java-1.4.0.jar
Hive安装目录/lib里却没有任何lz4-java的jar
其实是在hive-druid-handler-3.0.0.jar
具体错误日志是:

2018-12-03T09:39:53,502  INFO [dag-scheduler-event-loop] scheduler.DAGScheduler: ResultStage 3 (Reducer 2) failed in 375.053 s due to Job aborted due to stage failure: Task 0 in stage 3.0 failed 1 times, most recent failure: Lost task 0.0 in stage 3.0 (TID 3, localhost, executor driver): java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V
        at org.apache.spark.io.LZ4CompressionCodec.compressedInputStream(CompressionCodec.scala:122)
        at org.apache.spark.serializer.SerializerManager.wrapForCompression(SerializerManager.scala:163)
        at org.apache.spark.serializer.SerializerManager.wrapStream(SerializerManager.scala:124)
        at org.apache.spark.shuffle.BlockStoreShuffleReader.$anonfun$read$1(BlockStoreShuffleReader.scala:50)
        at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:453)
        at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:64)
        at scala.collection.Iterator$$anon$11.nextCur(Iterator.scala:480)               

如果不需要hive和druid集成,就把hive-druid-handler-3.0.0.jar删除即可....

至此,Hive+Spark单机版配置完成,感觉比hdfs执行速度还快了一点.....

Hive配合UDF(读写kafka,http,redis等)食用效果更佳.... (๑乛◡乛๑)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容