hadoop + spark+ hive 集群搭建(apache版本)

栏目: 服务器 · 发布时间: 6年前

内容简介:hadoop 集群,初学者顺利将它搭起来,肯定要经过很多的坑。经过一个星期的折腾,我总算将集群正常跑起来了,所以,想将集群搭建的过程整理记录,分享出来,让大家作一个参考。由于搭建过程比较漫长,所以,这篇文章应该也会很长,希望大家能耐心看完。节点和主机hostname对应关系:

0. 引言

hadoop 集群,初学者顺利将它搭起来,肯定要经过很多的坑。经过一个星期的折腾,我总算将集群正常跑起来了,所以,想将集群搭建的过程整理记录,分享出来,让大家作一个参考。

由于搭建过程比较漫长,所以,这篇文章应该也会很长,希望大家能耐心看完。

1. 集群环境和版本说明

3台CentOS 7.4 的服务器,4CPU,8G内存;
jdk  1.8
hadoop  2.7.7
spark 2.3.0
hive   2.1.1

节点和主机hostname对应关系:

主节点:    172.18.206.224    nn1   Namenode and YARN Resourcemanage 
从节点1:  172.18.206.228    dn1   Datanode and YAR   Nodemanager
从节点2:  172.18.206.229    dn2   Datanode and YARN   Nodemanager

为hadoop集群,创建一个non-root 用户,我使用的用户名是 hadoop。安装目录统一在hadoop用户的家目录 /data/hadoop 下。

2. hadoop 集群安装

2.1 安装 jdk 1.8版本

由于 hadoop 集群需要 java 环境的支持,所以,在安装集群之前,首先确认你的系统是否已经安装了jdk,检查如下:

[root@ND-ES-3 ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

如果没有安装 jdk 1.8 以上的版本,则需要卸载旧版本重新安装,在这里,我选择的jdk是oracal提供的版本,其他公司提供的jdk,我测试的时候,好像和apache hadoop 不兼容,总是报错。

下载 : jdk-8u181-linux-x64.rpm ,

然后上传到服务器,安装:

rpm  -ivh  jdk-8u181-linux-x64.rpm

安装完成后,检查 java -version 输出正确,就可以了。

2.2 修改 /etc/hosts 文件,实现ssh免密码登录

在 nn1,dn1 和 dn2 服务器上修改 /etc/hosts 文件,方便主机之间通过hostname也能够访问通信:

vi /etc/hosts :

172.18.206.224      nn1    nn1.cluster1.com
172.18.206.228      dn1    dn1.cluster1.com
172.18.206.229      dn2    dn2.cluster1.com

其实使用,什么hostname,都是可以的,看使用习惯。

创建 hadoop 用户:

在所有服务器上创建,可以先不用密码

useradd  -d  /data/hadoop/   hadoop

然后,在nn1 上为hadoop 创建密钥文件,用来ssh 免密码登录,这是为了在后面hadoop集群通信时,不需要每次都输入密码,那么麻烦。

创建密钥对的方式:

su  -  hadoop
ssh-key-gen  -t  rsa
mv   id_rsa.pub  authorized_keys
chmod  0700  /data/hadoop/.ssh 
chmod  0600  /data/hadoop/.ssh/authorized_keys

然后将 authorized_keys 和 id_rsa 密钥对复制到其他两台主机的 /data/hadoop/.ssh 目录。

测试,用hadoop ssh 登录其他两台服务器:

[root@ND-ES-3 ~]# su - hadoop
Last login: Mon Sep 10 09:32:13 CST 2018 from 183.6.128.86 on pts/1
[hadoop@ND-ES-3 ~]$ ssh dn1
Last login: Thu Sep  6 15:49:20 2018

Welcome to Alibaba Cloud Elastic Compute Service !

[hadoop@ND-DB-SLAVE ~]$ 

[hadoop@ND-ES-3 ~]$ ssh dn2
Last login: Fri Sep  7 16:43:04 2018

Welcome to Alibaba Cloud Elastic Compute Service !

[hadoop@ND-BACKUP ~]$

默认第一次ssh登录的时候,需要输入确认接收 密钥登录的,直接确认就可以了。

ssh 面密码登录打通之后,就可以继续往下做了。

2.3 安装 hadoop-2.7.7

安装过程比较简单,先下载对应版本的压缩包,再解压缩就可以使用了,我选的版本是 hadoop-2.7.7.tar.gz。

tar   -xvzf   /usr/local/src/hadoop-2.7.7.tar.gz   
mv   hadoop-2.7.7    /data/hadoop/

2.4 设置hadoop的环境变量

可以修改 hadoop 家目录 /data/hadoop/.bash_profile文件

vi /data/hadoop/.bash_profile,添加如下:

## JAVA env variables
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
## HADOOP env variables
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

注意根据自己的实际情况修改其中的路径。

然后, source ~/.bash_profile 使变量设置生效。

2.5 修改hadoop配置文件 core-site.xml

vi /data/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml

<configuration> <property> <name>fs.default.name</name> <value>hdfs://nn1:9000</value> </property> </configuration>

2.6 修改 hdfs-site.xml

<configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2</value> </property> </configuration>

2.7 修改 mapred-site.xml

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>

2.8 修改 yarn-site.xml

<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>172.18.206.224:8025</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>172.18.206.224:8030</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>172.18.206.224:8050</value> </property> </configuration>

2.9 修改 slaves 文件,添加两个slave 主机的ip地址

[hadoop@ND-BACKUP hadoop]$ cat slaves  172.18.206.228 172.18.206.229

2.10 修改 hadoop-env.sh

将 hadoop-env.sh 文件里的 JAVA_HOME 修改为:

export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))

