大数据开发环境搭建系列五:MySQL、Hive和Sqoop的安装和环境搭建

本文详细记录了搭建大数据开发环境的过程,包括安装配置Hadoop、Zookeeper、HBase、Hive和MySQL。重点讨论了Hive的安装,特别是Hive与MySQL的集成,作为元数据存储,以及使用Sqoop进行数据传输的实践。在解决问题的过程中,作者强调了日志查看和错误排查的重要性,并分享了遇到的错误及解决方案。
摘要由CSDN通过智能技术生成

1. 写在前面

最近学习推荐系统, 想做一个类似于企业上的那种推荐系统(采用的阿里天池赛的一个电商数据集, 然后基于大数据的Lambda架构, 实现离线和在线相结合的实时推荐系统), 这样可以熟悉一下真实环境中的推荐系统流程, 但是这里面需要大数据的开发环境, 所以这里的这个系列是记录自己搭建大数据开发环境的整个过程, 这里面会涉及到Hadoop集群,Spark, zookeeper, HBase, Hive, Kafka等的相关安装和配置,当然后面也会整理目前学习到的关于前面这些东西的相关理论知识和最终的那个推荐系统, 经过这一段时间的摸索学习, 希望能对大数据开发和工业上的推荐系统流程有个宏观的初识,这一块涉及到技术上的细节偏多, 所以想记录一下, 方便以后查看和回练, 开始 😉

上一篇文章完成了Zookeeper和HBase的安装和环境搭建, 这篇是MySQL、Hive和Sqoop的安装和环境搭建,Hive是基于Hadoop的一个数据仓库工具,可以将结构化数据映射为数据库表,并提供HQL查询, 底层数据是基于HDFS, Hive的本质是基于HDFS的MapReduce计算框架,和SQL语言类似, 然后将SQL语句转成MapReduce任务运行,这样大大减少了直接使用MapReduce的难度,主要是用来做离线数据分析的, 而Hive的默认元数据要用到MySQL, 所以我们先装一下Hive,设置环境,这时候元数据存储在Hive自带的derby数据库中,看看有什么弊端,然后我们装一下MySQL,把Hive的元数据配置到MySQL中去。 最后我们还要装一个Sqoop, 这是一款数据传输工具, 可以在Hadoop的hdfs和关系型数据库之间传输数据,即很轻松的利用它实现MySQL和HDFS之间的数据互传。 下面开始。

开启三台虚拟机, 然后进入master。

2. Hive环境安装和配置

首先需要来讲一下Hive和Hadoop的关系:

  1. Hive是利用HDFS存储数据, 利用MapReduce查询分析数据的,相当于把MapReduce进行了一种封装,方便我们写代码,其实执行的时候还是翻译成MapReduce代码在Hadoop上执行
  2. 所以Hive是数据仓库工具,没有集群的概念,如果想提交作业,只需要在Hadoop集群Master节点装Hive就可以了

关于Hive更多的理论知识,这里不整理, 直接安装了。

2.1 Hive安装

Hive共有三种安装模式:

  1. 单用户模式(本地模式): 它的元信息存储在hive自带的Derby数据库中, 同一个时刻只能为一个用户提供服务,可以简单的测试hive程序
  2. 本地MySQL模式: 元信息存储在本地MySQL中,同一个时刻可以为多个用户提供服务,用于开发测试hive程序
  3. 远程MySQL模式:元信息存储在远程MySQL中,同一个时刻可以为多个用户提供服务,用于实际生产环境

这里主要是玩一下第一种和第二种, 首先是第一种模式,就是Hive的本地安装模式, 首先还是把下载好的安装包解压,然后移动到bigdata/Hive下面并重命名:

tar zxvf apache-hive-2.1.1-bin.tar.gz 
sudo mkdir /opt/bigdata/hive/
sudo mv apache-hive-2.1.1-bin /opt/bigdata/hive/hive2.1

然后配置环境变量, 这个一开始就做完了,这里依然重温一下:

vi /etc/profile

# 加入Hive Config
export HIVE_HOME=/opt/bigdata/hive/hive2.1
export HIVE_CONF_DIR=${HIVE_HOME}/conf

export PATH=${Hive_CONF}/bin:$PATH

source /etc/profile

这样Hive安装完毕。

2.2 Hive的配置

这里的配置和前面的HBase,zookeeper等类似的,也是需要去hive2.1/conf/hive-env.sh进行修改配置,这些东西原理上是一样的其实, 在这里面要指定Hadoop_home和hive_conf_dir的路径, 总体命令如下:

