介绍
大数据实时计算平台搭建,由hdfs hbase spakr kafka hive等环境组成,由于大数据环境各种坑,特写此文档记录
环境准备
服务器
IP 10.255.50.8 主机名 IPTV-Spark-4 主节点 nn01
IP 10.255.50.17 主机名 IPTV-Spark-5 从节点1 nn02
IP 10.255.50.37 主机名 IPTV-Spark-6 从节点2
软件及相关版本
Jdk 1.8.171
hadoop hadoop-2.6.5
hbase hbase-1.2.5
zookeeper zookeeper-3.4.9
kafka kafka-2.11
scala scala-2.11.7
spark spark1.6.0
tez tez-0.8.5
hive apache-hive-2.1.1-bin
其中hive安装在主节点
防火墙
关闭selinux
防火墙开放三台相互访问不限端口
配置服务器免密登录
为三台服务器都创建一个hadoop用户,配置三台服务器之间hadoop用户免密登录,具体命令省略。。。
配置hosts
vim /etc/hosts
10.255.50.8 IPTV-Spark-4
10.255.50.17 IPTV-Spark-5
10.255.50.37 IPTV-Spark-6
注意
后面所有操作未特别注明都已hadoop用户操作
提前配置好相关目录权限
JDK安装
# 解压
tar xf jdk-8u171-linux-x64.tar.gz -C /web/soft/
# 配置环境变量
echo 'JAVA_HOME=/web/soft/jdk-8u171-linux-x64
export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
Zookeeper集群搭建
安装
tar xf zookeeper-3.5.4-beta.tar.gz -C /web/soft/
配置环境变量
echo '# zookeeper
export PATH=$PATH:/web/soft/zookeeper-3.5.4-beta/bin' >> ~/.bashrc
zookeeper 配置文件
conf/zoo.cfg
#心跳间隔
tickTime=2000
#初始容忍的心跳数
initLimit=10
#等待最大容忍的心跳数
syncLimit=5
#本地保存数据的目录
dataDir=/web/soft/zookeeper-3.5.4-beta/data
#客户端默认端口号
clientPort=2181
server.0=10.255.50.8:2888:3888
server.1=10.255.50.17:2888:3888
server.2=10.255.50.37:2888:3888
data/myid
mkdir /web/soft/zookeeper-3.5.4-beta/data
# 第一个节点0 第二个1 以此类推
echo '0' > /web/soft/zookeeper-3.5.4-beta/data/myid
最后启动服务器
zkServer.sh start
zkServer.sh status
HDFS+HA搭建
安装
Hadoop软件目录为/web/soft/,将hadoop安装包解压安装到该目录下
tar xf hadoop-2.6.5.tar.gz -C /web/soft/
创建相关数据目录
在每个节点上创建程序存储目录,并将相关目录授权给hadoop用户
mkdir -p /web/data/hadoopdata/journal
mkdir -p /web/data/hadoopdata/tmp
mkdir -p /web/data/hadoopdata/tmp/dfs/name
每台服务器配置环境变量
vim ~/.bashrc
# hadoop
export HADOOP_HOME=/web/soft/hadoop-2.6.5
export HADOOP_PREFIX=/web/soft/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
####hadoop-env####
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib:${HADOOP_HOME}/lib/native"
#ssh port
export HADOOP_SSH_OPTS="-p 17122"
hadoop配置文件
配置文件所在目录为
/web/soft/hadoop-2.6.5/etc/hadoop
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://HN</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/web/data/hadoopdata/journal</value>
</property>
<property>
<!--hadoop.tmp.dir 是 hadoop文件系统依赖的基本配置,很多配置路径都依赖它 -->
<name>hadoop.tmp.dir</name>
<value>/web/data/hadoopdata/tmp</value>
</property>
<property>
<!-- 配置zookeeper 集群信息-->
<name>ha.zookeeper.quorum</name>
<value>IPTV-Spark-4:2181,IPTV-Spark-5:2181,IPTV-Spark-6:2181</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>20</value>
<description>
Indicates the number of retries a clientwill make to establisha server connection.
</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>5000</value>
<description>
Indicates the number of milliseconds aclient will wait for before retrying to establish a server connection.
</description>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<!--HDFS 命名服务的逻辑名称,可用户自己定义,比如 mycluster-->
<name>dfs.nameservices</name>
<value>HN</value>
</property>
<property>
<!--某个命名服务下包含的 NameNode 列表,可为每个 NameNode 指定一个自定义的 ID 名称,比如命名服务 HN 下有两个 NameNode,分别命名为 nn1 和 nn2-->
<name>dfs.ha.namenodes.HN</name>
<value>nn01,nn02</value>
</property>
<!--为每个 NameNode 设置对外的 rpc 地址 -->
<property>
<name>dfs.namenode.rpc-address.HN.nn01</name>
<value>IPTV-Spark-4:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.HN.nn02</name>
<value>IPTV-Spark-5:8020</value>
</property>
<!--为每个 NameNode 设置对外的 http 地址 -->
<property>
<name>dfs.namenode.http-address.HN.nn01</name>
<value>IPTV-Spark-4:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.HN.nn02</name>
<value>IPTV-Spark-5:50070</value>
</property>
<!--设置一组 journalNode 的 URI 地址,active NameNode 将 edit log 写入这些JournalNode,而 standby NameNode 读取这些 edit log,并作用在内存中的目录树中, -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://IPTV-Spark-4:8485;IPTV-Spark-5:8485;IPTV-Spark-6:8485/HN</value>
</property>
<property>
<!--设置客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的 active NameNode-->
<name>dfs.client.failover.proxy.provider.HN</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--隔离机制,分别是 shell 和 sshfence-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence
shell(/bin/true) </value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 设置datanode请求超时 -->
<property>
<name>dfs.datanode.socket.write.timeout</name>
<value>6000000</value>
</property>
<property>
<name>dfs.socket.timeout</name>
<value>6000000</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>IPTV-Spark-4</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>IPTV-Spark-5</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>IPTV-Spark-4:2181,IPTV-Spark-5:2181,IPTV-Spark-6:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!--givenNodeManager即资源的可用物理内存,以MB为单位 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>6120</value>
</property>
<!-- 每个容器内存最低限额分配到的资源管理器要求-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!-- 每个容器内存最大限额分配到的资源管理器要求-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>6120</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 对maps更大的资源限制的 -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<!-- maps中对jvm child设置更大的堆大小 -->
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx4096M</value>
</property>
<!--设置 reduces对于较大的资源限制 -->
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
<!-- reduces对 jvm child设置更大的堆大小 -->
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx4096M</value>
</property>
<property>
<name>mapreduce.cluster.map.memory.mb</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.cluster.reduce.memory.mb</name>
<value>-1</value>
</property>
</configuration>
hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_171
export HADOOP_PID_DIR=${HADOOP_HOME}/pids
export YARN_PID_DIR=${HADOOP_HOME}/pids
slaves
IPTV-Spark-4
IPTV-Spark-5
IPTV-Spark-6
同步程序文件到从节点
在IPTV-Spark-4将上面配好的文件复制到各个节点对应的目录:
scp -r /web/soft/hadoop-2.6.5 hadoop@IPTV-Spark-5:/web/soft/
scp -r /web/soft/hadoop-2.6.5 hadoop@IPTV-Spark-6:/web/soft/
首次启动hadoop集群
nn01 和 nn02 两个节点是主备 NameNode,则 HDFS 集群启动顺序如下:
启动所有 ZKFC
启动所有 JournalNode
启动 nn01 和 nn02
启动所有 DataNode
初始化ZKFC
在 nn01 上执行命令:
bin/hdfs zkfc -formatZK
启动所有 JournalNode
在 nn01 上执行命令:
sbin/hadoop-daemons.sh start journalnode
启动 namenode
启动 JournalNode后等2分钟在启动namenode
(1) 在 nn01 上执行命令:
格式化namenode
bin/hdfs namenode -format -force
sbin/hadoop-daemon.sh start namenode
(2)在 nn02 上执行命令:
让 nn02 从 nn01 上拉取最新的 FSimage:
bin/hdfs namenode -bootstrapStandby -force
启动 nn02:
sbin/hadoop-daemon.sh start namenode
启动 ZKFC
(1)在各个 nn01,nn02上,依次输入以下命令启动 ZKFC:
sbin/hadoop-daemon.sh start zkfc
第一个启动的 将成为 active NameNode
(2)查看状态
bin/hdfs haadmin -getServiceState nn01
bin/hdfs haadmin -getServiceState nn02
(3)如果nn1 和 nn2 启动后,都处于 Standby 状态,可在在 nn01 节点上输入 以下命令将它切换为 active:
bin/hdfs haadmin -transitionToActive --forcemanual nn01
启动所有 DataNode
在 nn01 上执行命令:
sbin/hadoop-daemons.sh start datanode
开启nodemanager
在 nn01 上执行命令:
yarn-daemons.sh start nodemanager
开启resourcemanager
在各个 nn01,nn02上,依次输入以下命令启动
yarn-daemon.sh start resourcemanager
验证自动切换功能是否生效
可人工将 active namenode 进程杀死,看是够自动切换到另一个 namenode
状态查看
hdfs dfsadmin -report
后续启停
启动
# NN01
start-dfs.sh
start-yarn.sh
# NN02
yarn-daemon.sh start resourcemanager
停止
# NN01
stop-dfs.sh
stop-yarn.sh
# NN02
ssh node2 'yarn-daemon.sh stop resourcemanager'
进程检查
IPTV-Spark-4
4068 DFSZKFailoverController
4884 Jps
3912 JournalNode
4393 ResourceManager
3402 QuorumPeerMain
4522 NodeManager
3708 DataNode
3581 NameNode
IPTV-Spark-5
2641 DataNode
2547 NameNode
2822 DFSZKFailoverController
3432 Jps
2442 QuorumPeerMain
3084 NodeManager
3342 ResourceManager
2734 JournalNode
IPTV-Spark-6
2592 DataNode
3029 Jps
2455 QuorumPeerMain
2859 NodeManager
2684 JournalNode
常用命令
进入安全模式
bin/hdfs dfsadmin -safemode enter
获取模式状态
bin/hdfs dfsadmin -safemode get
退出安全模式
hadoop dfsadmin -safemode leave
配置磁盘均衡时的带宽(500M)
hdfs dfsadmin -setBalancerBandwidth 524288000
磁盘平衡
hdfs balance -threshold 10
查看namenode 状态
hdfs haadmin -getServiceState nn01
hdfs haadmin -getServiceState nn02
如果nn1 和 nn2 启动后,都处于 Standby 状态,可在在 nn01 节点上输入 以下命令将它切换为 active:
hdfs haadmin -transitionToActive --forcemanual nn01
查看yarn状态
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
状态切换的命令
yarn rmadmin -transitionToActive rm1
查看yarn队列
yarn queue -status default
刷队列的配置
yarn rmadmin -refreshQueues
状态查看
hdfs dfsadmin -report
HBASE集群搭建
安装
hbase软件目录为/web/soft/,将hadoop安装包解压安装到该目录下
tar xf hbase-1.2.5-bin.tar.gz -C /web/soft/
创建数据目录
mkdir /web/data/hbasedata
mkdir /web/data/zkdata
hdfs
hadoop fs -mkdir /hbase
每台服务器配置环境变量
# hbase
export HBASE_HOME=/web/soft/hbase-1.2.5
export PATH=$PATH:$HBASE_HOME/bin
#ssh port
export HBASE_SSH_OPTS="-p 17122"
hbase配置文件:
hbase-env.sh
export HBASE_MANAGES_ZK=false
export HBASE_PID_DIR=${HBASE_HOME}/pids
hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<!--在HDFS上创建一个干净的节点,用于存放元数据-->
<value>hdfs://HN:8020/hbase</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/web/data/hbasedata</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>IPTV-Spark-4,IPTV-Spark-5,IPTV-Spark-6</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/web/data/zkdata</value>
</property>
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.coprocessor.abortonerror</name>
<value>false</value>
</property>
</configuration>
配置regionservers
IPTV-Spark-4
IPTV-Spark-5
IPTV-Spark-6
拷贝hadoop文件
hdfs-site.xml core-site.xml 拷贝到当前配置文件中
同步程序文件到从节点
在IPTV-Spark-4将上面配好的文件复制到各个节点对应的目录:
scp -r /web/soft/hbase-1.2.5 hadoop@IPTV-Spark-5:/web/soft/
scp -r /web/soft/hbase-1.2.5 hadoop@IPTV-Spark-6:/web/soft/
启动hbase集群
start-hbase.sh
检查
hbase shell
> status
常见问题
hbase cannot get log reader问题
hregionserver报以上错误,解决办法:
hbase 版本是1.2.6,下载apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz,将其中phoenix-4.14.0-HBase-1.2-server.jar 放入hbase的lib目录即可解决
scala安装
安装
scala软件目录为/web/soft/,将hadoop安装包解压安装到该目录下
unzip scala-2.11.7.zip -d /web/soft/
每台服务器配置环境变量
#set scala
export SCALA_HOME=/web/soft/scala-2.11.7
export PATH=$SCALA_HOME/bin:$PATH
同步程序文件到从节点
在IPTV-Spark-4将上面配好的文件复制到各个节点对应的目录:
scp -r /web/soft/scala-2.11.7 hadoop@IPTV-Spark-5:/web/soft/
scp -r /web/soft/scala-2.11.7 hadoop@IPTV-Spark-6:/web/soft/
Spark集群搭建
安装
spark软件目录为/web/soft/,将spark安装包解压安装到该目录下
tar xf spark-1.6.0.tar.gz -C /web/soft/
创建数据目录
hdfs
hadoop fs -mkdir /spark-log
每台服务器配置环境变量
#set spark
export SPARK_HOME=/web/soft/spark-1.6.0
export PATH=$SPARK_HOME/bin:$PATH
#ssh port
export SPARK_SSH_OPTS="-p 17122"
spark配置文件
slaves
IPTV-Spark-5
IPTV-Spark-6
spark-env.sh
source /etc/profile
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
#export SCALA_HOME=/usr/local/scala-2.11.6
export SPARK_MASTER_IP=IPTV-Spark-4
export SPARK_PID_DIR=${SPARK_HOME}/pids
# 开启自动清理 每2小时一次 保留10小时
export SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.interval=7200 -Dspark.worker.cleanup.appDataTtl=36000"
spark-defaults.conf
spark.master spark://IPTV-Spark-4:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://HN:8020/spark-log
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 1024m
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
同步程序文件到从节点
在IPTV-Spark-4将上面配好的文件复制到各个节点对应的目录:
scp -r /web/soft/spark-1.6.0 hadoop@IPTV-Spark-5:/web/soft/
scp -r /web/soft/spark-1.6.0 hadoop@IPTV-Spark-6:/web/soft/
启动Spark集群
在Master节点执行: sbin/start-all.sh 可以启动整个集群,
通过执行jps可以看到Master运行的进程是Master,Slaves节点运行的进程是Worker
Kafka集群搭建
安装
hbase软件目录为/web/soft/,将hadoop安装包解压安装到该目录下
tar xf kafka_2.11-0.9.0.1.tgz -C /web/soft/
每台服务器配置环境变量
#set kafka
export KAFKA_HOME=/web/soft/kafka_2.11-0.9.0.1
export PATH=$KAFKA_HOME/bin:$PATH
#ssh port
export KAFKA_SSH_OPTS="-p 17122"
修改配置文件
server.properties
# 每台不一样
broker.id=0
listeners=PLAINTEXT://:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/web/soft/kafka_2.11-0.9.0.1/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=IPTV-Spark-4:2181,IPTV-Spark-5:2181,IPTV-Spark-6:2181
zookeeper.connection.timeout.ms=6000
启动服务
从后台启动Kafka集群(3台都需要启动)
kafka-server-start.sh -daemon /web/soft/kafka_2.11-0.9.0.1/config/server.properties
停止
kafka-server-stop.sh
HIVE安装配置
安装
hive软件目录为/web/soft/,将hadoop安装包解压安装到该目录下
tar xf apache-hive-2.1.1-bin.tar.gz -C /web/soft/
配置环境变量
#set hive
export HIVE_HOME=/web/soft/apache-hive-2.1.1-bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/lib
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
修改配置文件
hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false&autoReconnect=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Hive2018</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>
<description>MetaStore Client socket timeout in seconds</description>
</property>
<property>
<name>hive.metastore.connect.retries</name>
<value>60</value>
<description>create metastore connector retry 5 seconds</description>
</property>
<property>
<name>hive.metastore.client.connect.retry.delay</name>
<value>2</value>
<description>The client waits for a continuous retry connection, default 1 seconds</description>
</property>
<property>
<name>hive.stats.jdbc.timeout</name>
<value>300</value>
<description>Jdbc connection timeout configuration, default 30 seconds;</description>
</property>
</configuration>
Hive-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_171/
export HADOOP_HOME=/web/soft/hadoop-2.6.5
export HIVE_CONF_DIR=/web/soft/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/web/soft/apache-hive-2.1.1-bin/lib
export HADOOP_CLIENT_OPTS="-Xmx6144m $HADOOP_CLIENT_OPTS"
复制mysql的驱动程序到hive/lib下面
cp mysql-connector-java-5.1.38.jar /web/soft/apache-hive-2.1.1-bin/lib/
初始化hive数据
在mysql中hive的schema(需要创建mysql下的hive数据库)
./bin/schematool -initSchema -dbType mysql
Hive on spark配置
修改配置文件
hive-site.xml
<!-- hive on spark -->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
<property>
<name>spark.home</name>
<value>/web/soft/spark-1.6.0</value>
</property>
<property>
<name>spark.master</name>
<value>spark://IPTV-Spark-4:7077</value>
</property>
<property>
<name>spark.eventLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.eventLog.dir</name>
<value>hdfs://HN:8020/spark-log</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.executor.memeory</name>
<value>5120m</value>
</property>
<property>
<name>spark.driver.memeory</name>
<value>1024m</value>
</property>
<property>
<name>spark.executor.extraJavaOptions</name>
<value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
</property>
拷贝文件
将spark jar拷贝至hive
cp /web/soft/spark-1.6.0/lib/spark-assembly-1.6.0-hadoop2.6.0.jar /web/soft/apache-hive-2.1.1-bin/lib/
将hive-site.xml到spark/conf下
cp /web/soft/apache-hive-2.1.1-bin/conf/hive-site.xml /web/soft/spark-1.6.0/conf/
重启spark
创建spark目录
hadoop fs -mkdir /spark-log
Hive on tez
上传tez至hdfs
hadoop fs -mkdir /apps
hadoop fs -copyFromLocal tez-0.8.5.tar.gz /apps/
创建配置文件
在hadoop的master节点上创建文件 $HADOOP_HOME/etc/hadoop/tez-site.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/apps/tez-0.8.5.tar.gz</value>
</property>
</configuration>
在hive中配置
将tez解压到 /web/soft
tar xf tez-0.8.5.tar.gz -C /web/soft/
将 /web/soft/tez-0.8.5/ /web/soft/tez-0.8.5/lib/ 下所有jar包拷贝到hive目录下
cp /web/soft/tez-0.8.5/*.jar /web/soft/apache-hive-2.1.1-bin/lib
cp /web/soft/tez-0.8.5/lib/*.jar /web/soft/apache-hive-2.1.1-bin/lib
运行
hive
hive --hiveconf hive.root.logger=DEBUG,console
测试
hdfs测试
以下内容写入到demo.txt文件:
8,16132,2.0
9,7818,4.9923873
9,5553,4.9626064
9,8418,4.96038
9,16307,4.956869
9,4001,4.5103836
9,16074,4.5103555
9,7848,4.508266
9,4190,4.4999404
9,8522,4.4999285
9,16464,4.499901
9,12544,4.4929514
9,4943,4.485035
9,15870,4.482633
9,13643,4.01599
9,7779,4.002367
9,7782,4.0019193
9,15736,3.9564416
9,15545,3.95627
9,13117,3.9437819
9,7713,3.9394436
9,4927,3.9107435
9,14388,3.8981154
9,7570,3.8609488
9,16132,3.6574585
9,7576,3.64984
9,7836,3.5544918
9,4134,3.541365
hdfs dfs -mkdir -p /data/predict_als
hdfs dfs -put demo.txt /data/predict_als
该部分测试通过,则表示hdfs文件系统通过
hive测试
hive
hive --hiveconf hive.execution.engine=tez
hive --hiveconf hive.execution.engine=spark
create database test;
use test;
create EXTERNAL table IF NOT EXISTS predict_als (uid int,cid int,rate float) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\,' LOCATION '/data/predict_als';
hive on mr测试
use test;
set hive.execution.engine=mr;
select * from predict_als limit 10;
select count(*) from predict_als;
hive on spark测试
use test;
set hive.execution.engine=spark;
select * from predict_als limit 10;
select count(*) from predict_als;
hive on tez测试
use test;
set hive.execution.engine=tez;
select * from test.predict_als;
select count(*) from test.predict_als;
该部分测试用例通过,则表示hive,hive on tez,hive on spark安装完成。
hive tez偶发性超时解决办法
新装的集群直接删,原来没问题的不动
# 进入/web/soft/apache-hive-2.1.1-bin/lib
rm jsp-api-2.0.jar,jsp-api-2.1.jar
# 进入/web/soft/hbase-1.2.5/lib
rm jasper-runtime-5.5.23.jar
常见问题及坑
问题1
java.lang.NoClassDefFoundError: scala/collection/Iterable
报错原因
Hive On Spark运行时,需要加载Spark的相关jar包,而Hive的lib目录下没有这个jar包,也没有在hive的启动脚本中写入加载这些jar包的脚本。
解决方法
最简单的就是将$SPARK_HOME/lib目录下面的spark-assembly开头的那个jar包拷贝到$HIVE_HOME/lib目录下面,例如我的这个包名称是:spark-assembly-1.6.3-hadoop2.4.0.jar,找到这个包,将其加入拷贝到hive的lib目录下。
问题2
The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwxrwxr-x
解决办法:
hadoop fs -rm -r /tmp/hive
Only temporary files are kept in this location. No problem even if we delete this, will be created when required with proper permissions.
问题3
Hive On Spark报错:Failed to execute spark task, org.apache.hadoop.hive.ql.metadata.HiveException
报错原因
Hive On Spark运行时,Hive需要启动一个程序连接Spark集群,因为Hive版本和Spark版本不匹配的原因,或者是配置不对的原因导致Hive连不上Spark集群,无法提交Spark Job都会报这个错误。
解决方法
检查hive-site.xml (hive和spark中都有)
检查自己当前使用的Hive版本和Spark版本是否支持Hive On Spark。如果是配置的问题,报这个错误很可能是spark.master配置错误了,如果是在hive-site.xml里做配置,这里应该配置为:spark://Ip地址或者机器名称:端口,当然如果你用的端口都是默认的,这里也可以配置为yarn-client,而不是配置为什么client、cluster、yarn之类乱七八糟的东西,我正常运行的Hive On Spark环境里配置的是(master是我的机器名称,在/etc/hosts里面做了IP映射):