準備html
本示例將實現從MySQL數據庫中將數據導入到HDFS中
參考文檔:
http://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html
http://blog.csdn.net/m_signals/article/details/53190965
http://blog.csdn.net/lazythinker/article/details/52064165
http://blog.sina.com.cn/s/blog_61d8d9640102whof.html
mysql數據庫信息:
test庫中user表中的記錄(共1條)
HDFS數據狀況
建立了一個/root/test的空目錄
實現目標:
本示例須要實現將上方MySQL數據庫中的數據導入到HDFS中node
啓動Hadoop,啓動sqoop,命令行進入sqoopmysql
1 # 設置交互的命令行打印更多信息,打印的異常信息更多 2 set option --name verbose --value true 3 # 鏈接sqoop,其中hadoop1是須要鏈接的sqoop的主機名 4 set server --host hadoop1 --port 12000--webapp sqoop 5 # 查看鏈接 6 show version --all
若是須要使用sqoop進行導入導出操做,須要先建立鏈接。
使用show conncetor命令能夠查看sqoop支持的鏈接器。
而sqoop中默認提供了以下幾種鏈接。 linux
本例實現mysql-->hdfs的數據導入操做,因此須要建立一個mysql的link和hdfs的link。
注意:在建立mysql-link的時候須要將mysql的jar包放入到$SQOOP2_HOME/server/lib/extra-lib目錄中
首先建立mysql-link,過程以下web
1 sqoop:000> create link -connector generic-jdbc-connector 2 Creating link for connector with name generic-jdbc-connector 3 Please fill following values to create new link object 4 Name: mysql-link 5 Database connection 6 Driverclass: com.mysql.jdbc.Driver 7 ConnectionString: jdbc:mysql://10.25.40.37/test 8 Username: root 9 Password:********* 10 FetchSize: 11 ConnectionProperties: 12 There are currently 0 values in the map: 13 entry# protocol=tcp 14 There are currently 1 values in the map: 15 protocol = tcp 16 entry# 17 SQL Dialect 18 Identifier enclose: 19 New link was successfully created with validation status OK and name mysql-link 20 sqoop:000>
以上輸入項說明,下圖中紅色的表示須要輸入的內容。 sql
注意Identifier enclose項須要輸入一個空格,而後回車 數據庫
建立HDFS的link的配置就比較簡單,配置HDFS訪問地址和hadoop配置文件目錄路徑便可apache
1 sqoop:000> create link -connector hdfs-connector 2 Creating link for connector with name hdfs-connector 3 Please fill following values to create new link object 4 Name: hdfs-link 5 HDFS cluster 6 URI: hdfs://hadoop1:9000 7 Conf directory:/usr/local/hadoop/hadoop-2.7.4/etc/hadoop 8 Additional configs:: 9 There are currently 0 values in the map: 10 entry# 11 New link was successfully created with validation status OK and name hdfs-link 12 sqoop:000>
建立job時,配置項較多。
命令:安全
1 # create job -f formLinkName -t toLinkName 2 create job -f mysql-link -t hdfs-link
注意下面紅色部分
sqoop:000> create job -f mysql-link -t hdfs-link
Creating job for links with from name mysql-link and to name hdfs-link
Please fill following values to create new job object
Name: test1(job名稱)app
Database source
Schema name: test(數據庫的schema名稱)
Table name: user(數據庫表名)
SQL statement:
Column names:
There are currently 0 values in the list:
element#
Partition column:
Partition column nullable:
Boundary query:
Incremental read
Check column:
Last value:
Target configuration
Override null value:
Null value:
File format:
0 : TEXT_FILE
1 : SEQUENCE_FILE
2 : PARQUET_FILE
Choose: 0(選擇文本文件)
Compression codec:
0 : NONE
1 : DEFAULT
2 : DEFLATE
3 : GZIP
4 : BZIP2
5 : LZO
6 : LZ4
7 : SNAPPY
8 : CUSTOM
Choose: 0(選擇NONE)
Custom codec:
Output directory: /root/test(這裏輸入HDFS文件的目錄,須要是空目錄)
Append mode:
Throttling resources
Extractors: 2(這裏是參考官網填的2)
Loaders: 2(這裏是參考官網填的2)
Classpath configuration
Extra mapper jars:
There are currently 0 values in the list:
element#
New job was successfully created with validation status OK and name test1
sqoop:000>
命令
1 # start job -name jobName 2 start job -name test1
如下問題均是建立完link和job後,開始啓動job時報的錯。
錯誤緣由:
這問題表示主機10.25.40.37沒有受權外部訪問其MySQL
解決方案:
將鏈接的MySQL主機中的受權信息改了
1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 2 mysql> FLUSH PRIVILEGES;
詳細操做步驟可自行百度。
錯誤緣由:
該錯誤是由於在安裝sqoop時,在hadoop的core-site.xml配置文件中配置的用戶權限錯誤
在以前的sqoop安裝文章裏,按照官網的配置以下。其中hadoop.proxyuser.sqoop2.hosts中的sqoop2是用戶的意思,同理hadoop.proxyuser.sqoop2.groups中的sqoop2是用戶組的意思。
1 <property> 2 <name>hadoop.proxyuser.sqoop2.hosts</name> 3 <value>*</value> 4 </property> 5 <property> 6 <name>hadoop.proxyuser.sqoop2.groups</name> 7 <value>*</value> 8 </property>
解決方案:
將sqoop2改成root便可,改完後以下:(PS:這裏的解決方案感受仍是有問題不完美,沒有深刻了解)
1 <property> 2 <name>hadoop.proxyuser.root.hosts</name> 3 <value>*</value> 4 </property> 5 <property> 6 <name>hadoop.proxyuser.root.groups</name> 7 <value>*</value> 8 </property>
輸入輸出目錄有問題,檢查HDFS中是否存在相應目錄便可
錯誤緣由:
啓動job的時候報的錯,這應該是datanode節點數據的問題
解決方案:
參考至:
http://blog.sina.com.cn/s/blog_61d8d9640102whof.html
最後我使用了1解決方案後問題解決了,可是不知道之後會不會有其餘問題。
問題緣由:
報錯信息提示,在訪問端口 100020的時候出錯,這表示DataNode 須要訪問 MapReduce JobHistory Server,而默認值是: 0.0.0.0:10020 。
解決方案:
找到{HADOOP_HOME}/etc/hadoop/mapred-site.xml配置文件 ,增長以下配置:
1 <property> 2 <name>mapreduce.jobhistory.address</name> 3 <!-- 配置實際的主機名和端口--> 4 <value>{namenode}:10020</value> 5 </property>
這裏個人主機名是hadoop1,因此配置的值是hadoop1:10020
而後啓動JobHistory服務便可:
命令:mr-jobhistory-daemon.sh start historyserver
{hadoop_home}/sbin/mr-jobhistory-daemon.sh start historyserver
參考至:
http://blog.csdn.net/lazythinker/article/details/52064165
錯誤緣由:
輸入或者輸出目錄不是空目錄,本示例的錯誤緣由是以前啓動job後,在HDFS裏已經導入過一些數據進去。沒刪除,因此報這個錯。
解決方案:
刪除該目錄下的內容便可
清空上方建立job時指定的output目錄(/root/test)中內容便可。
查看HDFS中的/root/test/目錄中的數據,共出現了2個文件
查看文件內容 能夠看到2ea38d69-e9e4-4364-adfc-67d88f5c8153.txt文件中已經存在了導入的數據,而8962bce1-08e7-4ebc-939e-4839d05eb145.txt是個空文件。