2.11 将 /data/hadoop/hadoop-2.7.7 安装目录复制到dn1和dn2两台服务器

> scp  -r  /data/hadoop/hadoop-2.7.7    hadoop@dn1:/data/hadoop/
> scp  -r  /data/hadoop/hadoop-2.7.7    hadoop@dn2:/data/hadoop/

2.12 在 nn1 创建 NameNode 目录

mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2

2.13 在dn1和dn2 创建 datanode 目录

mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2 chmodu 755 /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2

2.14 关闭 selinux 和 iptables 防火墙

iptabels -F  setenforce 0

2.15 在 nn1 格式化 namenode

hdfs namenode -format

2.16 启动hadoop 集群(只在nn1 操作就可以了)

cd /data/hadoop/hadoop-2.7.7/ ./sbin/start-all.sh

2.17 检查

在 nn1 :

$ jps
3042 NameNode
3349 SecondaryNameNode
3574 ResourceManager
11246 Jps

在 dn1或者 dn2:

$ jps
26642 NodeManager
14569 Jps
26491 DataNode

检查是否有两个激活的节点

[hadoop@ND-ES-3 ~]$ hdfs dfsadmin -report
Configured Capacity: 3246492319744 (2.95 TB)
Present Capacity: 2910313086244 (2.65 TB)
DFS Remaining: 2907451403556 (2.64 TB)
DFS Used: 2861682688 (2.67 GB)
DFS Used%: 0.10%
Under replicated blocks: 34
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (2):

Name: 172.18.206.228:50010 (dn1)
Hostname: dn1
Decommission Status : Normal
Configured Capacity: 1082119344128 (1007.80 GB)
DFS Used: 1430839296 (1.33 GB)
Non DFS Used: 161390100480 (150.31 GB)
DFS Remaining: 864172031634 (804.82 GB)
DFS Used%: 0.13%
DFS Remaining%: 79.86%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018

Name: 172.18.206.229:50010 (dn2)
Hostname: dn2
Decommission Status : Normal
Configured Capacity: 2164372975616 (1.97 TB)
DFS Used: 1430843392 (1.33 GB)
Non DFS Used: 9560809472 (8.90 GB)
DFS Remaining: 2043279371922 (1.86 TB)
DFS Used%: 0.07%
DFS Remaining%: 94.41%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 3
Last contact: Mon Sep 10 17:26:59 CST 2018

[hadoop@ND-ES-3 ~]$

如果上面的检查都通过了,那么hadoop集群就已经顺利搭建了。

其实,你还可以通过web页面访问,来查看hadoop的情况,例如,通过50070端口:

http://host_ip:50070

或者通过 8088端口,查看resource manager资源情况:

http://host_ip:8088

OK,以上就是hadoop集群的搭建过程,下面,我们继续搭建spark集群。

3. 安装 spark on yarn

