Sqoop 1取付及び使用


Sqoop 1を選んだのは、Sqoop 2の現在の問題が多すぎるからです.正常に使用できません.総合的に比較してSqoop 1を選択します.Sqoop 1インストール構成は比較的簡単1特定ディレクトリに解凍2コピーMySQLのjdbcドライブパッケージmysql-connector-Java-5.1.31-binをダウンロードする.JArはsqoop/libディレクトリの下にあります.3vi ~/.bash_profile
export SQOOP_HOME=/home/hadoop/chadoop/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export PATH=$PATH:$SQOOP_HOME/bin

コピーsqoop/conf/sqoop-env-template.shはsqoop-envである.sh関連構成の追加
#Setpath to where bin/Hadoop is available
exportHADOOP_COMMON_HOME=/opt/cdh5/hadoop
#Setpath to where hadoop-*-core.jar isavailable
exportHADOOP_MAPRED_HOME=/opt/cdh5/hadoop
#setthe path to where bin/Hbase isavailable
exportHBASE_HOME=/opt/cdh5/hbase 
#Setthe path to where bin/Hive is available
exportHIVE_HOME= /opt/cdh5/hive
#Setthe path for where zookeper config diris
exportZOOCFGDIR= /opt/cdh5/zookeeper

(5)、テストSqoop警告修正$SQOOP_を発見HOME/bin/configure-sqoopコメントHCatalog,Accumuloチェック(HCatalog,AccumuloなどのHADOOP上のコンポーネントを使用する準備ができていない限り)
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
# echo "Warning: $HCAT_HOME does not exist! HCatalog jobs willfail."
# echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi
#if [ ! -d "${ACCUMULO_HOME}" ];then
# echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports willfail."
# echo 'Please set $ACCUMULO_HOME to the root of your Accumuloinstallation.'
#fi 

sqoop versionを再実行すると、コマンドの使用説明を表示することもできます.
$ sqoopimport --help
$ sqoophelp import

sqoop importの一例は以下の通りです.
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS

-options-fileを使用してファイルを転送することもできます.この方法では、いくつかの構成パラメータを再利用できます.
$ sqoop --options-file /users/homer/work/import.txt --table TEST

/users/homer/work/import.txtファイルの内容は以下の通りです.
import
--connect
jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password 
redhat

二、Sqoop使用説明1、テスト接続:(1)mysqlデータベースリストsqoop list-databases-connect jdbcを表示する:mysql://hadoop003:3306/-username root–P(2)データベース内のすべてのテーブルを表示する:sqoop list-tables-connectjdbc:mysql://hadoop003:3306/EDW-username root-P 2、MysqlとHDFSの相互接続(1)mysqlをhdfsにインポートmysqlの表fin_cashier_orderはhdfsにインポートし、インポートする前にfin_をクエリーします.cashier_orderテーブルのデータ合計:199
sqoop import --connectjdbc:mysql://hadoop003:3306/ssa --username root --password *****  --table fin_cashier_order --target-dir/user/hadoop/databases/ssa/fin_cashier_order -m 4

-mはMapの同時実行数を表します.-target-dirのデフォルトはhdfsのuser/username/tablenameパスです.繰り返し実行すると、ディレクトリがすでに存在することを示すメッセージが表示されます.mapreduceの実行が完了した後、HDFSでhdfsにインポートされたデータを確認します.
hadoop fs -ls /user/hadoop/databases/ssa/fin_cashier_order
hadoop fs -cat /user/hadoop/databases/ssa/fin_cashier_order/part-m-00000

(2)HDFSをmysqlにインポートHDFSのデータをMysqlテーブルにインポートし、mysqlでは空のテーブルfin_を事前に確立する必要があるcashier_order 2、このテーブルが空です
sqoop export --connectjdbc:mysql://hadoop003:3306/ssa --table fin_cashier_order2 --username root--password ****** --export-dirhdfs://jrtestcluster/user/hadoop/databases/ssa/fin_cashier_order/