cd /opt/bigdata/hive/hive2.1/conf

cp hive-env.sh.template hive-env.sh
sudo gedit hive-env.sh 

在里面加入:

在这里插入图片描述

2.3 Hadoop集群配置

为了能让Hive能在hdfs上读取数据,我们还需要配置对hadoop集群进行一些配置。 首先启动hadoop集群start-all.sh, 然后再HDFS上创建/tmp和/user/hive/warehouse两个目录,并修改他们的同组权限可写。

hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /hive/warehouse

# 修改权限为同组可写
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /hive/warehouse

2.4 启动hive

这时候就完成hive的安装和配置了,我们启动hive

hive

结果没有想的那么顺利,这里就开始迎来了报错, 果真,没有教程靠着自己一步一步的摸索,有点艰难,第一个错误是:Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

这个错误的原因是我Hive的版本过高导致的,因为看的那篇博文中采用的Hive1.2.1, 而我这里用的Hive2.1,没想到竟然版本会不匹配。 那咋办? 降版本? 哈哈, 我可不是那么轻易就妥协的, 没有换, 而是通过查资料发现Hive2需要hive元数据库初始化, 也就是在启动Hive之前, 先对元数据库进行初始化。 于是我就采用了下面的命令对元数据初始化:

schematool -dbType derby -initSchema   # 因为目前没装mysql而用的自带的数据库derby,如果元数据库是mysql的话,这里需要把derby换成mysql

结果迎来了第二个报错哈哈,现在已经让错误打击的无错误了,有错就解决呗, 虽然这些错真实情况中不一定遇到,但是不可否认的是心里承受能力在增强, 看看这个错误Error: FUNCTION 'NUCLEUS_ASCII' already exists. (state=X0Y68,code=30000)org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent!!, 竟然初始化失败,原因是上面启动hive之后, 会在当前的目录生成derby.log和metastone_db, 既然元数据库已经出来了,再初始化就没有意义了,于是乎报了这个错误。 解决方法的话就迎刃而解了, 删除掉这两个,然后先初始化,然后再hive启动, 就进来了:

show databases;
user default;
show tables;
create table student(id int, name string);
desc student;
insert into student values(1000, "ss")

可以发现,这东西就是在写SQL语句了,
在这里插入图片描述
还可以导入本地文件的数据, 比如我们把本地的一个student.txt的数据导入到hive的student表中去。

# 数据准备
mkdir data
cd data
touch student.txt
vi student.txt

# 输入  \tab间隔
1001	wu
1002	zhong
1003	qiang

# 启动hive, 删除上面建立的student表,因为如果想本地导入的时候,建表的时候需要做个声明,所以下面重新建表
show databases;
use defalut;
show tables;
drop table student;
create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

# 加载student.txt文件到student表中
load data local inpath 'data/student.txt' into table stduent;

结果如下:
在这里插入图片描述
这样就搞定了, 但是此时,如果我再打开一个命令行窗口, 然后再尝试启动Hive, 就会产生报错, 就是上面的第一个错误, 究其原因, 还是一个道理,就是需要将元数据库初始化,也就是删除原来的,然后重新初始化,才能启动。 那么显然,删除原来的,我们上面的表啥的就功亏一篑了。 这个是我做的测试:

在这里插入图片描述
这是因为Hive自带的Derby数据库中, 同一时刻是能为一个用户提供服务,那这个不行呀肯定, 所以一般推荐使用MySQL来存储Metastore。 所以接下来需要安装MySQL了。

把上面做的实验都删除掉,即把data目录, metastore_db目录和derby.log删除掉,咱重新开始。

3. MySQL的安装和相关配置

先查看一下MySQL是否安装了,如果安装了,得卸载掉:

rpm -qa | grep mysql  # 我这里是新机器,没有装过,如果装了的话,要先卸掉

rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64  # 后面这个是装过的mysql名字,也就是上面找到的MySQL名字

下面开始准备安装包, 依然是使用之前下载好的安装包, 有一个mysql-libs.zip, 把这个解压。

# 先建立一个目录,以防止解压的时候解压散了
mkdir mysql-libs
mv mysql-libs.zip mysql-libs
upzip mysql-libs.zip

# 如果没有unzip命令, 可以安装一下, 但前提需要联网,如果本来连着的后来发现断了, 重启网络服务 service network restart
yum install -y unzip zip

