hadoop 集群,初学者顺利将它搭起来,确定要通过不少的坑。通过一个星期的折腾,我总算将集群正常跑起来了,因此,想将集群搭建的过程整理记录,分享出来,让你们做一个参考。
因为搭建过程比较漫长,因此,这篇文章应该也会很长,但愿你们能耐心看完。html
3台CentOS 7.4 的服务器,4CPU,8G内存; jdk 1.8 hadoop 2.7.7 spark 2.3.0 hive 2.1.1
节点和主机hostname对应关系:java
主节点: 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 下。node
因为 hadoop 集群须要java 环境的支持,因此,在安装集群以前,首先确认你的系统是否已经安装了jdk,检查以下:mysql
[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 不兼容,老是报错。linux
下载 : jdk-8u181-linux-x64.rpm ,
而后上传到服务器,安装:web
rpm -ivh jdk-8u181-linux-x64.rpm
安装完成后,检查 java -version 输出正确,就能够了。sql
在 nn1,dn1 和 dn2 服务器上修改 /etc/hosts 文件,方便主机之间经过hostname也可以访问通讯:
vi /etc/hosts :shell
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,都是能够的,看使用习惯。数据库
在全部服务器上建立,能够先不用密码apache
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 面密码登陆打通以后,就能够继续往下作了。
安装过程比较简单,先下载对应版本的压缩包,再解压缩就可使用了,我选的版本是 hadoop-2.7.7.tar.gz。
tar -xvzf /usr/local/src/hadoop-2.7.7.tar.gz mv hadoop-2.7.7 /data/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 使变量设置生效。
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>
<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>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<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>
[hadoop@ND-BACKUP hadoop]$ cat slaves
172.18.206.228
172.18.206.229
将 hadoop-env.sh 文件里的 JAVA_HOME 修改成:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
> scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn1:/data/hadoop/ > scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn2:/data/hadoop/
mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/namenode2
mkdir -p /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2
chmodu 755 /data/hadoop/hadoop-2.7.7/hadoop_store/hdfs/datanode2
iptabels -F
setenforce 0
hdfs namenode -format
cd /data/hadoop/hadoop-2.7.7/
./sbin/start-all.sh
在 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端口:
或者经过 8088端口,查看resource manager资源状况:
OK,以上就是hadoop集群的搭建过程,下面,咱们继续搭建spark集群。
首先,spark 和hadoop 的yarn 整合后的运行模式有两种,一种是client模式,另外一种是cluster 模式。默认状况下,spark 安装以后,会以cluster模式运行,通常咱们都选择cluster 模式。具体client模式和cluster模式的原理是什么,请你们有兴趣的,能够去搜索更多的文档来阅读。
我使用的 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 目录了。
在 /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变量就会变得愈来愈长,若是你用的服务器是生产环境长时间都不会重启的,那也没办法了。
复制安装包里,自带的官方模板文件:
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
上面的配置中,有些注释掉的就是不用的,我复制过来,就不改了。
将官方模板复制一份:
mv slaves.template slaves
vi slaves ,添加以下的内容:
nn1
dn1
dn2
将官方的复制一份:
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按照默认的参数运行,也是能够的。
由于在上一步中,咱们设置了 spark.eventLog.dir ,因此,咱们要在 hdfs 上建立一个目录路径,给日志用才能够:
[hadoop@ndj-hd-1 spark]$ hadoop dfs -mkdir /spark-logs
而后在 spark-env.sh 最后中添加:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://nn1:9000/spark-logs"
若是上面的环境变量设置都没有问题,那么能够进行下面的简单例子测试。
(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
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的系统变量
启动spark 前,要确认 hadoop集群已经在运行,
启动spark:
cd /data/hadoop/spark
为了省事,一次性启动全部master和worker:
./sbin/start-all.sh
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 启动就能够了。
在安装完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 就配置好,可使用了。
当你的hadoop 集群,和spark 集群都安装完成以后,就能够开始安装hive 了。
hive是这篇文章的最后一部分了,也是依赖条件比较多的一个组件。
先将我本身在安装hive后,总结的一些坑写出来吧:
第一,hadoop和spark功能要正常。
第二,hive须要和mysql数据库结合,因此又要配置好mysql数据库,作好用户受权。
第三,注意在hive-site.xml配置文件里,把jdbc驱动、spark引擎配置好。
特别是第三点,在不少资料里都没提过的。若是发现本身配置已经作好了,在作测试验证的时候,老是不成功,那么,最好的办法,就是根据报错,一个个问题去解决。
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 mysqldsystemctl 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 安装了
相同的套路,将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;命令能输出正确信息,就已经配置好了。
不得不说,配置这个 hadoop+spark+hive的环境,对于初学者来讲确实太麻烦了。个人安装过程,虽然能将集群顺利运行了,可是仍然有不少地方须要优化,例如对于spark、hadoop、hive 它们的内存资源分配,这篇文章就没有作深刻的讨论。但愿文章能帮助更多的人在搭建集群时,节省更多的时间,将时间花在更有意思的地方,帮助你们能尽早开始体验hadoop的各类功能。后续的优化方向,会深刻学习hadoop集群的性能,有时间还要看看它们的源代码。