sqoop的使用及Hive链接mysql bug

来源:互联网 发布:网络直播培训机构红人 编辑:程序博客网 时间:2024/05/21 15:02

sqoop操作
测试(列出数据库):
./sqoop list-databases \
--connect jdbc:mysql://192.168.138.123:3306/ \
--username root \
--password root
import:(RDBMS--->HDFS,HIVE,HBASE)
export:(HDFS,HIVE,HBASE--->RDBMS)
----------------------------------------------------------导入到hdfs
./sqoop import \
--connect jdbc:mysql://192.168.138.123:3306/db01 \
--username root \
--password root \
--table test \
--target-dir /sqoop/import/test \
--num-mappers 1 \
--lines-terminated-by '\t'
----------------------------------------------------------------
./sqoop import \
--connect jdbc:mysql://192.168.138.123:3306/db01 \
--username root \
--password root \
--table test \
--target-dir /sqoop/import/order1 \
--num-mappers 1 \
--fields-terminated-by '\t'
--columns id,age \
--where 'id>1'
----------------------------------------------------------------
--connect: 连接数据库的参数
--username: 使用的用户名
--password: 密码
--table: 表名
--target-dir: 导入到hdfs的目录
--num-mappers 1: 使用的mapper的个数
--fields-terminated-by: 指定列的分隔符(默认使用,分隔)
--columns 指定列
--where 指明where查询条件
--query 指定query查询语句
--------------------------------------------------------------------
举例:
./sqoop import \
--connect jdbc:mysql://192.168.138.123:3306/db01 \
--username root \
--password root \
--target-dir /sqoop/import/order \
--num-mappers 1 \
--fields-terminated-by '\t' \
--query 'select * from test where id > 1 and $CONDITIONS'
注意:
1.--query 不能和 table  columns  where合用
2.--query必须和$CONDITIONS一起使用
-----------------------------------------------------导入到hive表
1.建立一个空的hive表
create table db01.student_hive(
     id int,
     name string,
    age string
    )
    row format delimited fields terminated by '\t';

2.导入hive表
--hive-import 指明导入到hive表
--hive-overwrite 如果hive表中已存在则覆盖
--hive-database db01 指明导入到hive哪个数据库
--hive-table stuhive 指明导入到hive的表名
./sqoop import \
--connect jdbc:mysql://192.168.138.123:3306/db01 \
--username root \
--password root \
--table test \
--num-mappers 1 \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-database db01 \
--hive-table  student_hive
注意:如果导出过程失败,需要到HDFS目录当前用户目录下将临时目录删除,
hdfs当前用户目录下不能存在表目录,可以另外指定--target-dir   --delete-target-dir
-------------------------------------------------从hive导出到mysql
./sqoop export \
--connect jdbc:mysql://192.168.1.101:3306/sqoop \
--username root \
--password root \
--table student2 \
--num-mappers 1 \
--export-dir /user/hive/warehouse/db01.db/student_hive \
--input-fields-terminated-by "\t"
--export-dir: 从hdfs上哪个目录导出
--input-fields-terminated-by "\t" 要导出的文件字段是以什么进行分隔的

------------------------------------------------------
./sqoop export \
--connect jdbc:mysql://192.168.1.101:3306/sqoop \
--username root \
--password root \
--table student3 \
--num-mappers 1 \
--export-dir /nicole/sqoop/import/student \
--input-fields-terminated-by "\t"
---------------------------------------------------------参数  --options-file
作用是使用文件编辑sqoop的参数和命令,然后使用--options-file参数来执行。
# vi job1.opt
export
--connect
jdbc:mysql://192.168.1.101:3306/sqoop
--username
root
--password
root
--table
student4
--num-mappers
1
--export-dir
/nicole/sqoop/import/student
--input-fields-terminated-by
"\t"
执行语句:
./sqoop --options-file job1.opt

执行语句:./sqoop list-databases \
--connect jdbc:mysql://192.168.138.123:3306/ \
--username root \
--password root

可能出现的问题:

如下密码输入错误:


2、版本兼容问题:

 ERROR manager.SqlManager: Error reading from database: java.sql.SQLException: 
Streaming result set com.mysql.jdbc.RowDataDynamic@1ee07d1d is still active. 
No statements may be issued when any streaming result sets are open and in use on a given connection.
 Ensure that you have called .close() on any active streaming result sets before attempting more queries.

我是将hive和sqoop lib下的mysql connector都改为mysql-connector-java-5.1.34-bin.jar 解决的问题。


3、hdfs中文件已存在,换一个。


4、会话连接失败(ip地址或者主机名写错)

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure


5、ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 88

将mysql中的表导入到hive中时:hive需要保持运行状态,

解决方法:多开一个terminal


6、Error: java.io.IOException: Can't export data, please check failed map task


这个问题 1、如果hive中的数据是由hdfs中导入的,其分隔符是'\t'。

                2、如果是由hive执行mapreduce操作汇总的结果,默认的分隔符是 '\001'。

我的是通过:

create table logs_tmp as select

count(ip)pv,

count(case when url like ”%member.php% ” then url else null end) register,

count(distinct ip) ip from logs;

所以导出的时候需要用‘\001’。

./sqoop export --connect jdbc:mysql://192.168.138.123:3306/topiclogs --username root --password root  --table logs  --num-mappers 1 \

--export-dir /user/hive/warehouse/topic.db/logs_tmp \

--input-fields-terminated-by "\001";




0 0
原创粉丝点击