# 这时候会出来一个mysql-libs目录, 把这个移动到/opt/bigdata/mysql
sudo mkdir /opt/bigdata/mysql
mv mysql-libs /opt/bigdata/mysql/mysql5.6

# 进入到mysql5.6, 然后切换成root, 开始安装服务器和客户端
cd /opt/bigdata/mysql/mysql5.6
su

3.1 安装mysql服务和客户端

3.1.1 安装mysql服务器端
# 在mysql5.6里面 root用户
rpm -ivh MySQL-server-5.6.24-1.el6.x86_ 64.rpm 

这里又经历了两个报错, 不过已经习以为常了, 有错误就解决,第一执行这个命令报错:file /usr/share/mysql/charsets/README from install of MySQL-server-5.6.24-1.el6.x86_64 conflicts with file from package mariadb-libs-1:5.5.56-2.el7.x86_64, 这个错误的解决方式删掉后面那个东西,因为centos7默认安装的是mariadb,需要先卸载mariadb,执行命令:

rpm -e --nodeps mariadb-libs-1:5.5.56-2.el7.x86_64

第一个报错解决。 然后再次执行命令, 迎来了第二个报错:FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:, 这个报错的解决办法是装autoconf库, 执行命令:

yum -y install autoconf

第二个报错解决,然后再次执行命令, 终于安装成功:

在这里插入图片描述
然后试图启动mysql服务:

# 查看mysql服务运行状态
service mysql status

# 启动mysql
service mysql start

结果又报错:Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/master.pid).前面那个东西的报错网上搜了半天说造成这种问题的原因很多, 然而后面括号里面给的那个信息,想了想, 然后尝试了这样一个命令:

ps -ef | grep mysqld

# jps显示当前所有java进程pid的命令
# PS是LINUX下最常用的也是非常强大的进程查看命令 e表示显示所有进程, f是全格式
# grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来

结果发现了

在这里插入图片描述
竟然这里启动了一个mysqld进程了, 果断杀死。但发现还是会报同样的错误, 然后就试各种方法,无果, 只能想办法找报错日志,这次安装是直接用的下载好的安装包, 安完了之后都不知道在哪,所以找这个报错日志也花费了些时间,最后找到了:

find / -name mysql

# 发现了mysql的安装目录 /ver/lib/mysql
cd /ver/lib/mysql

cat master.err   # 这就是报错日志,在这里面又发现了新错误

Can't open the mysql.plugin table. Please run mysql_upgrade to create it.然后又查这个错误,最后

mysql_install_db --user=mysql --ldata=/var/lib/mysql/

这一行命令得以解决上面的问题, 也不知道啥原因,但是终究开启了mysql服务:

在这里插入图片描述
并且这里还给出了后面连接mysql的一些说明:

在这里插入图片描述
虽然没有读懂啥意思, 但是尝试着去执行上面的命令,发现最下面那个有,执行了一下,提示需要安装客户端,所以下面的步骤水到渠成了。 继续往下走, 安装mysql客户端

3.1.2 安装mysql客户端

进入到/opt/bigdata/mysql/mysql5.6下面, 执行命令

rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm

然后再进入到/usr/bin目录,执行命令:

mysql_secure_installation

这时候,会引导我们给root用户设置登录密码啥的一系列, 我都点了yes,并设置好了密码。 之前参考一篇文档说安装上mysql服务器之后,自动在/root下生成.mysql_secret,在这里面是随机密码,等安了客户端之后,root用户用这里面的密码登录数据库,然后再修改的逻辑。而我这里没有这个.mysql_secret,可能是系统或者啥的版本不匹配吧,所以我这里只能摸着石头过河, 不停的试错, 终于,我这里也出来了一套逻辑,就是安装上mysql服务器之后,只要能启动成功,然后去装客户端,然后用上面的那个命令去引导设置密码, 之后,我们就可以以root+密码的身份与mysql进行连接了。

mysql -u root -p
# 然后输入密码就能进入mysql>

经过一路的疯狂报错,到这里终于把mysql装上了。 由于之前没有设置/usr/my.cnf文件,所以我这里探索了一下默认的数据库和表都安装在了啥位置,由于有一些测试数据库在里面,我首先show了一下目前的databases, 发现:

在这里插入图片描述
既然这里有数据库,我就find命令找了一下位置,结果发现默认存储目录是/var/lib/mysql,为了验证,我新建立了一个数据库,然后在里面建立了一个student表, 结果也证明就是在这个地方。

