目录
1.spark客户端查询hive表没有数据,但是hive客户端查询表有数据
1.环境准备
一共4个节点,master1,worker1,worker2,worker3
配置master1到worker1,worker2,worker3的免密登录
节点名称 | 节点角色 |
---|---|
master1 | master |
worker1 | worker |
worker2 | worker |
worker3 | worker |
2.版本选择
3.下载
这里使用spark-3.1.3-bin-hadoop3.2这个版本
wget https://archive.apache.org/dist/spark/spark-3.1.3/spark-3.1.3-bin-hadoop3.2.tgz
4.解压
tar -xzvf spark-3.1.3-bin-hadoop3.2.tgz -C /data/
5.修改配置
1.配置worker
cp workers.template workers
vim workers
worker1
worker2
worker3
2.配置spark运行环境
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_MASTER_HOST=master1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8081
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=1g
3.配置spark参数
cp spark-defaults.conf.template spark-defaults.conf
4.配置spark日志
cp log4j.properties.template log4j.properties
调整log4j.rootCategory的参数即可,这里不做修改
6.配置连接hive源
将hive的hive-site复制到spark的conf下
cp /etc/hive/conf/hive-site.xml /data/spark-3.1.3-bin-hadoop3.2/conf/
将hive的mysql驱动包复制到spark的jars下
cp /usr/share/java/mysql-connector-java.jar /data/spark-3.1.3-bin-hadoop3.2/jars/
将hdfs的hdfs-site.xml和core-site.xml复制到spark的conf下
cp /etc/hadoop/conf/hdfs-site.xml /data/spark-3.1.3-bin-hadoop3.2/conf/
cp /etc/hadoop/conf/core-site.xml /data/spark-3.1.3-bin-hadoop3.2/conf/
7.配置history服务
这个建议配置,不配置的话任务提交到yarn上执行完成之后是看不了任务的history的。
1.修改spark-defaults.conf
添加以下内容
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master1:8020/logs/spark
spark.eventLog.compress true
//如果是提交到yarn上加上下列配置
spark.yarn.historyServer.address master1:18080
spark.history.ui.port 18080
需要注意的是要在hdfs上创建日志目录
hdfs的路径可以去core-site.xml文件查看fs.defaultFS的value值
less /etc/hadoop/conf/core-site.xml
创建上述目录 hadoop dfs -mkdir /logs hadoop dfs -mkdir /logs/spark
2.修改spark-env.sh
添加以下内容 export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=50 -Dspark.history.fs.logDirectory=hdfs://master1:8020/logs/spark"
8.配置分发到其他节点
scp -f /data/spark-3.1.3-bin-hadoop3.2 worker1:/data/
scp -f /data/spark-3.1.3-bin-hadoop3.2 worker2:/data/
scp -f /data/spark-3.1.3-bin-hadoop3.2 worker3:/data/
9.系统环境变量设置
vim /etc/profile
export SPARK_HOME=/data/spark-3.1.3-bin-hadoop3.2
export PATH=$PATH:$SPARK_HOME/bin
source /etc/profile
10.服务启动停止
启动
sh /data/spark-3.1.3-bin-hadoop3.2/sbin/start-all.sh
如果配置了history服务
sh /data/spark-3.1.3-bin-hadoop3.2/sbin/start-history-server.sh
停止
sh /data/spark-3.1.3-bin-hadoop3.2/sbin/stop-all.sh
查看是否启动
jps
在master 上会有master进程,在worker上有worker进程,如果启动了history会有一个history的进程
查看启动进程
11.端口说明
4040:任务运行web-UI界面
8081:spark集群web-UI界面,采用standalone方式提交的任务才能看到--master spark://master1:7077,--master yarn的要在yarn上查看且开启history服务
7077:spark提交任务时的通信端口
18080:spark的history web-ui界面
12.测试
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master1:7077 ./examples/jars/spark-examples_2.12-3.1.3.jar 10
bin/spark-sql --master spark://master1:7077 --num-executors 15 --executor-memory 2g --executor-cores 1 --driver-memory 1g --driver-cores 2 --total-executor-cores 1 4 --conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true --conf spark.sql.shuffle.partitions=20
13.常见问题
1.spark客户端查询hive表没有数据,但是hive客户端查询表有数据
原因是spark读取不了hive3的内表数据
解决方式
1.建表使用外表external
2.设置默认创建的表不是acid表
这个是网上的访问,验证发现不可行,不知道是哪里的问题
修改hive-site.xml下面参数,让默认创建的表不是acid表
hive.strict.managed.tables=false hive.create.as.insert.only=false metastore.create.as.acid=false
2.spark查询hive创建的表报错
Error in query: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table tmp_test5. Your client does not appear to support insert-only tables
show create table tmp_test5
发现表属性是事务表
'transactional'='true',
'transactional_properties'='insert_only'
解决方式
修改hive-site.xml下面参数,让默认创建的表不是acid表
hive.strict.managed.tables=false hive.create.as.insert.only=false metastore.create.as.acid=false