運転完了表示16/02/25 16:23:39 INFOmapreduce.ExportJobBase: Transferred 70.4619 KB in 48.3235 seconds (1.4581KB/sec) 16/02/25 16:23:39 INFO mapreduce.ExportJobBase:Exported 199 records. エクスポート199件のレコードが表示されます.テーブルfin_へcashier_order 2は、ちょうど199本を表示します.これで、mysqlとHDFSの相互接続をSqoopで検証し、他のパラメータを指定することもできます.パラメータの説明–appendはhdfsにすでに存在するdatasetにデータを追加します.このパラメータを使用すると、sqoopはデータを一時ディレクトリにインポートし、ファイルに正式なディレクトリに名前を変更して、ディレクトリにすでに存在するファイルと重複しないようにします.–as-avrodatafile Avroデータファイルにデータをインポート-as-sequencefile sequenceファイルにデータをインポート-as-textfile通常のテキストファイルにデータをインポートし、そのテキストファイルを生成した後、hiveでsql文で結果をクエリーできます.-boundary-query境界クエリー、つまりインポート前にSQLクエリーで結果セットを取得し、インポートしたデータがその結果セット内のデータです.フォーマットは、-boundary-query'select id,no from t where id=3で、インポートしたデータがid=3のレコードであるか、select min()、max()fromであることを示します.クエリーのフィールドにデータ型が文字列のフィールドがないことに注意してください.そうしないと、エラーが発生します.
–columns
--split-by <column>     ,        ,       ID
--table <table-name>    
--delete-target-dir       
--target-dir <dir>    hdfs  
--warehouse-dir <dir>     --target-dir       ,           ,   hdfs  ,     hive  
--where                 ,  :--where "id = 2"
-z,--compress       ,             ,         gzip           ,   SequenceFile, text    ,  Avro  
--compression-codec Hadoop    ,   gzip
--null-string <null-string>     ,      ,    null    
--null-non-string <null-string>     ,      ,    null    

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --columns "tbl_id,create_time" --where "tbl_id > 1" --target-dir /user/hive/result
   sql   
 sql  $CONDITIONS
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where \$CONDITIONS ' --split-by tbl_id -m 4 --target-dir /user/hive/result
       -m 1       map 
   direct 
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --delete-target-dir --direct --default-character-set UTF-8 --target-dir /user/hive/result

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by"\t" --lines-terminated-by "
"
--delete-target-dir --target-dir /user/hive/result hdfs ( ): $ hadoop fs -ls result Found 5 items -rw-r--r-- 3 root hadoop 0 2014-08-04 16:07 result/_SUCCESS -rw-r--r-- 3 root hadoop 69 2014-08-04 16:07 result/part-m-00000 -rw-r--r-- 3 root hadoop 0 2014-08-04 16:07 result/part-m-00001 -rw-r--r-- 3 root hadoop 142 2014-08-04 16:07 result/part-m-00002 -rw-r--r-- 3 root hadoop 62 2014-08-04 16:07 result/part-m-00003 $ hadoop fs -cat result/part-m-00000 34 1406784308 8 0 root 0 45 test1 EXTERNAL_TABLE null null null $ hadoop fs -cat result/part-m-00002 40 1406797005 9 0 root 0 52 test2 EXTERNAL_TABLE null null null 42 1407122307 7 0 root 0 59 test3 EXTERNAL_TABLE null null null $ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "
"
--delete-target-dir --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/result $ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "
"
--delete-target-dir --null-string '\\N' --null-non-string '\\N' --compression-codec "com.hadoop.compression.lzo.LzopCodec" --target-dir /user/hive/result : 。 --enclosed-by <char> , , :--enclosed-by '\"', :"3","jimsss","dd@dd.com" --escaped-by <char> , " ", --escaped-by "\\" , hdfs :\" \", --fields-terminated-by <char> , , , ., :--fields-terminated-by --lines-terminated-by <char> , , , :--lines-terminated-by "#" # --mysql-delimiters Mysql , ,
, \, ' 。
--optionally-enclosed-by <char> enclosed-by , --optionally-enclosed-by ,
3、MysqlとHiveの相互作用は以下のエラーが発生した:エラー1:ERROR tool.ImportTool: EncounteredIOException running import job: java.io.IOException: DataStreamer Exception: atorg.apache.hadoop.hdfs.DFSOutputStream DataStreamer.run(DFSOutputStream.java:796)Causedby:java.lang.OutOfMemoryError:unabletocreatenewnativethreadatjava.lang.Thread.start0(NativeMethod)atjava.lang.Thread.start(Thread.java:714)atorg.apache.hadoop.hdfs.DFSOutputStream DataStreamer.initDataStreaming(DFSOutputStream.java:581) at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSoutputStream.java:669)解決方法:
net.ipv4.ip_local_port_range = 1024 65000
      
echo "100000" > /proc/sys/kernel/threads-max
echo "100000" > /proc/sys/kernel/pid_max (  32768)
echo "200000" > /proc/sys/vm/max_map_count (  65530)
  /etc/security/limits.conf
* - nproc 999999
* -nofile 999999
PS:nprocはシステムのmax user processesサイズを修正します;nofileはopen filesのサイズを変更し、Linux 2.6.25カーネルの前にマクロ定義があり、この値の最大値は1024*1024で、ちょうど100万ですが、2.6.25カーネルとその後、この値は/proc/sys/fs/nr_Openで設定しますが、99999999で十分です.多くの人が出会うかもしれませんが、32000以上のスレッドを起動するだけでは、より多くのスレッドを開始することはできません.実はpid_です.max=32768はmap数の増加を制限し、sqoop-mオプションでより多くのmapを指定します.より多くのmapにより、各サブプロセスが占有するheap spaceを低減し、hadoop設定を超えるJava heap spaceサイズ
sqoop ... -m 
エラー2:Caused by:javaを回避する.lang.RuntimeException:java.sql.SQLException: Access denied for user ‘root’@’hadoop003’ (usingpassword: YES) atorg.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:220) atorg.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:165)...9 moreプログラムが正常に動作し、結果も正しい.データベース接続が正しいことを説明し、mysql単独で接続することもできます.この異常な間違いを報告します.クエリーデータベースにユーザ情報JDBC接続されているマシン名はhadoop 003で、root全マシンにリモートアクセス権限("%)が付与されていますが、hadoop 003というアカウントにはマシンのリモートアクセス権限が開設されていない可能性があります.そこでhadoop 003という機械にリモート権限を開設した.
GRANT ALL PRIVILEGES ON *.* TO'root'@'hadoop003' IDENTIFIED BY '********' WITH GRANT OPTION;
インポートコマンドを再度実行します.成功しました.上記のエラーは発生しません.エラー3:mysqlからHiveにインポートすると、
ERROR hive.HiveConfig: Could not loadorg.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
16/02/26 14:43:47 ERROR tool.ImportTool:Encountered IOException running import job: java.io.IOException:java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
       HDFS。 HDFS   Hive    。  HIVE_CONF_DIR    。
   HIVE_CONF_DIR   sqoop-env.sh、hadoop-env.sh、hive-env.sh     。
         :
 /etc/profile          
exportHADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
Sqoop-1.4.7バージョンでこの問題が解決したようです.このバージョンを楽しみにしています