show databases;
create database test;
use test;
create table `stu`(`id` int, `age` int);   # mysql建表得这么建

插入了数据, 然后查看:

在这里插入图片描述
这时候,进入上面的那个目录查看,结果就发现了数据库和建立的表stu:

在这里插入图片描述
还有就是这里的权限是root用户。这样mysql就搞定了。 我天, 这个花费的时间真多。

这里我再补充一个能够远程连接mysql的图形化界面工具叫做navicat, 这个东西能在window上连接服务器上的mysql, 然后有图形化界面,能够傻瓜式的创建数据库,表等一系列操作,这个安装就不解释了,下个安装包安装就可以(我开始给出的所有安装包里面也有了),界面是这个样子的:
在这里插入图片描述
我这个已经连接上了我的远程数据库了,连接非常简单,输入主机ip即可搞定,连接名随便起。 这里操作完全是傻瓜式的操作,什么查询啊啥的,都是手动输入就可以了,不用SQL命令,用起来还是挺方便的。关于使用,我还找了篇博客

下面还得让Hive的元数据配置到mysql上。

首先, 在mysql上创建hive元数据库,并对hive进行授权, 进入mysql, 输入下面命令

# mysql -u root -p
create database if not exists hive_metadata;
grant all privileges on hive_metadata.* to 'root'@'%' identified by '123456';
grant all privileges on hive_metadata.* to 'root'@'localhost' identified by '123456';
grant all privileges on hive_metadata.* to 'root'@'master' identified by '123456';
flush privileges;                       //刷盘生效

4 Hive元数据配置mysql

4.1 驱动拷贝

如果想让Hive使用mysql,这里得需要把mysql的驱动放到hive里面, 直接上操作了,之前解压mysql-lilb.zip的时候,那个驱动就在那里面。所以这里直接进入到/opt/bigdata/mysql/mysql5.6目录,执行命令, 直接root用户搞了:

tar zxvf mysql-connector-java-5.1.27.tar.gz 

# 进入解压出来的目录
cd  mysql-connector-java-5.1.27/

# 把下面的mysql-connector-java-5.1.27-bin.jar拷贝到/opt/bigdata/hive/hive2.1/lib/
cp mysql-connector-java-5.1.27-bin.jar /opt/bigdata/hive/hive2.1/lib/

这一步结束。

4.2 配置Metastore到MySQL

在/opt/bigdata/hive/hive2.1/conf目录下创建一个hive-site.xml, 然后进行修改这东西

# 进入到那个目录下
cd /opt/bigdata/hive/hive2.1/conf

# 复制一份模板出来
cp hive-default.xml.template hive-site.xml

# 编辑
gedit hive-site.xml

把里面所有内容删除, 这里是个坑, 之前我保留了所有的,然后后面加入了一些,告诉我一些配置错误,所以这里全部删除,然后用官方模板添加:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
	  <name>javax.jdo.option.ConnectionURL</name>
	  <value>jdbc:mysql://master:3306/hive_metadata?createDatabaseIfNotExist=true</value>
	  <description>JDBC connect string for a JDBC metastore</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>123456</value>
	  <description>password to use against metastore database</description>
	</property>
	<property>
	  <name>hive.metastore.warehouse.dir</name>
	  <value>/hive/warehouse</value>  
	</property>
</configuration>

然后, 初始化hive的元数据库,这里就是mysql了

schematool -dbType mysql -initSchema

这里初始化成功:

在这里插入图片描述
然后启动hive, 当然,首先还是要先启动Hadoop集群, root用户下启动Hadoop集群的话,还是需要输入各种密码啥的, 也可以转成icss用户。 输入命令

hive

这里一开始的时候,hive-site.xml配置有点小问题, 结果导致启动到一半,到这里卡住不动了:

在这里插入图片描述
这对于我来说太难受了,我不怕出错,就怕在这里卡住,也不说哪里有问题,搞得又怀疑了一段人生, 这上网查询都没法查, 这里也卡了我一段时间, 最后让我想到了日志, 这个东西最终发现太重要了。 所以我换一种问题,搜了一下“Hive如何查看运行日志”,多亏了这篇文章, 让我知道了还能在启动的时候输出日志信息,于是,我用了下面命令启动Hive:

hive --hiveconf hive.root.logger=DEBUG,console

果真,用debug的方式启动,也终于报出了错误:

