當前位置:首頁 » 服務存儲 » 怎麼把數據存儲到hdfs
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎麼把數據存儲到hdfs

發布時間: 2022-07-24 14:35:41

❶ 如何把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文件系統中。