首先,spark 和hadoop 的yarn 整合后的运行模式有两种,一种是client模式,另一种是cluster 模式。默认情况下,spark 安装之后,会以cluster模式运行,一般我们都选择cluster 模式。具体client模式和cluster模式的原理是什么,请大家有兴趣的,可以去搜索更多的文档来阅读。

3.1 下载并安装 spark

我使用的 spark版本是:

spark-2.3.0-bin-hadoop2.7.tgz

上传到服务器 /usr/local/src/ 目录,然后解压:

tar -xvzf /usr/local/src/spark-2.3.0-bin-hadoop2.7.tgz

mv /usr/local/src/spark-2.3.0-bin-hadoop2.7 /data/hadoop/spark-2.3.0

创建软连接:

cd /data/hadoop

ln -s spark-2.3.0 spark # 别问为什么用软连接,这是为了以后多个版本切换方便,高手都这么干

现在,spark已经安装在 /data/hadoop/spark 目录了。

3.2 添加系统关于 spark 的一些环境变量

在 /data/hadoop/.bash_profile 文件添加:

## spark
export SPARK_HOME=/data/hadoop/spark
export HADOOP_CONF_DIR=/data/hadoop/hadoop-2.7.7/etc/hadoop
export LD_LIBRARY_PATH=/data/hadoop/hadoop-2.7.7/lib/native:$LD_LIBRARY_PATH
export PATH=/data/hadoop/spark/bin:$PATH

然后,使配置生效:

source .bash_profiel

这里其实有一个问题,这样每次添加环境变量,那么 PATH变量就会变得越来越长,如果你用的服务器是生产环境长时间都不会重启的,那也没办法了。

3.3 修改 spark-env.xml

复制安装包里,自带的官方模板文件:

cd /data/hadoop/spark/conf cp spark-env.sh.template spark-env.sh

添加如下的内容:

export SPARK_HOME=/data/hadoop/spark
#export SCALA_HOME=/lib/scala
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
export HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#export YARN_CONF_DIR=$YARN_HOME/etc/hadoop
#export SPARK_LOCAL_DIRS=/data/haodop/spark
export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native
#export SPAR_MASTER_PORT=7077
export SPARK_MASTER_HOST=nn1

上面的配置中,有些注释掉的就是不用的,我复制过来,就不改了。

3.4 修改 slaves 文件

将官方模板复制一份:

mv slaves.template slaves

vi slaves ,添加如下的内容:

nn1

dn1

dn2

3.5 修改 spark-defaults.cof

将官方的复制一份:

mv spark-defaults.conf.templates spark-defaults.conf

添加如下的配置:

vi spark-defaults.conf
spark.eventLog.enabled             true
spark.eventLog.dir                      hdfs://nn1:9000/spark-logs
spark.history.provider             org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory       hdfs://nn1:9000/spark-logs
spark.history.fs.update.interval   10s
spark.history.ui.port                    18080

这个文件主要是配置spark的内存使用或者分配的,如果你对 memory allocation的分配不熟悉,暂时可以不配置这个文件,让spark按照默认的参数运行,也是可以的。

3.6 测试 spark

如果上面的环境变量设置都没有问题,那么可以进行下面的简单例子测试。

(spark-defaults.conf 文件可以不配置):

[hadoop@ND-ES-3 spark]$ ./bin/run-example SparkPi 10 2018-09-11 11:17:47 INFO SparkContext:54 - Running Spark version 2.3.0 2018-09-11 11:17:47 INFO SparkContext:54 - Submitted application: Spark Pi 2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls to: hadoop 2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls to: hadoop 2018-09-11 11:17:47 INFO SecurityManager:54 - Changing view acls groups to:  2018-09-11 11:17:47 INFO SecurityManager:54 - Changing modify acls groups to: 

spark 自带了一些例子。以上是计算圆周率的例子以及部分输出的内容。如果计算成功,在输出结束后,你往上翻,会看到:

Pi is roughly 3.141415141415141

3.7 将 spark 的安装目录复制到其他节点

chown -R hadoop:hadoop /data/hadoop/spark scp -r /data/hadoop/spark dn1:/data/hadoop/ scp -r /data/hadoop/spark dn2:/data/hadoop/

复制完成之后,注意修改 dn1 和 dn2 节点上的 /data/hadoop/.bash_profile的系统变量

3.8 启动spark

启动spark 前,要确认 hadoop集群已经在运行,

启动spark:

cd /data/hadoop/spark

