部署单机版的hadoop+hive小记
前言
在本机模拟器的ubuntu18版本上进行的部署测试,参考的官方文档:
使用的版本:
- hadoop: 3.2.1
- hive: 3.1.2
全程是使用root账号进行的配置。
hadoop安装配置
hadoop使用的是虚拟集群,即单机模拟集群,datanode和namenode在同一个节点。
1. 下载安装
在官方下载最新版本压缩包解压到服务器就好
2. 环境变量配置
这里用到了这几个变量,我是直接配置在了/etc/profile
里。
这里也有HIVE使用到的变量,一并设置了,后续Hive的时候就不再提这块的内容。
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- export PDSH_RCMD_TYPE=ssh
- 这个变量很重要,由于hadoop连接datanode节点,默认会使用pdsh,一开始没有配置的时候怎么也连不上 - export HIVE_HOME=/root/apache-hive-3.1.2-bin
- export PATH=$HIVE_HOME/bin:$PATH
- export HADOOP_HOME=/root/hadoop-3.2.1
3. SSH配置
启动SSH服务
service ssh start
确保可以不用密码就能连接到本机,如果不行的话,生成一下ssh key
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
4. 修改配置文件
其实完全参考官方文档就可以,但是由于Hadoop默认用的是mapreduce框架,我想切换成Yarn,所以需要稍微修改一下,在网上也很好找。
主要修改这几个文件:
core-site.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://DESKTOP-61VV394:9000</value>
</property>
<!-- 下面这的配置是为了Hive添加的,不加的话,会发现Hive的命令行权限不够,连接不了 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
# hadoop-env.sh
# 这几个 XXXX_USER在官方文档里没有提到,但是不配置的话,启动hadoop会报错
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PDSH_RCMD_TYPE=ssh
export HADOOP_HOME=/root/hadoop-3.2.1
export YARN_HOME=/root/hadoop-3.2.1
hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 如下两个配置是为了在虚拟机之外也能访问hadoop的UI页面,否则只能在虚拟机本机查看 -->
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>0.0.0.0:50090</value>
</property>
</configuration>
mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 通过这个配置,指定使用Yarn作为Hadoop的调度框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 如下三个配置如果不指定的话,运行mapreduce的时候,会找不到相应的jar路径 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
yarn-site.xml:
<?xml version="1.0"?>
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- NodeManager获取数据的方式是shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 这里配置本机的`hostname` -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>DESKTOP-6123456</value>
</property>
<property>
5.启动hadoop
进入hadoop目录,格式化namenode
$ bin/hdfs namenode -format
启动hadoop
$ sbin/start-all.sh
启动成功后,可以通过jps
观察启动进程,应该有5个:
5233 NameNode
5462 DataNode
5994 ResourceManager
5740 SecondaryNameNode
6269 NodeManager
6.测试功能
可以通过最简单的目录命令测试
$ bin/hdfs dfs -ls
$ bin/hdfs dfs -mkdir -p /user/root/test
hive安装配置
这里也是跑的单节点hive
1. 下载解压
到官网下载最新的Hive解压即可,没有需要特别主义的
2. Mysql环境配置
hive存储一个是用到了hdfs作为数据存储,另外还需要metastore元数据存储。
默认hive是使用derby的,不需要额外配置,这里我使用的是mysql。具体的mysql安装配置不做介绍。
主要确保为hive创建一个mysql数据库并授权即可,我这里创建的数据库名是Hive,用户名和密码也都是hive。
注意需要把mysql的对应连接库jar包(我用的是mysql-connector-java-5.1.45.jar
)放置在hive的lib目录下。
3. 配置文件修改
# hive-env.sh
export HIVE_CONF_DIR=/root/apache-hive-3.1.2-bin/conf
hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 这个配置不配的话,启动的时候会报Tez启动错误 -->
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
<!-- hive的相关HDFS存储路径配置 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
<!-- 以下是mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://{mysql服务器地址}:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!-- hive UI地址,不配置的话,默认只会在本机可以访问 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
</configuration>
4. 启动hiveserver2
进入hive目录,初始化MySql metastore数据
./bin/schematool -dbType mysql -initSchema
启动Hiverserver2
nohup $HIVE_HOME/bin/hiveserver2 &
启动hive自带的命令行工具
$HIVE_HOME/bin/beeline -u jdbc:hive2://localhost:10000 -n root
然后可以在命令行中测试诸如show tables;
等命令
5. 测试
这里的测试完全来自官方文档,加载外部数据,以及自定义mapreduce脚本处理数据。
- 在上一步的命令行中,创建测试表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
- 下载测试数据并解压
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
- 命令行中,加载测试数据
LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;
- 查看数据量,应该有10w条
SELECT COUNT(*) FROM u_data;
- 在文件系统中,新建一个python脚本文件
注意查看自己的python版本,这里的print是python2.x的语法
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('\t')
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '\t'.join([userid, movieid, rating, str(weekday)])
- 在命令行中加载这个脚本,并通过这个脚本处理测试数据,存入表中
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
add FILE weekday_mapper.py;
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;