大数据学习之路55-sqoop安装及从mysql导入数据到hdfs,导入数据到hive示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37050372/article/details/82148680

安装sqoop步骤:

1.首先解压

2.修改配置文件

mv sqoop-env-template.sh sqoop-env.sh

那么配置文件中的hadoop_common_home和hadoop_mapred_home是什么意思呢?

sqoop是cdh公司贡献出来的,cdh就是hadoop的封装版本。

cdh安装的时候会把hadoop的库安装到不同的目录。不像我们都安装到一个目录。所以它配置的时候需要分开指定。

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/root/app/hadoop-2.8.4

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/root/app/hadoop-2.8.4

#set the path to where bin/hbase is available
export HBASE_HOME=/root/app/hbase-1.2.1

#Set the path to where bin/hive is available
export HIVE_HOME=/root/app/hive-1.2.1

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/root/app/zookeeper-3.4.13

导入表数据到hdfs

bin/sqoop import \
--connect jdbc:mysql://marshal:3306/test  \
--username root \
--password root \
--table emp \
--columns 'id ,name ,deg ,salary ,dept' \
--m 1

如果不指定路径的话,会默认导入到/user/hadoop/emp/下面

导入到hdfs指定目录:

bin/sqoop import \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--password root \
--target-dir /queryresult \
--fields-terminated-by '\001' \
--table emp --m 1

要连接mysql还需要将mysql的驱动放到sqoop的lib下面

每条语句后面的 \ 代表语句还没有写完。是将换行转义了。

--m 1的意思是只有一个map

执行这条语句是在执行一个mapreduce过程,实际上只有map过程,因为sqoop不需要对数据进行处理,只需要进行数据迁移。

下面的命令用来导入emp_add表数据的子集,子集查询检索员工ID和地址,居住城市为Secunderabad

bin/sqoop import \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--password root \
--where "city='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1

按需导入

bin/sqoop import \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--password root \
--target-dir /wherequery2 \
--query 'select id,name,deg from emp where id >1207 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2

and $CONDITIONS是必须要有的,是为了防止语句出错,类似于 1 == 1的作用。

split-by id的作用是为了切片,因为运行的时候有好几个maptask,而一个maptask有一个切片。这里我们指定的是按照id去切片。然后它就会搜索一下id的范围,然后再划分一下,并行处理。

导入数据到hive:

我们有的时候想要直接将mysql的数据导入到hive中,其实我们不用这个功能也可以做到,我们可以先将数据导入到hdfs中,接着在hive中建一个表然后就可以将hdfs中的数据load到hive中。sqoop可以帮我们做这些事情,可以更省事一点。

bin/sqoop import  \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--password root \
--table emp \
--hive-import \
--hive-table haha \
--m 1

这里唯一不同的就是多了--hive-import ,有了这个之后就表示,将数据导入hdfs之后再将数据导入hive中,所谓的导入hive就是在hive中建立一个表目录,然后将数据放入表目录中。

执行这个语句的时候不需要hive启动,因为它可以将直接修改hive的元数据,然后在hdfs的目录下建个文件夹,把文件放进去就可以了。hive的元数据存放在mysql中,那sqoop又是怎么知道元数据在哪的,因为我们之前在hive的配置文件中配置过hivehome,所以他可以找到hive的元数据。

将hdfs中的数据导出到mysql:

bin/sqoop export \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--password 123456 \
--export-dir /b  \
--table emp2 \
--input-fields-terminated-by ',' \
--m 1

将hive中的数据导出:

bin/sqoop export \
--connect jdbc:mysql://marshal:3306/sqooptest \
--username root \
--export-dir /user/hive/warehouse/haha \
--table emp2 \
--input-fields-terminated-by '\001' \
--m 1

这里导出的时候没有--hive-export的用法

猜你喜欢

转载自blog.csdn.net/qq_37050372/article/details/82148680