为了省事,一次性启动所有master和worker:

./sbin/start-all.sh

3.9 检查启动情况

nn1 启动情况:

[hadoop@ND-ES-3 conf]$ jps
3042 NameNode
8627 RunJar
3349 SecondaryNameNode
3574 ResourceManager
10184 Master
10332 Worker
4654 Jps

dn1 和 dn2:

[hadoop@ND-DB-SLAVE ~]$ jps
26642 NodeManager
10679 Jps
29960 Worker
26491 DataNode
[hadoop@ND-DB-SLAVE ~]$

看到 worker 和 master 启动就可以了。

4. 安装scala

在安装完spark 之后,先安装 scala ,过程比较简单,

下载,并上传安装包到服务器,解压缩:

tar xvzf scala-2.12.6.tgz

创建软连接:

ln -s scala-2.12.6 /data/hadoop/scala

修改scalac 的PATH 变量:

vi .bash_profile
# scala 
export SCALA_HOME=/lib/scala
export PATH=${SCALA_HOME}/bin:$PATH

生效:

source .bash_profiel

Ok,scala 就配置好,可以使用了。

5. 安装 hive

当你的hadoop 集群,和spark 集群都安装完成之后,就可以开始安装hive 了。

hive是这篇文章的最后一部分了,也是依赖条件比较多的一个组件。

先将我自己在安装hive后,总结的一些坑写出来吧:

第一,hadoop和spark功能要正常。

第二,hive需要和 mysql 数据库结合,所以又要配置好mysql数据库,做好用户授权。

第三,注意在hive-site.xml配置文件里,把jdbc驱动、spark引擎配置好。

特别是第三点,在很多资料里都没提过的。如果发现自己配置已经做好了,在做测试验证的时候,总是不成功,那么,最好的办法,就是根据报错,一个个问题去解决。

5.1 安装mysql-5.7

hive需要和数据库结合使用,这样在进行 SQL 语句操作时就可以像操作mysql那样,不需要写复制的代码了。

我是用二进制编译安装mysql的方式,因为可以自己配置mysql的参数。

下载安装包的地址:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

创建用户和用户组

groupadd mysql useradd -g mysql -s /sbin/nologin mysql

解压到指定目录

tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local

cd /usr/local/

ln -s mysql-5.7.17-linux-glibc2.5-x86_64 mysql

或者

mv mysql-5.7.17-linux-glibc2.5-x86_64 mysql

配置PATH目录

vi /etc/profile.d/mysql.sh

添加:

export PATH=$PATH:/usr/local/mysql/bin

然后,source /etc/profile.d/mysql.sh

mysql目录资源规划

文件类型 实例3306 软链
数据datadir /usr/local/mysql/data /data/mysql/data
参数文件my.cnf /usr/local/mysql/etc/my.cnf
错误日志log-error /usr/local/mysql/log/mysql_error.log
二进制日志log-bin /usr/local/mysql/binlogs/mysql-bin /data/mysql/binlogs/mysql-bin
慢查询日志slow_query_log_file /usr/local/mysql/log/mysql_slow_query.log
套接字socket文件 /usr/local/mysql/run/mysql.sock
pid文件 /usr/local/mysql/run/mysql.pid

备注:考虑到数据和二进制日志比较大,需要软链,实际/data/mysql 在服务器的数据盘,磁盘空间充足,如果你不考虑磁盘空间问题,可以安装默认的路径安排。

mkdir -p /data/mysql/{data,binlogs,log,etc,run} ln -s /data/mysql/data /usr/local/mysql/data ln -s /data/mysql/binlogs /usr/local/mysql/binlogs ln -s /data/mysql/log /usr/local/mysql/log ln -s /data/mysql/etc /usr/local/mysql/etc ln -s /data/mysql/run /usr/local/mysql/run chown -R mysql.mysql /data/mysql/ chown -R mysql.mysql /usr/local/mysql/{data,binlogs,log,etc,run}

备注:也可以只对 datadir 和 binlog 目录进行软连接

配置 my.cnf 文件

删除系统自带的 my.cnf

rm -rf /etc/my.cnf

编辑 my.cnf

vi /usr/local/mysql/etc/my.cnf

添加以下内容:

[client]

port = 3306

socket = /usr/local/mysql/run/mysql.sock

[mysqld]

port = 3306

socket = /usr/local/mysql/run/mysql.sock

