环境信息
-购买操作系统选择centos7(7的任何一个版本都可以),如果选错了可以在阿里云管理面板的-更多--云盘和镜像--更换操作系统。
在阿里云购买ecs-购买后机器网卡环境(2G内存不够,选择更大的内存机器):
公网IP-8.134.80.143、内网IP-172.30.40.95
设置阿里云端口映射:
开放3个端口
50070:hdfs管理端口
8088 : yarn 管理端口
3306: mysql连接端口
10000 : hive 客户端远程连接端口
10002 : hive web界面端口
配置入口-->安全组-->配置规则
点击手动添加,添加3306、8088、10000、50070、10002端口
开始安装
整个一套安装配置内容比较多,顺序是:安装zookeeper--安装hadoop---安装mysql---安装hive--sql测试
安装zookeeper ,zookeeper版本不要选最后一个版本,选上下兼容hadoop、hive的版本,这里选3.4.9就可以了。
安装java
yum -y install java-1.8.0-openjdk
配置java环境变量
执行:
export JAVA_HOME=/usr/lib/jvm/jre
export JRE_HOME=/usr/lib/jvm/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
下载zookeeper
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
解压
tar -xzvf zookeeper-3.4.9.tar.gz
配置环境变量
vim /etc/profile
添加:
export ZOOKEEPER_HOME=/root/zookeeper-3.4.9
export PATH=$ZOOKEEPER_HOME/bin:$PATH
刷新环境变量
source /etc/profile
复制配置文件
cp /root/zookeeper-3.4.9/conf/zoo_sample.cfg /root/zookeeper-3.4.9/conf/zoo.cfg
创建目录:
/root/zookeeper-3.4.9/run
/root/zookeeper-3.4.9/run/data
/root/zookeeper-3.4.9/run/log
修改配置文件
vim /root/zookeeper-3.4.9/conf/zoo.cfg
修改如下两处(没有就增加):
dataDir=/root/zookeeper-3.4.9/run/data
dataLogDir=/root/zookeeper-3.4.9/run/log
启动zookeeper
zkServer.sh start
zk安装完成。
安装hadoop
hadoop,包括hdfs(分布式文件)、yarn(资源调度)、mapreduce(运算)
hadoop和hbase 有依赖关系,
hadoop这里选3.1.4,hbase 选2.3.3 能够兼容
下载hadoop
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz
解压:
tar -zxvf hadoop-3.1.4.tar.gz
配置环境变量
vim /etc/profile
添加两行
export HADOOP_HOME=/root/hadoop-3.1.4
export PATH=${HADOOP_HOME}/bin:$PATH
刷新环境变量
source /etc/profile
修改hadoop配置文件
vim /root/hadoop-3.1.4/etc/hadoop/hadoop-env.sh
设置java_home
修改JAVA_HOME=/usr/lib/jvm/jre
创建目录:
mkdir /root/hadoop-3.1.4/run
mkdir /root/hadoop-3.1.4/run/hadoop
修改hosts文件,
vi /etc/hosts
添加1行(172.30.40.95为服务器内网地址):
172.30.40.95 hadoop1 hadoop1
修改配置文件core-site.xml
vim /root/hadoop-3.1.4/etc/hadoop/core-site.xml
修改hdfs配置,内容(没有就添加):
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:8020</value>
</property>
<property>
<!--指定 hadoop 存储临时文件的目录-->
<name>hadoop.tmp.dir</name>
<value>/root/hadoop-3.1.4/run/hadoop</value>
</property>
<property>
<name>hadoop.native.lib</name>
<value>false</value>
<description></description>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
修改hdfs-site.xml文件
vim /root/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
添加hdfs副本数配置,这里配置1 ,内容(172.30.40.95为服务器内网地址):
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>172.30.40.95:50070</value>
</property>
</configuration>
修改文件:mapred-site.xml
vim /root/hadoop-3.1.4/etc/hadoop/mapred-site.xml
内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改文件:yarn-site.xml
vim /root/hadoop-3.1.4/etc/hadoop/yarn-site.xml
内容:
<configuration>
<property>
<!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
主机访问设置
在root用户目录下执行,也就是/root目录下
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
格式化hdfs
/root/hadoop-3.1.4/bin/hdfs namenode -format
修改hdfs启动脚本:
vim /root/hadoop-3.1.4/sbin/start-dfs.sh
顶部增加4行
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
修改hdfs停止脚本:
vim /root/hadoop-3.1.4/sbin/stop-dfs.sh
顶部增加4行
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
修改yarn启动脚本:
vim /root/hadoop-3.1.4/sbin/start-yarn.sh
顶部增加3行
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
修改yarn停止脚本:
vim /root/hadoop-3.1.4/sbin/stop-yarn.sh
顶部增加3行
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
启动hdfs
export JAVA_HOME=/usr/lib/jvm/jre
(停止脚本:/root/hadoop-3.1.4/sbin/stop-dfs.sh)
/root/hadoop-3.1.4/sbin/start-dfs.sh
浏览器访问验证
地址:http://8.134.80.143:50070/
启动yarn
(停止脚本:/root/hadoop-3.1.4/sbin/stop-yarn.sh)
/root/hadoop-3.1.4/sbin/start-yarn.sh
浏览器访问验证
地址:http://8.134.80.143:8088/
hadoop 安装完成。
安装mysql
hive 运行需要mysql
下载mysql源
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
安装mysql源
yum -y install mysql57-community-release-el7-10.noarch.rpm
安装MySQL
yum -y install mysql-server mysql
启动(停止/重启/查看状态) start(/stop/restart/status) MySQL 服务
systemctl start mysqld
修改mysql配置文件:
vim /etc/my.cnf
末尾增加:
skip-grant-tables
[mysql]
default-character-set =utf8
重启mysql
systemctl restart mysqld
登陆mysql,修改root密码,设置登陆ip。
mysql -u root -p
(密码因为还没设置,直接回车)
设置密码:
use mysql;
update user set host = '%';
set password for 'root'@'localhost' =password('q1w2e3r4');
flush privileges;
重新修改配置文件:
vim /etc/my.cnf
注释掉:#skip-grant-tables
重启mysql:
systemctl restart mysqld
用 本地navicat 连接mysql,测试mysql是否安装成功
再navicat里面创建名称为hive的数据库
mysql安装完成。
安装hive
hive 运行依赖hadoop、mysql,前面已经安装好了。
下载hive
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
解压:
tar -zxvf apache-hive-3.1.2-bin.tar.gz
修改环境变量
vim /etc/profile
添加:
export HIVE_HOME=/root/apache-hive-3.1.2-bin
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export CLASSPATH=.$CLASSPATH:$HIVE_HOME/lib
export PATH=$PATH:$HIVE_HOME/bin
刷新环境变量:
source /etc/profile
hadoop下建立路径并授权
hadoop fs -mkdir -p /var/hive/warehouse
hadoop fs -mkdir -p /var/hive/tmp
hadoop fs -mkdir -p /tmp/hive
hadoop fs -chmod 777 /var/hive/warehouse
hadoop fs -chmod 777 /var/hive/tmp
hadoop fs -chmod 777 /tmp/hive
修改hive配置文件
复制文件
cp /root/apache-hive-3.1.2-bin/conf/hive-env.sh.template /root/apache-hive-3.1.2-bin/conf/hive-env.sh
cp /root/apache-hive-3.1.2-bin/conf/hive-default.xml.template /root/apache-hive-3.1.2-bin/conf/hive-site.xml
替换冲突jar
cp /root/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /root/apache-hive-3.1.2-bin/lib/guava-27.0-jre.jar
mv /root/apache-hive-3.1.2-bin/lib/guava-19.0.jar /root/apache-hive-3.1.2-bin/lib/guava-19.0.jar-old
下载、复制mysql 驱动jar
安装zip
yum -y install zip unzip
下载驱动
wget https://cdn.mysql.com//archives/mysql-connector-java-5.1/mysql-connector-java-5.1.46.zip
解压
unzip mysql-connector-java-5.1.46.zip
复制
cp /root/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /root/apache-hive-3.1.2-bin/lib/mysql-connector-java-5.1.46-bin.jar
vim /root/apache-hive-3.1.2-bin/conf/hive-env.sh
修改3处(没有就添加)
export HADOOP_HOME=/root/hadoop-3.1.4
export HIVE_CONF_DIR=/root/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/root/apache-hive-3.1.2-bin/lib
修改hive-site.xml文件-建议sftp下载到本地,用文本编辑器修改,需要修改的内容过多。
文件路径是:/root/apache-hive-3.1.2-bin/conf/hive-site.xml
涉及如下内容的节点都需要找到并修改:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/var/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</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>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/var/hive/tmp/root</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/var/hive/tmp/root</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>
</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>******</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>
Enforce metastore schema version consistency.
True: Verify that version information stored in is compatible with one from Hive jars. Also disable automatic
schema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensures
proper metastore schema migration. (Default)
False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
</description>
</property>
<property>
<name>hive.txn.xlock.iow</name>
<value>true</value>
<description>
</description>
</property>
注意
上面的节点,hive.txn.xlock.iow是要删除description内容,javax.jdo.option.ConnectionPassword填写mysql root用户的密码。
除了上面的节点,还需要全文查找${system:user.name}替换为root,全文查找${system:java.io.tmpdir}替换为/var/hive/tmp
修改完后记得上传到服务器覆盖文件。
初始化hive
schematool -initSchema -dbType mysql
启动hive
hive 启动一定需要机器有足够内存,内存不够会自动killed,hive启动直接进入sql界面。
/root/apache-hive-3.1.2-bin/bin/hive
进入hive后先设置本地运行:
set hive.exec.mode.local.auto=true;
创建表:
create table tb_1(t1 string);
插入数据:
insert into tb_1(t1) values('s23');
查询数据:
select t1 from tb_1;
退出hive:
exit;
数据导出到文件:
/root/apache-hive-3.1.2-bin/bin/hive -e "select * from tb_1" >/root/tb_1.txt
hive还有一个远程服务和web管理界面
启动web界面(这个web界面没什么功能,就能看下服务是否启动),主要测试远程服务
/root/apache-hive-3.1.2-bin/bin/hive --service hiveserver2
浏览器访问:
启动服务后,10000端口可以进行远程连接,前面是hive直接写sql,现在启动远程连接后,可以beeline去连接,beeline展示信息会友好很多。
beeline 连接:
beeline -u jdbc:hive2://localhost:10000
beeline执行查询语句:
select * from tb_1;
测试成功,部署调用完成。
本来这篇已经结束了,有人咨询,是否有navicat,plsql 类似这样的客户端连接hive,这里说一下,有。
启动了远程连接服务后就能用客户端远程连接操作(/root/apache-hive-3.1.2-bin/bin/hive --service hiveserver2)
工具使用squirrel,就是一个可以双击运行的jar包,官网下最新的就可以了。
顺序和逻辑: 下载客户端---到安装hive的服务器下载驱动(有个jdbc目录,已经帮你把驱动包封装好了)--本地安装客户端--本地添加服务器下载的驱动,取名hive---新建连接--填写连接地址连接。
下载客户端
下载地址:https://nchc.dl.sourceforge.net/project/squirrel-sql/1-stable/4.1.0/squirrel-sql-4.1.0-standard.jar
如果嫌下载慢,可以从我港区地址下载(如果不能用了就从官网地址下载),我嫌弃慢,在我港区服务器上做了一层cdn:https://p9pan.cn/cdn/squirrel-sql-4.1.0-standard.jar
双击运行就可以安装,安装除了安装路径,其它所有选项默认就可以了,不用选什么msyql、oracle什么的。
我安装在D盘:D:\Program Files\squirrel\squirrel-sql-4.1.0
进入目录,双击squirrel-sql.bat 运行squirrel,打开后是这样的。
左边有一个驱动,一个连接会话 两个tab,需要先添加驱动,再添加会话。
先去安装hive的服务器把驱动下载下来(不要从百度搜下载,网络下载hive版本有区别,容易产生未知问题)。
下载驱动
驱动文件官网已经整理好了,就一个jar包,文件在:
/root/apache-hive-3.1.2-bin/jdbc/hive-jdbc-3.1.2-standalone.jar
下载到本地后就配置驱动
点击drivers 点击加号进去配置
填写的信息:
名称:hive
地址(8.134.80.143是阿里云服务器公网地址):jdbc:hive2://8.134.80.143:10000
类名:org.apache.hive.jdbc.HiveDriver
配置顺利后,左侧驱动会显示 勾。
切换到连接会话tab,添加连接:
填写连接名称、选择hive、 地址(8.134.80.143是阿里云服务器公网地址):jdbc:hive2://8.134.80.143:10000
用户名和密码空着--点击连接。
*****************************注意*******************************
只做查询操作,不用用户名和密码,
但如果需要更新数据,就需要使用用户,用户可以用root,
密码是创建mysql用户时mysql的用户和密码。
和hive里面一样,更新操作会话
先执行set hive.exec.mode.local.auto=true;
然后再执行更新操作。
成功连接hive
写sql
切换到sql tab页,就可以写sql了,和navicat、plsql相仿,回到了sql96状态, 执行sql查询:select * from tb_1,点击黑色跑步一样的图标就是执行sql。
界面对照navicat 、plsql的功能找位置几分钟就上手,不细讲。
SpringBoot接入调用
添加springboot连接hive,操作演示jdbc查询数据。
引用
pom文件引入
<!-- hive -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.2</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>tomcat</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
注意:千万不要直接引用-org.apache.hive -hive-jdbc依赖,需要加上exclusions,因为hive自身的依赖jar会与springboot的tomcat冲突,导致启动报错。
配置文件application.yaml 的hive服务器参数
内容(8.134.80.143是阿里云公网IP):
hive:
url: jdbc:hive2://8.134.80.143:10000
driver-class-name: org.apache.hive.jdbc.HiveDriver
type: com.alibaba.druid.pool.DruidDataSource
user: root
password: q1w2e3r4
initialSize: 1
minIdle: 3
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: select 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
connectionErrorRetryAttempts: 0
breakAfterAcquireFailure: true
创建hive操作和测试类
连接配置类-HiveDruidConfig:
内容:
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Data
@Configuration
@ConfigurationProperties(prefix = "hive")
public class HiveDruidConfig {
private String url;
private String user;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private int connectionErrorRetryAttempts;
private boolean breakAfterAcquireFailure;
@Bean(name = "hiveDruidDataSource")
@Qualifier("hiveDruidDataSource")
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(user);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
datasource.setConnectionErrorRetryAttempts(connectionErrorRetryAttempts);
datasource.setBreakAfterAcquireFailure(breakAfterAcquireFailure);
return datasource;
}
@Bean(name = "hiveDruidTemplate")
public JdbcTemplate hiveDruidTemplate(@Qualifier("hiveDruidDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
业务实现类-HiveService:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class HiveService {
@Autowired
@Qualifier("hiveDruidDataSource")
private DataSource druidDataSource;
private String tableName = "tb_1";
public Map queryHiveData() {
String sqlString = "select * from "+tableName;
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
Map result = new HashMap();
try {
conn = druidDataSource.getConnection();
statement = conn.createStatement();
List list = new ArrayList();
rs = statement.executeQuery(sqlString.toString());
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
while (rs.next()) {
Map obj = new HashMap();
// 遍历每一列
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
String value = rs.getString(columnName);
obj.put(columnName, value);
list.add(obj);
}
list.add(obj);
}
result.put("data", list);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
statement.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
业务类查询,查询的是前面步骤hive后台创建的表 tb_1,自己写的时候根据自己创建的表修改表名。
hive的controller测试类-HiveController:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Slf4j
@RestController
public class HiveController {
@Autowired
private HiveService hiveService;
@RequestMapping("hiveQuery")
public Map query(){
Map info = hiveService.queryHiveData();
return info;
}
}
目录结构:
测试
浏览器访问查询接口:http://localhost:8080/hiveQuery
查询tb_1 表的数据。
测试结束。