安装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的用法