pid_file = /usr/local/mysql/run/mysql.pid

datadir = /usr/local/mysql/data

default_storage_engine = InnoDB

max_allowed_packet = 512M

max_connections = 2048

open_files_limit = 65535

skip-name-resolve

lower_case_table_names=1

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

innodb_buffer_pool_size = 1024M

innodb_log_file_size = 2048M

innodb_file_per_table = 1

innodb_flush_log_at_trx_commit = 0

key_buffer_size = 64M

log-error = /usr/local/mysql/log/mysql_error.log

log-bin = /usr/local/mysql/binlogs/mysql-bin

slow_query_log = 1

slow_query_log_file = /usr/local/mysql/log/mysql_slow_query.log

long_query_time = 5

tmp_table_size = 32M

max_heap_table_size = 32M

query_cache_type = 0

query_cache_size = 0

server-id=1

初始化数据库

mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

在数据库会有一个临时密码生成,请记录下来,等会要用到:

[hadoop@ND-ES-3 mysql]$ sudo grep 'temporary password' /usr/local/mysql/log/mysql_error.log 
2018-09-08T05:03:32.509910Z 1 [Note] A temporary password is generated for root@localhost: <,Nhx3+7z)UY

生成ssl

mysql_ssl_rsa_setup --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/

设置启动项(CentOS 7)

cd /usr/lib/systemd/system touch mysqld.service 

输入如下内容:

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/usr/local/mysql/run/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables
#ExecStartPre=/usr/bin/mysqld_pre_systemd

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/run/mysqld.pid $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 65535

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

加载并启动mysql

systemctl daemon-reload systemctl enable mysqld.service systemctl is-enabled mysqld
systemctl start mysql 

Securing the Initial MySQL Accounts

执行 /usr/local/mysql/bin/mysql_secure_installation
刚刚记录下来的临时密码在这里可以排上用场了,重新配置root密码,清空测试数据库,禁止匿名用户。

导入时区

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

安装完mysql,就可以正式开始hive 安装了

5.2. 安装hive

相同的套路,将hive的安装包上传到服务器,然后解压缩,创建软连接,,我使用的版本是:apache-hive-2.1.1-bin.tar.gz

tar xvzf apache-hive-2.1.1-bin.tar.gz mv apache-hive-2.1.1-bin /data/hadoop/hive-2.1.1 cd /data/hadoop ln -s hive-2.1.1 hive

修改 PATH

vi /etc/profile.d/hive.sh

export HIVE_HOME=/data/hadoop/hive export HIVE_CONF_DIR=$HIVE_HOME/conf export PATH=$PATH:$HIVE_HOME/bin

生效:

source /etc/profile.d/hive.sh

下载mysql-connector 驱动

因为hive 要和mysql结合使用,所以,需要下载 驱动jar包。我下载用的是:mysql-connector-java-5.1.47.tar.gz。将它解压缩后,将里面的jar包,复制到/data/hadoop/hive/lib 目录。如:

[hadoop@ND-ES-3 lib]$ ls /data/hadoop/hive/lib | grep "mysql-connector*" mysql-connector-java-5.1.47-bin.jar mysql-connector-java-5.1.47.jar

登录mysql数据库,创建一个用户,给hive连接用,设置好授权密码:

grant all privileges on . to 'hive'@'%' identified by '123456';

以上,创建了一个用户hive,它的密码是 123456;

整合spark 和 hive

将 spark/jars 文件下得scala-library spark-core spark-network-common包复制到hive/lib下

这步不能少!!!

配置 hive-env.sh文件

vi hive-env.sh

添加如下内容:

#hadoop_home路径
HADOOP_HOME=/data/hadoop/hadoop-2.7.7
#hive配置文件存放路径
export HIVE_CONF_DIR=/data/hadoop/hive/conf
#hive相关jar存放路径
export HIVE_AUX_JARS_PATH=/data/hadoop/hive/lib

配置 hive-site.xml 文件

cp hive-default.xml.template hive-site.xml ,然后修改其中的一些默认参数。

修改,使用mysql connector:

<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
</property>

修改,配置msyql地址:

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://dn2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>

修改,数据库名字hive

<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
</property>

修改,连接mysql的密码是123456:

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
</property>

在/data/hadoop/hive 创建 temp 目录:

mkdir /data/hadoop/hive/temp

