❶ 如何把redis的數據實時的同步到hdfs或者hbase上
1 HBase本身提供的介面
其調用形式為:
1)導入
./hbase org.apache.hadoop.hbase.maprece.Driver import 表名 數據文件位置
其中數據文件位置可為本地文件目錄,也可以分布式文件系統hdfs的路徑。
當其為前者時,直接指定即可,也可以加前綴file:///
而當其偉後者時,必須明確指明hdfs的路徑,例如hdfs://mymaster:9000/path
❷ 怎麼使用java代碼直接將從外部拿到的數據存入hdfs
存入HDFS有好幾種數據格式,我這里給你列出一種格式的存儲,sequence的
publicclassSeqWrite{
privatestaticfinalString[]data={"a,b,c,d,e,f,g","h,i,j,k,l,m,n","o,p,q,r,s,t","u,v,w,x,y,z","0,1,2,3,4","5,6,7,8,9"};
publicstaticvoidmain(String[]args)throwsIOException,Exception{
Configurationconfiguration=newConfiguration();
//這里是你主機的地址
configuration.set("fs.defaultFS","192.168.51.140");
//這個是存儲的路徑
Pathpath=newPath("/tmp/test1.seq");
Optionoption=SequenceFile.Writer.file(path);
OptionoptKey=SequenceFile.Writer.keyClass(IntWritable.class);
OptionoptValue=SequenceFile.Writer.valueClass(Text.class);
SequenceFile.Writerwriter=null;
IntWritablekey=newIntWritable(10);
Textvalue=newText();
writer=SequenceFile.createWriter(configuration,option,optKey,optValue);
for(inti=0;i<data.length;i++){
key.set(i);
value.set(data[i]);
writer.append(key,value);
writer.hsync();
Thread.sleep(10000L);
}
IOUtils.closeStream(writer);
}
}
❸ 怎麼把一個二維數組寫入到HDFS中
如下面這個shell腳本:
#Oracle的連接字元串,其中包含了Oracle的地址,SID,和埠號
CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2
#使用的用戶名
ORACLENAME=kkaa
#使用的密碼
ORACLEPASSWORD=kkaa123
#需要從Oracle中導入的表名
oralceTableName=tt
#需要從Oracle中導入的表中的欄位名
columns=AREA_ID,TEAM_NAME
#將Oracle中的數據導入到HDFS後的存放路徑
hdfsPath=apps/as/hive/$oralceTableName
#執行導入邏輯。將Oracle中的數據導入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'
執行這個腳本之後,導入程序就完成了。
❹ 如何把日誌數據導入到hdfs中
先使用工具將日誌收集起來,然後通過文件上傳命令將日誌文件上傳到hdfs即可。
❺ 關於將爬蟲爬取的數據存入hdfs
先放入linux文件裡面,然後使用hdfs命令將本地文件傳輸到hdfs即可
❻ 雲外面的數據怎麼上傳到hdfs
hadoop計算需要在hdfs文件系統上進行,文件上傳到hdfs上通常有三種方法:a hadoop自帶的dfs服務,put;b hadoop的API,Writer對象可以實現這一功能;c 調用OTL可執行程序,數據從資料庫直接進入hadoop
hadoop計算需要在hdfs文件系統上進行,因此每次計算之前必須把需要用到的文件(我們稱為原始文件)都上傳到hdfs上。文件上傳到hdfs上通常有三種方法:
a hadoop自帶的dfs服務,put;
b hadoop的API,Writer對象可以實現這一功能;
c 調用OTL可執行程序,數據從資料庫直接進入hadoop
由於存在ETL層,因此第三種方案不予考慮
將a、b方案進行對比,如下:
1 空間:方案a在hdfs上佔用空間同本地,因此假設只上傳日誌文件,則保存一個月日誌文件將消耗掉約10T空間,如果加上這期間的各種維表、事實表,將佔用大約25T空間
方案b經測試,壓縮比大約為3~4:1,因此假設hdfs空間為100T,原來只能保存約4個月的數據,現在可以保存約1年
2 上傳時間:方案a的上傳時間經測試,200G數據上傳約1小時
方案b的上傳時間,程序不做任何優化,大約是以上的4~6倍,但存在一定程度提升速度的餘地
3 運算時間:經過對200G數據,大約4億條記錄的測試,如果程序以IO操作為主,則壓縮數據的計算可以提高大約50%的速度,但如果程序以內存操作為主,則只能提高5%~10%的速度
4 其它:未壓縮的數據還有一個好處是可以直接在hdfs上查看原始數據。壓縮數據想看原始數據只能用程序把它導到本地,或者利用本地備份數據
壓縮格式:按照hadoop api的介紹,壓縮格式分兩種:BLOCK和RECORD,其中RECORD是只對value進行壓縮,一般採用BLOCK進行壓縮。
對壓縮文件進行計算,需要用SequenceFileInputFormat類來讀入壓縮文件,以下是計算程序的典型配置代碼:
JobConf conf = new JobConf(getConf(), log.class);
conf.setJobName(」log」);
conf.setOutputKeyClass(Text.class);//set the map output key type
conf.setOutputValueClass(Text.class);//set the map output value type
conf.setMapperClass(MapClass.class);
//conf.setCombinerClass(Rece.class);//set the combiner class ,if havenot, use Recuce class for default
conf.setRecerClass(Rece.class);
conf.setInputFormat(SequenceFileInputFormat.class);//necessary if use compress
接下來的處理與非壓縮格式的處理一樣
❼ hadoop 中一個大文件 在hdfs中是如何存儲的
文件是按照塊來存儲的,比如配置的每塊大小為64M,那麼5G的文件,會分成5*1024/64=80塊,每個塊會在不同節點上存多份。你上面說的依次寫入datanode,是指將每個塊依次寫入。
讀取的時候,也是一塊一塊來讀的,當然,這些都已經被HDFS的客戶端封裝好了,你看到就是在讀一個文件。
❽ 怎樣將資料庫數據寫入到hdfs中
如下面這個shell腳本:
#Oracle的連接字元串,其中包含了Oracle的地址,SID,和埠號
CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2
#使用的用戶名
ORACLENAME=kkaa
#使用的密碼
ORACLEPASSWORD=kkaa123
#需要從Oracle中導入的表名
oralceTableName=tt
#需要從Oracle中導入的表中的欄位名
columns=AREA_ID,TEAM_NAME
#將Oracle中的數據導入到HDFS後的存放路徑
hdfsPath=apps/as/hive/$oralceTableName
#執行導入邏輯。將Oracle中的數據導入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'
執行這個腳本之後,導入程序就完成了。
❾ 如何把數據從sql server中導入hdfs製作報表
利用SQOOP將數據從資料庫導入到HDFS
基本使用
如下面這個shell腳本:
#Oracle的連接字元串,其中包含了Oracle的地址,SID,和埠號
CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2
#使用的用戶名
ORACLENAME=kkaa
#使用的密碼
ORACLEPASSWORD=kkaa123
#需要從Oracle中導入的表名
oralceTableName=tt
#需要從Oracle中導入的表中的欄位名
columns=AREA_ID,TEAM_NAME
#將Oracle中的數據導入到HDFS後的存放路徑
hdfsPath=apps/as/hive/$oralceTableName
#執行導入邏輯。將Oracle中的數據導入到HDFS中
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --num-mappers 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001'
執行這個腳本之後,導入程序就完成了。
接下來,用戶可以自己創建外部表,將外部表的路徑和HDFS中存放Oracle數據的路徑對應上即可。
注意:這個程序導入到HDFS中的數據是文本格式,所以在創建Hive外部表的時候,不需要指定文件的格式為RCFile,而使用默認的TextFile即可。數據間的分隔符為'\001'。如果多次導入同一個表中的數據,數據以append的形式插入到HDFS目錄中。
並行導入
假設有這樣這個sqoop命令,需要將Oracle中的數據導入到HDFS中:
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"
請注意,在這個命令中,有一個參數「-m」,代表的含義是使用多少個並行,這個參數的值是1,說明沒有開啟並行功能。
現在,我們可以將「-m」參數的值調大,使用並行導入的功能,如下面這個命令:
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 4 --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"
一般來說,Sqoop就會開啟4個進程,同時進行數據的導入操作。
但是,如果從Oracle中導入的表沒有主鍵,那麼會出現如下的錯誤提示:
ERROR tool.ImportTool: Error ring import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'.
在這種情況下,為了更好的使用Sqoop的並行導入功能,我們就需要從原理上理解Sqoop並行導入的實現機制。
如果需要並行導入的Oracle表的主鍵是id,並行的數量是4,那麼Sqoop首先會執行如下一個查詢:
select max(id) as max, select min(id) as min from table [where 如果指定了where子句];
通過這個查詢,獲取到需要拆分欄位(id)的最大值和最小值,假設分別是1和1000。
然後,Sqoop會根據需要並行導入的數量,進行拆分查詢,比如上面的這個例子,並行導入將拆分為如下4條SQL同時執行:
select * from table where 0 <= id < 250;
select * from table where 250 <= id < 500;
select * from table where 500 <= id < 750;
select * from table where 750 <= id < 1000;
注意,這個拆分的欄位需要是整數。
從上面的例子可以看出,如果需要導入的表沒有主鍵,我們應該如何手動選取一個合適的拆分欄位,以及選擇合適的並行數。
再舉一個實際的例子來說明:
我們要從Oracle中導入creater_user.popt_cas_redirect_his。
這個表沒有主鍵,所以我們需要手動選取一個合適的拆分欄位。
首先看看這個表都有哪些欄位:
然後,我假設ds_name欄位是一個可以選取的拆分欄位,然後執行下面的sql去驗證我的想法:
select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'
發現結果不理想,min和max的值都是相等的。所以這個欄位不合適作為拆分欄位。
再測試一下另一個欄位:CLIENTIP
select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'
這個結果還是不錯的。所以我們使用CLIENTIP欄位作為拆分欄位。
所以,我們使用如下命令並行導入:
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 12 --split-by CLIENTIP --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26'"
這次執行這個命令,可以看到,消耗的時間為:20mins, 35sec,導入了33,222,896條數據。
另外,如果覺得這種拆分不能很好滿足我們的需求,可以同時執行多個Sqoop命令,然後在where的參數後面指定拆分的規則。如:
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26' logtime<10:00:00"
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26' logtime>=10:00:00"
從而達到並行導入的目的。
❿ 怎樣把oracle數據存儲到hadoop
大講台hadoop 在線學習為你解答:通過使用MapRece的方式,使Hadoop可以直接訪問Oracle,並將相關的數據寫入到HDFS文件當中。 從而可以順利地將Oracle中的數據遷移到Hadoop文件系統中。