hadoop集群(实时计算平台)
young / / bigdata / 阅读量

介绍

大数据实时计算平台搭建,由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&amp;useSSL=false&amp;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映射):

支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章