在这里插入图片描述
通过这里,我就发现了是我hive-site.xml的配置里面出现了问题,找到这个地方,就是上面配置里面的第一个name-value对,发现最后多打了一个空格。 真是醉了,这个是复制一篇博文里面的,这小细节如果不debug的话,恐怕我这一天都耗到这里了。还好,最终完美解决。

这个真的卡了我好久, 预估得一个小时在这, 这一个小时给我带来了两个教训:

  1. Linux里面日志非常重要,真的是非常重要,所以一定要善于查看日志, 不管是各种服务还是各种软件,执行过程中都会有日志产生,报错信息也都会在里面
  2. 下面这句话我觉得会适合大多数软件,所以之后如果遇到了卡到了某个位置不进行了,一般是遇到错误了,且这种错误可能在日志里面,所以想办法看看能不能找到日志或修改一下日志级别,将Debug信息打印出来,不要试图重启或者各种查,因为卡到某个位置,问题本身就不明确,所以搜出的解决办法也不一定好使,所以还是先找问题,后找办法。
    在这里插入图片描述
  3. 遇到问题,冷静下来,换一种思考方式可能会更好,千万不要慌或者烦躁, 大不了就重装一次hive呗哈哈。

这时候就可以发现,可以多窗口启动hive了:
在这里插入图片描述
这时候,我们在hive中建立那个student表:

show databases;
use default;
create table student(id int, name string);
insert into student values(1000, "ss")

# 在建立一个数据库
create database test;

这时候就会发现在hdfs上的/hive/warehouse下面,就多出了一个表和一个数据库:
在这里插入图片描述
然后再查看一下student里面的文件信息,就会发现:

在这里插入图片描述
就是之前插入到student中的表的信息, 也就是说我们在Hive中建立的表和数据库,存到了hdfs的warehouse中来。

这样,我们就搞定了基于mysql的Hive环境搭建,下面在安装一个小工具结束。

4. Sqoop的安装和配置

Sqoop是一款进行数据传输工具, 可以在Hadoop的Hdfs和mysql之间传输数据,非常方便, 这个安装起来比较简单, 首先依然是三步, 解压,移动,重命名。

tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 
sudo mkdir /opt/bigdata/sqoop/
sudo mv sqoop-1.4.7.bin__hadoop-2.6.0 /opt/bigdata/sqoop/sqoop1.4
sudo chown icss:icss /opt/bigdata/sqoop

配置环境变量,由于Sqoop是后来加的,之前没有配过,这里来配置一下,和前面的一样的套路,命令如下:

gedit /etc/profile

# 在里面加入
export SQOOP_HOME=/opt/bigdata/sqoop/sqoop1.4
export PATH=${SQOOP_HOME}/bin:$PATH

# 生效
source /etc/profile

下面进行Sqoop的相关配置

cd /opt/bigdata/sqoop/sqoop1.4/conf

cp sqoop-env-template.sh sqoop-env.sh
sudo gedit sqoop-env.sh

在里面加入:

在这里插入图片描述
接下来配置mysql, 把mysql的驱动包加入sqoop的lib中去,执行下面命令:

cp /opt/bigdata/hive/hive2.1/lib/mysql-connector-java-5.1.27-bin.jar /opt/bigdata/sqoop/sqoop1.4/lib/

这样就搞定了,启动一下:sqoop help

在这里插入图片描述

5. 小案例把上面的串起来

折腾了一天,终于把Hive和mysql装完,然后又装了一个可以在两者直接传数据的Sqoop, 那么接下来就来个小例子把上面的东西用一下,看看好使不。 这个例子就是使用Sqoop将mysql中的数据导入到Hive中。

开启Hadoop集群, 开启mysql服务:

start-all.sh
service mysql start

5.1 准备数据

这里使用mysql建立如下表:

mysql -u root -p

# 进去之后,使用test数据库,然后建表
use test;

create table `u`(`id` int PRIMARY KEY AUTO_INCREMENT, `fname` varchar(20), `lname` varchar(20));

insert into student (fname, lname) values ('George', 'washington');
insert into student (fname, lname) values ('George', 'bush');
insert into student (fname, lname) values ('Bill', 'clinton');
insert into student (fname, lname) values ('Bill', 'gates');hiv

数据准备完毕,看下结果:
在这里插入图片描述