然后,继续修改hive-site.xml 文件中对应参数的<value>

1

<property> <name>hive.server2.logging.operation.log.location</name> <value>/data/hadoop/hive/temp/operation_logs</value> <description>Top level directory where operation logs are stored if logging functionality is enabled</description>

2

<property> <name>hive.exec.local.scratchdir</name> <value>/data/hadoop/hive/temp</value> <description>Local scratch space for Hive jobs</description> </property>

3

<property> <name>hive.downloaded.resources.dir</name> <value>/data/hadoop/hive/temp</value> <description>Temporary local directory for added resources in the remote file system.</description> </property>

创建以下的dfs 目录

hadoop fs -mkdir /data hadoop fs -mkdir /data/hive hadoop fs -mkdir /data/hive/warehouse hadoop fs -mkdir /data/hive/tmp hadoop fs -mkdir /data/hive/log

然后,继续修改 hive-site.xml文件

1.

<property> <name>hive.metastore.warehouse.dir</name> <value>hdfs://nn1:9000/data/hive/warehouse</value> <description>location of default database for the warehouse</description> </property>

2.

<property> <name>hive.querylog.location</name> <value>hdfs://nn1:9000/data/hive/log</value> <description>Location of Hive run time structured log file</description> </property>

3.

<property> <name>spark.enentLog.dir</name> <value>hdfs://nn1:9000/spark-logs</value> </property>

4.

<property> <name>hive.exec.scratchdir</name> <value>hdfs://nn1:9000/data/hive/tmp</value> <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>

其他的修改,同样重要,

1.

<property> <name>hive.stats.dbclass</name> <value>jdbc:msyql</value> <description>

最后, 将 spark/jars 文件下得scala-library spark-core spark-network-common包复制到hive/lib下

hive-site.xml添加:

<property> <name>hive.enable.spark.execution.engine</name> <value>true</value> </property> <property> <name>spark.home</name> <value>/data/hadoop/spark</value> </property> <property> <name>spark.enentLog.enabled</name> <value>true</value> </property> <property> <name>spark.enentLog.dir</name> <value>hdfs://nn1:9000/spark-logs</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <property> <name>spark.executor.extraJavaOptions</name> <value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value> </property>

这里要注意,如果spark-logs 路径没有创建,则需要先用hadoop创建:

hadoop fs -mkdir /spark-logs 

另一个,spark需要开启日志记录的功能,参考上面提到的 spark-defaults.conf 文件。

OK,经过漫长的配置,终于将hive-site.xml 文件配置完成了。下面开始测试。

初始化hive元数据库

schematool -dbType mysql -initSchema

启动hive数据库

直接在命令行输入hive进入CLI模式:

[hadoop@ND-ES-3 hive]$ hive
which: no hbase in (/lib/scala/bin:/data/hadoop/spark/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/java/jdk1.8.0_181-amd64/bin:/data/hadoop/hadoop-2.7.7/sbin:/data/hadoop/hadoop-2.7.7/bin:/usr/local/mysql/bin:/data/hadoop/hive/bin:/data/hadoop/.local/bin:/data/hadoop/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hadoop/hive-2.1.1/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Logging initialized using configuration in file:/data/hadoop/hive-2.1.1/conf/hive-log4j2.properties Async: true
hive> show databases;
OK
default
Time taken: 0.769 seconds, Fetched: 1 row(s)
hive>

刚开始的输出信息,不影响使用,只要show databases;命令能输出正确信息,就已经配置好了。

6. 结语

不得不说,配置这个 hadoop+spark+hive的环境,对于初学者来说确实太麻烦了。

我的安装过程,虽然能将集群顺利运行了,但是仍然有很多地方需要优化,例如对于spark、hadoop、hive 它们的内存资源分配,这篇文章就没有做深入的讨论。希望文章能帮助更多的人在搭建集群时,节省更多的时间,将时间花在更有意思的地方,帮助大家能尽早开始体验hadoop的各种功能。

后续的优化方向,会深入学习hadoop集群的性能,有时间还要看看它们的源代码。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言程序设计

C语言程序设计

K. N. King / 吕秀锋、黄倩 / 人民邮电出版社 / 2010-4 / 79.00元

时至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经和最初的时候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库和参考资料 4个部分。每章末尾都有一个“问与......一起来看看 《C语言程序设计》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具