您好,登錄后才能下訂單哦!
這篇文章主要介紹“Hadoop和Couchbase怎么結合使用”,在日常操作中,相信很多人在Hadoop和Couchbase怎么結合使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hadoop和Couchbase怎么結合使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Hadoop 和數(shù)據(jù)處理
Hadoop 將許多重要特性結合在一起,這使 Hadoop 對于將大量數(shù)據(jù)分解為更小、實用的數(shù)據(jù)塊非常有用。
Hadoop 的主要組件是 HDFS 文件系統(tǒng),它支持將信息分布到整個集群中。對于使用這種分布格式存儲的信息,可以通過一個名為 MapReduce 的系統(tǒng)在每個集群節(jié)點上進行單獨處理。MapReduce 進程將存儲在 HDFS 文件系統(tǒng)中的信息轉(zhuǎn)換為更小的、經(jīng)過處理的、更容易管理的數(shù)據(jù)塊。
因為 Hadoop 可在多個節(jié)點上運行,所以可以使用它來處理大量輸入數(shù)據(jù),并將這些數(shù)據(jù)簡化為更實用的信息塊。此過程可使用一個簡單的 MapReduce 系統(tǒng)來處理。
MapReduce 轉(zhuǎn)換傳入信息(不一定為結構化格式),將該信息轉(zhuǎn)換為一種可更輕松地使用、查詢和處理的結構。
例如,一種典型的用途是處理來自數(shù)百個不同應用程序的日志信息,以便可以識別特定的問題、計數(shù)或其他事件。通過使用 MapReduce 格式,您可以開始度量并查找趨勢,將平常非常多的信息轉(zhuǎn)換為更小的數(shù)據(jù)塊。舉例而言,在查看某個 Web 服務器的日志時,您可能希望查看特定頁面上的特定范圍中發(fā)生的錯誤。您可以編寫一個 MapReduce 函數(shù)來識別特定頁面上的特定錯誤,并在輸出中生成該信息。使用此方法,您可從日志文件中精減多行信息,得到一個僅包含錯誤信息的小得多的記錄集合。
理解 MapReduce
MapReduce 的工作方式分兩個階段。映射 (map) 過程獲取傳入信息,并將這些信息映射到某種標準化的格式。對于某些信息類型,此映射可以是直接和顯式的。例如,如果要處理 Web 日志等輸入數(shù)據(jù),那么僅從 Web 日志的文本中提取一列數(shù)據(jù)即可。對于其他數(shù)據(jù),映射可能更復雜。在處理文本信息時,比如研究論文,您可能需要提取短語或更復雜的數(shù)據(jù)塊。
精減 (reduce) 階段用于收集和匯總數(shù)據(jù)。精減實際上能夠以多種不同方式發(fā)生,但典型的過程是處理一個基本計數(shù)、總和或其他基于來自映射階段的個別數(shù)據(jù)的統(tǒng)計數(shù)據(jù)。
想象一個簡單的示例,比如 Hadoop 中用作示例 MapReduce 的字數(shù),映射階段將對原始文本進行分解,以識別各個單詞,并為每個單詞生成一個輸出數(shù)據(jù)塊。reduce 函數(shù)獲取這些映射的信息塊,對它們進行精減,以便在所看到的每個惟一單詞上進行遞增。給定一個包含 100 個單詞的文本文件,映射過程將生成 100 個數(shù)據(jù)塊,但精減階段可對此進行匯總,提供惟一單詞的數(shù)量(比如 56 個)和每個單詞出現(xiàn)的次數(shù)。
借助 Web 日志,映射將獲取輸入數(shù)據(jù),為日志文件中的每個錯誤創(chuàng)建一條記錄,然后為每個錯誤生成一個數(shù)據(jù)塊,其中包含日期、時間和導致該問題的頁面。
在 Hadoop 內(nèi),MapReduce 階段會出現(xiàn)在存儲各個源信息塊的各個節(jié)點上。這使 Hadoop 能夠處理以下大型信息集:通過允許多個節(jié)點同時處理數(shù)據(jù)。例如,對于 100 個節(jié)點,可以同時處理 100 個日志文件,比通過單個節(jié)點快得多地簡化許多 GB(或 TB)的信息。
Hadoop 信息
核心 Hadoop 產(chǎn)品的一個主要限制是,無法在數(shù)據(jù)庫中存儲和查詢信息。數(shù)據(jù)添加到 HDFS 系統(tǒng)中,但您無法要求 Hadoop 返回與某個特定數(shù)據(jù)集匹配的所有數(shù)據(jù)的列表。主要原因是 Hadoop 不會存儲、結構化或理解存儲在 HDFS 中的數(shù)據(jù)的結構。這正是 MapReduce 系統(tǒng)需要將信息分析并處理為更加結構化的格式的原因。
但是,我們可以將 Hadoop 的處理能力與更加傳統(tǒng)的數(shù)據(jù)庫相結合,使我們可以查詢 Hadoop 通過自己的 MapReduce 系統(tǒng)生成的數(shù)據(jù)??赡艿慕鉀Q方案有許多,其中包括一些傳統(tǒng) SQL 數(shù)據(jù)庫,但我們可以通過使用 Couchbase Server 來保持 MapReduce 風格(它對大型數(shù)據(jù)集非常有效)。
系統(tǒng)之間的數(shù)據(jù)共享的基本結構如 圖 1 所示。
圖 1. 系統(tǒng)之間的數(shù)據(jù)共享的基本結構
安裝 Hadoop
如果您尚未安裝 Hadoop,最簡單的方法是使用一個 Cloudera 安裝。為了保持 Hadoop、Sqoop 和 Couchbase 之間的兼容性,***的解決方案是使用 CDH3 安裝(參閱參考資料)。為此,您需要使用 Ubuntu 10.10 到 11.10 版。更高的 Ubuntu 版本會引入不兼容問題,因為它們不再支持 Cloudera Hadoop 安裝所需的一個包。
在安裝之前,請確保已經(jīng)安裝了一個 Java™ 虛擬機,確保在 JAVA_HOME 變量中為 JDK 配置了正確的主目錄。請注意,您必須擁有完整的 Java 開發(fā)工具包,而不只是擁有 Java 運行時環(huán)境 (JRE),因為 Sqoop 將代碼編譯為 Couchbase Server 與 Hadoop 之間的導出和導入數(shù)據(jù)。
要在 Ubuntu 和類似的系統(tǒng)上使用 CDH3 安裝,您需要執(zhí)行以下步驟:
1、下載 CDH3 配置包。這會將 CDH3 源文件的配置添加到 apt 存儲庫中。
2、更新您的存儲庫緩存:$ apt-get update。
3、。安裝主要 Hadoop 包:$ apt-get install hadoop-0.20。
4、安裝 Hadoop 組件(參見 清單 1)
清單 1. 安裝 Hadoop 組件
$ for comp in namenode datanode secondarynamenode jobtracker tasktracker do apt-get install hadoop-0.20-$comp done
5、編輯配置文件,以確保您設置了核心組件。
6、編輯 /etc/hadoop/conf/core-site.xml,使其如 清單 2 所示。
清單 2. 編輯后的 /etc/hadoop/conf/core-site.xml 文件
<configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration>
這將配置存儲數(shù)據(jù)的默認 hdfs 位置。
編輯 /etc/hadoop/conf/hdfs-site.xml(參見 清單 3)。
清單 3. 編輯后的 /etc/hadoop/conf/hdfs-site.xml 文件
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
這支持復制存儲的數(shù)據(jù)。
編輯 /etc/hadoop/conf/mapred-site.xml(參見 清單 4)。
清單 4. 編輯后的 /etc/hadoop/conf/mapred-site.xml 文件
<configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration>
這實現(xiàn)了 MapReduce 的作業(yè)跟蹤器。
7、***,編輯 Hadoop 環(huán)境,使其正確地指向 /usr/lib/hadoop/conf/hadoop-env.sh 中您的 JDK 安裝目錄。其中會有一個注釋掉的 JAVA_HOME 變量行。您應該取消注釋它,并將它設置為您的 JDK 位置。例如:export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk。
8、現(xiàn)在,在您的系統(tǒng)上啟動 Hadoop。最簡單的方法是使用 start-all.sh 腳本:$ /usr/lib/hadoop/bin/start-all.sh。
假設所有設置均已正確配置,您現(xiàn)在應有一個正在運行的 Hadoop 系統(tǒng)。
Couchbase Server 概述
Couchbase Server 是一個集群化的、基于文檔的數(shù)據(jù)庫系統(tǒng),它使用一個緩存層來提供非??斓臄?shù)據(jù)訪問,將大部分數(shù)據(jù)都存儲在 RAM 中。該系統(tǒng)使用多個節(jié)點和一個自動分散在整個集群上的緩存層。這實現(xiàn)了一種彈性,您可擴大和緊縮集群,以便利用更多 RAM 或磁盤 I/O 來幫助提升性能。
Couchbase Server 中的所有數(shù)據(jù)最終會持久存儲在磁盤中,但最初會通過緩存層執(zhí)行寫入和更新操作,這正是提供高性能的源泉,是我們通過處理 Hadoop 數(shù)據(jù)來獲得實時信息和查詢內(nèi)容時可利用的優(yōu)勢。
Couchbase Server 的基本形式是一個基本文檔和基于鍵/值的存儲。只有在您知道文檔 ID 時,才能檢索集群提供的信息。在 Couchbase Server 2.0 中,您可以將文檔存儲為 JSON 格式,然后使用視圖系統(tǒng)在存儲的 JSON 文檔上創(chuàng)建一個視圖。視圖是在存儲在數(shù)據(jù)庫中的文檔上執(zhí)行的一個 MapReduce 組合。來自視圖的輸出是一個索引,它通過 MapReduce 函數(shù)來匹配您定義的結構。索引的存在為您提供了查詢底層的文檔數(shù)據(jù)的能力。
我們可以使用此功能從 Hadoop 獲取已處理的信息,將該信息存儲在 Couchbase Server 中,然后使用它作為查詢該數(shù)據(jù)的基礎。Couchbase Server 可以方便地使用一個 MapReduce 系統(tǒng)來處理文檔和創(chuàng)建索引。這在用于處理數(shù)據(jù)的方法之間提供了一定的兼容性和一致性水平。
安裝 Couchbase Server
安裝 Couchbase Server 很容易。從 Couchbase 網(wǎng)站下載適合您平臺的 Couchbase Server 2.0 版本(參見 參考資料),使用 dpkg 或 RPM(具體依賴于您的平臺)安裝該包。
安裝之后,Couchbase Server 會自動啟動。要配置它,請打開一個 Web 瀏覽器,并將它指向您的機器的 localhost:8091(或使用該機器的 IP 地址遠程訪問它)。
按照屏幕上的配置說明進行操作。您可使用在安裝期間提供的大部分默認設置,但最重要的設置是寫入數(shù)據(jù)庫中的數(shù)據(jù)的數(shù)據(jù)文件的位置,以及您分配給 Couchbase Server 的 RAM 量。
使 Couchbase Server 能夠與 Hadoop 連接器通信
Couchbase Server 使用 Sqoop 連接器與您的 Hadoop 集群通信。Sqoop 提供了一個連接在 Hadoop 與 Couchbase Server 之間批量傳輸數(shù)據(jù)。
從技術上講,Sqoop 是一個設計用于在結構化數(shù)據(jù)庫與 Hadoop 之間轉(zhuǎn)換信息的應用程序。Sqoop 這個名稱實際上來源于 SQL 和 Hadoop。
安裝 Sqoop
如果使用 CDH3 安裝,您可使用報管理器來安裝 Sqoop:$ sudo apt-get install sqoop。
這將把 Sqoop 安裝在 /usr/lib/sqoop 中。
注意:Sqoop 中一個***的 bug 表明它有時會嘗試傳輸uowu的數(shù)據(jù)集。修補程序包含在 Sqoop 1.4.2 版中。如果遇到問題,請嘗試使用 V1.4.2 或更高的版本。
安裝 Couchbase Hadoop Connector
Couchbase Hadoop Connector 是一個支持 Sqoop 與 Couchbase 之間的連接的 Java jar 文件集合。從 Couchbase 網(wǎng)站下載 Hadoop 連接器(參閱 參考資料)。該文件封裝為一個 zip 文件。解壓它,然后運行其中的 install.sh 腳本,提供 Sqoop 系統(tǒng)的位置。例如:$ sudo bash install.sh /usr/lib/sqoop。
這將安裝所有必要的庫和配置文件?,F(xiàn)在我們可以開始在兩個系統(tǒng)之間交換信息了。
將數(shù)據(jù)從 Couchbase Server 導入 Hadoop
盡管該場景不是我們這里將直接處理的場景,但需要注意我們可從 Couchbase Server 將數(shù)據(jù)導入 Hadoop。如果您在 Couchbase Server 中加載了大量數(shù)據(jù),并希望利用 Hadoop 來處理和簡化它,這可能很有用。為此,您可以使用以下命令,從 Couchbase Server 將整個數(shù)據(jù)集加載到 HDFS 中的一個 Hadoop 文件中:$ sqoop import --connect http://192.168.0.71:8091/pools --table cbdata。
這里提供的 URL 是 Couchbase Server 桶池 (bucket pool) 的位置。這里指定的表實際上是 HDFS 中將存儲數(shù)據(jù)的目錄的名稱。
數(shù)據(jù)本身被存儲為來自 Couchbase Server 的信息的一種鍵/值轉(zhuǎn)儲形式。在 Couchbase Server 2.0 中,這意味著數(shù)據(jù)是使用惟一文檔 ID 寫出的,包含記錄的 JSON 值。
將 JSON 數(shù)據(jù)寫入 Hadoop MapReduce
要在 Hadoop 與 Couchbase Server 之間交換信息,需要使用一種通用語言來表達這些信息,在本例中使用的是 JSON(參見 清單 5)。
清單 5. 在 Hadoop MapReduce 中輸出 JSON
package org.mcslp; import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; import com.google.gson.*; public class WordCount { public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); output.collect(word, one); } } } public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, Text> { class wordRecord { private String word; private int count; wordRecord() { } } public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } wordRecord word = new wordRecord(); word.word = key.toString();; word.count = sum; Gson json = new Gson(); System.out.println(json.toJson(word)); output.collect(key, new Text(json.toJson(word))); } } public static void main(String[] args) throws Exception { JobConf conf = new JobConf(WordCount.class); conf.setJobName("wordcount"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(Map.class); conf.setReducerClass(Reduce.class); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class); FileInputFormat.setInputPaths(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); JobClient.runJob(conf); } }
該代碼是 Hadoop 發(fā)行版所提供的字數(shù)示例的修改版。
此版本使用 Google Gson 庫從處理過程的精減階段寫入 JSON 信息。為了方便起見,我們使用了一個新類 (wordRecord),它由 Gson 轉(zhuǎn)換為一條 JSON 記錄,這種記錄是 Couchbase Server 逐個文檔地處理和解析內(nèi)容所需的格式。
請注意,我們沒有為 Hadoop 定義一個 Combiner 類。這將阻止 Hadoop 嘗試重新精減該信息,該操作在當前的代碼中會失敗,因為我們的精減階段僅接收該單詞和一位數(shù),并輸出一個 JSON 值。對于輔助的精減/組合階段,我們需要解析 JSON 輸入或定義一個新 Combiner 類,以便輸出信息的 JSON 版本。這稍微簡化了定義。
要在 Hadoop 中使用此代碼,首先需要將 Google Gson 庫復制到 Hadoop 目錄中 (/usr/lib/hadoop/lib)。然后重新啟動 Hadoop,以確保 Hadoop 已經(jīng)正確識別出該庫。
接下來,將您的代碼編譯到一個目錄中: $ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar:./google-gson-2.2.1/gson-2.2.1.jar -d wordcount_classes WordCount.java 。
現(xiàn)在為您的庫創(chuàng)建一個 jar 文件: $ jar -cvf wordcount.jar -C wordcount_classes/。
完成此過程后,您可以將一些文本文件復制到某個目錄中,然后使用此 jar 文件將這些文本文件處理為許多獨立的單詞,創(chuàng)建一條 JSON 記錄來包含每個單詞和計數(shù)。例如,要在一些 Project Gutenberg 文本上處理此數(shù)據(jù): $ hadoop jar wordcount.jar org.mcslp.WordCount /user/mc/gutenberg /user/mc/gutenberg-output。
這將在我們的目錄中生成已由 Hadoop 內(nèi)的 MapReduce 函數(shù)統(tǒng)計的單詞列表。
將數(shù)據(jù)從 Hadoop 導出到 Couchbase Server
要從 Hadoop 取回數(shù)據(jù)并導入 Couchbase Server 中,則需要使用 Sqoop 導出該數(shù)據(jù): $ sqoop export --connect http://10.2.1.55:8091/pools --table ignored --export-dir gutenberg-output。
此示例中忽略了 --table 參數(shù),但 --export-dir 是要導出的信息所在的目錄的名稱。
在 Couchbase Server 中編寫 MapReduce
在 Hadoop 中,MapReduce 函數(shù)是使用 Java 編寫的。在 Couchbase Server 中,MapReduce 函數(shù)是使用 Javascript 編寫的。作為一種已解釋的語言,這意味著您不需要編譯視圖,它會支持您編輯和細化 MapReduce 結構。
要在 Couchbase Server 中創(chuàng)建一個視圖,請打開管理控制臺(在 http://localhost:8091 上),然后單擊 View 按鈕。視圖收集在一個設計文檔中。您可以在單個設計文檔中創(chuàng)建多個視圖,也可以創(chuàng)建多個設計文檔。要提升服務器的總體性能,系統(tǒng)還支持一種可編輯的開發(fā)視圖以及一個無法編輯的生產(chǎn)視圖。生產(chǎn)視圖無法編輯是因為這么做會使視圖索引無效,并會導致需要重新構建索引。
單擊 Create Development View 按鈕并命名您的設計文檔和視圖。
在 Couchbase Server 內(nèi),有兩個相同的函數(shù):map 和 reduce。map 函數(shù)用于將輸入數(shù)據(jù)(JSON 文檔)映射到某個表。然后使用 reduce 函數(shù)匯總和精減該表。reduce 函數(shù)是可選的,不是索引功能所必需的,所以,出于本文的目的,我們將忽略 reduce 函數(shù)。
對于 map 函數(shù),函數(shù)的格式如 清單 6 所示。
清單 6. map 函數(shù)的格式
map(doc) { }
參數(shù) doc 是每個存儲的 JSON 文檔。Couchbase Server 的存儲格式是一種 JSON 文檔,視圖是使用 Javascript 語言編寫的,所以我們可使用以下語句訪問 JSON 中一個名為 count 的字段:doc.count。
要從 map 函數(shù)發(fā)出信息,可以調(diào)用 emit() 函數(shù)。emit() 函數(shù)接受兩個參數(shù),***個是鍵(用于選擇和查詢信息),第二個參數(shù)是相應的值。因此,我們可以創(chuàng)建一個 map 函數(shù)來使用來輸出單詞和計數(shù),如 清單 7 中的代碼所示。
清單 7. 輸出單詞和計數(shù)的 map 函數(shù)
function (doc) { if (doc.word) { emit(doc.word,doc.count); } }
這將為每個輸出文檔輸出一行數(shù)據(jù),其中包含文檔 ID(實際上是我們的單詞)、用作鍵的單詞和該單詞在源文本中出現(xiàn)的次數(shù)??稍?清單 8 中看到原始的 JSON 輸出。
清單 8. 原始的 JSON 輸出
{"total_rows":113,"rows":[ {"id":"acceptance","key":"acceptance","value":2}, {"id":"accompagner","key":"accompagner","value":1}, {"id":"achieve","key":"achieve","value":1}, {"id":"adulteration","key":"adulteration","value":1}, {"id":"arsenic","key":"arsenic","value":2}, {"id":"attainder","key":"attainder","value":1}, {"id":"beerpull","key":"beerpull","value":2}, {"id":"beware","key":"beware","value":5}, {"id":"breeze","key":"breeze","value":2}, {"id":"brighteyed","key":"brighteyed","value":1} ] }
在輸出中,id 是文檔 ID,key 是您在 emit 語句中指定的鍵,value 是在 emit 語句中指定的值。
獲取實時數(shù)據(jù)
現(xiàn)在我們已在 Hadoop 中處理了信息,請將它導入 Couchbase Server 中,然后在 Couchbase Server 中為該數(shù)據(jù)創(chuàng)建了一個視圖,我們可以開始查詢已處理和存儲的信息了。視圖可使用一個 REST 樣式的 API 來訪問,或者在使用一個 Couchbase Server SDK 時,通過相應的視圖查詢函數(shù)來訪問它。
查詢可通過 3 種主要選擇來執(zhí)行:
單獨的鍵。例如,顯示與某個特定鍵(比如 'unkind')匹配的信息。
鍵列表。您可提供一個鍵值數(shù)組,這將返回其鍵值與一個提供的值匹配的所有記錄。例如,['unkind','kind'] 將返回與其中一個單詞匹配的記錄。
鍵范圍。您可指定一個開始和結束鍵。
例如,要找到一個指定的單詞的數(shù)量,可使用 key 參數(shù)進行查詢:
http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout= 60000&limit=10&skip=0&key=%22breeze%22
Couchbase Server 會很自然地采用 UTF-8 排序方式輸出一個 MapReduce 的按指定的鍵排序的結果。這意味著您可以通過指定開始值和結束值來獲取一個值范圍。例如,要獲取 'breeze' 與 'kind' 之間的所有單詞,可使用:
http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout= 60000&limit=10&skip=0&startkey=%22breeze%22&endkey=%22kind%22
該查詢很簡單,但非常強大,尤其是在您認識到可以將它與靈活的視圖系統(tǒng)結合使用,生成具有您想要的格式的數(shù)據(jù)的時候。
結束語
Hadoop 本身提供了一個強大的處理平臺,但沒有提供從已處理的數(shù)據(jù)中實際提取有用信息的方法。通過將 Hadoop 連接到另一個系統(tǒng),可使用該系統(tǒng)來查詢和提取信息。因為 Hadoop 使用 MapReduce 進行相關處理,所以您可以通過 Couchbase Server 中的 MapReduce 系統(tǒng),利用 MapReduce 的知識來提供查詢平臺。使用此方法,您可以在 Hadoop 中處理數(shù)據(jù),以 JSON 文檔格式將數(shù)據(jù)從 Hadoop 導出到 Couchbase Server 中,然后在 Couchbase Server 中使用 MapReduce 查詢已處理的信息。
到此,關于“Hadoop和Couchbase怎么結合使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。