5.2 Sqoop 导入

  • 命令语法:sqoop import (控制参数)(导入参数)
  • 命令元素: 导入操作,数据源, 访问方式, 导入控制,目标地址
  • 命令理解:数据从哪个数据库的哪个表到哪里去

下面用Sqoop把test数据库里面的u表导入到hdfs的/tmp/u1目录下

sqoop import --connect jdbc:mysql://master:3306/test --username root --password 1234567 --table u --target-dir /tmp/u1 -m -1

这里竟然又报了一个错误:ERROR manager.SqlManager: Error executing statement: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'root'@'master' to database 'test' ,这一看就是权限的问题了, 应该用hive_metadata数据库的。 既然这里报错了,那就给test数据库授权一下吧。在mysql中, 输入

grant all privileges on test.* to root@"" identified by "1234567";
flush privileges;

这样这个问题得到了解决,但是又出现了一个问题,java.lang.Exception: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class u not found, 这个问题又卡了我好久,并且百度也百度不出这里的错误来, 一开始我以为是数据库使用的问题,因为Hive那里使用的是hive_metadata数据库, 而这里用了test数据库, 于是我就重新在hive_metadata里面又建立了一个同样的student表,想把这个传上去,即:

# 这里改了数据库和表名
sqoop import --connect jdbc:mysql://192.168.56.101:3306/hive_metadata --username root --password 123456 --table student --target-dir /tmp/u1 -m -1

结果这里又报了一个新的错误:ERROR tool.ImportTool: Import failed: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/tmp/u1 already exists, 这个意思大概能明白,就是目前hdfs上已经有这个tmp/u1了,因为上面传的时候虽然失败了,但是目录建立好了,这里不能忘那里面传了。 所以这个错误的解决方法就是删除掉hdfs上的u1目录。

hadoop fs -rm -r /tmp/u1

这样再运行,报了一个java.lang.Exception: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class student not found, 我就知道了确实java的问题了。 最后的解决方式是从参数中加上--bindir ./因为用的是local job,sqoop生成的class在本地产生之后,不会加到classpath中。到这里,终于看到了曙光。所以执行以下新的命令:

# 还是得先删除掉
hadoop fs -rm -r /tmp/u1

# 然后再root用户上执行, 我用icss报权限不够, 这里面加了--bindir ./ 问题解决
sqoop import --connect jdbc:mysql://192.168.56.101:3306/hive_metadata --username root --password 123456 --table student --bindir ./  --target-dir /tmp/u1 -m -1

这样,终于完成了Sqoop的导入过程,结果如下:

在这里插入图片描述
上面总结起来就是:

  1. 最终的命令是最后这一个, 要指定--bindir ./
  2. 如果之前已经有了target-dir了,会报冲突
  3. –target-dir是可选参数,如果不加这个默认是hdfs里面的/user/当前linux用户名/mysql表名/

5.3 通过Hive建立外表导入数据到Hive

启动Hive, 然后建立表的时候这样建立:

create external table stu(
	id int, 
	fname string, 
	lname string) 
	row format delimited fields terminated by ',' 
	location '/tmp/u1/';

这时候,就能把mysql的数据通过Sqoop传到hdfs上,然后hive再从hdfs上直接读入了。

在这里插入图片描述
今天的这篇文章到这里就完事了,今天感觉一天都在踩雷,因为后面的这几个框架的安装搭建我也是第一次搞,没有之前的那种逻辑可以参考了,且搜的各种文章众说纷纭,写的和版本都不一样, 所以这一篇走的就相对来说艰难了些, 但是通过今天的这些雷,让我对于MySQL和Hive的一些配合,以及mysql的安装有了一个更深刻的了解,也明白了里面的一些逻辑思想,并且感觉确实现在心里承受能力有些提高, 甚至看到报错之后有点小兴奋哈哈,毕竟有错误就能开拓新知识,虽然可能没有用,但我也不嫌多。 并且通过今天,把Linux的命令又熟练了一下, 好了, 比较难的部分都搞定了。

现在大数据开发或者说想做实时推荐,分布式存储有了(HDFS), 分布式计算有了(MapReduce,Spark), 再加上几个数据库(Hive,Hbase,SparkSQL,MySQL), 再加上一个流式框架(SparkStreaming)差不多已经全乎了, 下面的一篇是Kafka和flume的安装和搭建,这两个和日志的收集有关了, 可以通过这俩东西收集用户的日志行为, 然后传给spark数据处理,然后再进行后面的建模等操作等。继续Rush 😉

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值