内容简介: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端口:
或者通过 8088端口,查看resource manager资源情况:
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集群的性能,有时间还要看看它们的源代码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Elasticsearch 集群搭建和集群原理
- Zookeeper学习系列【二】Zookeeper 集群章节之集群搭建
- Spark集群环境搭建
- Zookeeper搭建集群
- FastDFS集群搭建
- Zookeeper集群环境搭建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
High Performance Python
Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99
If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!