Hadoop相关的东西在版本兼容性方面都很麻烦,这个例子里用的Sqoop是1.4.2, Hadoop是Apache的1.0.4; 本例介绍的方法未必适用其他版本的Sqoop和Hadoop.
1.安装Sqoop
下载、解压
略
编译
$ant -Dhadoopversion=100 #这里的100表示编译后的Sqoop将与Hadoop 1.0.*结合使用
配置$HADOOP_HOME变量
Sqoop不认$HADOOP_INSTALL变量,只认$HADOOP_HOME, 所以要把$HADOOP_HOME配置到环境变量中
试运行一下
$sqoop version
2.从mysql中导入数据到HDFS
先把HADOOP启起来
MapReduce服务和HDFS服务都要启起来
把mysql jdbc驱动丢到sqoop的类目录下
$cp mysql-connector-java-5.1.6.jar /home/kent/dev/hadoop/sqoop-1.4.2/lib/
执行sqoop import
$sqoop import --connect jdbc:mysql://localhost/kent --username kent --password *** --table user --verbose --target-dir /sqoop/user --fields-terminated-by '\0001' ##导出后的hdfs文件将在/sqoop/user路径下 ##导出后的hdfs文件中列之间将以'\0001'分隔
观察一下控制台输出,
a. 生成了 /tmp/sqoop-kent/compile/b54fd32800d1ddb50c259c709464a35c/user.java
b. user.java被编译打包到了/tmp/sqoop-kent/compile/b54fd32800d1ddb50c259c709464a35c/user.jar
c. 观察Hadoop的控制台,可以看到有新的MapReduce Job产生, 并且这个job只有map任务,没有reduce任务
看下导入后的文件
$hadoop dfs -cat /sqoop/user/part-m-00000
使用direct模式从mysql中导入数据
$sqoop import –connect jdbc:mysql://localhost/kent –username kent –password *** –table user –verbose –target-dir /sqoop/userdirect
–direct #最后加上–direct参数,sqoop将使用mysqldump工具来读取数据
3.把刚刚导入的数据从HDFS中导回到mysql
在mysql中新建user2表以容纳数据
建表时可以照抄user表的ddl
执行sqoop export
$sqoop export --connect jdbc:mysql://localhost/kent --username kent --password *** --table user2 --verbose --export-dir /sqoop/user --input-fields-terminated-by '\0001'
观察一下控制台输出,也会发现有java,jar和mapreduce job被产生
看下表中是否有数据
$select * from user2;
疑难解决
Q: sqoop import时完全呆住了,控制台的输出里也没有错误日志; 看hadoop控制台,也没看到任何job生成,怎么回事?
A: 这时应该看hadoop相关的日志,或者直接运行一下jps,检查一下hadoop所有结点是否都已经起起来了
Sqoop的文档在哪里
sqoop文档需要构建出来
$sudo apt-get install asciidoc #没有这个工具产生不了文档 $ant docs -Dhadoopversion=100
查看文档: file:///home/kent/dev/hadoop/sqoop-1.4.2/build/docs/index.html