部署单机版的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&amp;characterEncoding=UTF-8&amp;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脚本处理数据。

  1. 在上一步的命令行中,创建测试表
CREATE TABLE u_data (
  userid INT,
  movieid INT,
  rating INT,
  unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
  1. 下载测试数据并解压
wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
  1. 命令行中,加载测试数据
LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;
  1. 查看数据量,应该有10w条
SELECT COUNT(*) FROM u_data;
  1. 在文件系统中,新建一个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)])
  1. 在命令行中加载这个脚本,并通过这个脚本处理测试数据,存入表中
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;

posted @ 2020-12-01 10:14  mosakashaka  阅读(873)  评论(0编辑  收藏  举报