1. نظرة عامة
BigQuery هو مستودع بيانات إحصائية منخفض التكلفة من Google مُدار بالكامل على نطاق بيتابايت. BigQuery هو NoOps - لا توجد بنية أساسية لإدارتها ولا تحتاج إلى مشرف قاعدة بيانات - لذلك يمكنك التركيز على تحليل البيانات للعثور على إحصاءات ذات مغزى، واستخدام SQL المألوف، والاستفادة من نموذج الدفع حسب الاستخدام.
في هذا الدرس التطبيقي حول الترميز، ستستخدم مكتبة عميل Google Cloud BigQuery لطلب البحث عن مجموعات البيانات العامة في BigQuery باستخدام Node.js.
المعلومات التي ستطّلع عليها
- كيفية استخدام Cloud Shell
- كيفية تفعيل BigQuery API
- طريقة مصادقة طلبات البيانات من واجهة برمجة التطبيقات
- كيفية تثبيت مكتبة برامج BigQuery لنظام Node.js
- طريقة الاستعلام عن أعمال شكسبير
- كيفية الاستعلام عن مجموعة بيانات GitHub
- كيفية ضبط التخزين المؤقت وإحصاءات العرض
المتطلبات
استطلاع
كيف ستستخدم هذا البرنامج التعليمي؟
ما هو تقييمك لتجربتك في استخدام Node.js؟
ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud Platform؟
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من أنّه يمكن تشغيل أداة سطر أوامر Cloud SDK عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell .
إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. إذا كان الأمر كذلك، فانقر على متابعة (ولن تراه مرة أخرى مطلقًا). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة Cloud Shell، من المفترض أن ترى أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.
- شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list
مخرجات الأمر
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
مخرجات الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
مخرجات الأمر
Updated property [core/project].
3- تفعيل BigQuery API
يجب تفعيل BigQuery API تلقائيًا في جميع مشاريع Google Cloud. يمكنك التحقّق مما إذا كان ذلك صحيحًا باستخدام الأمر التالي في Cloud Shell:
gcloud services list
من المفترض أن يظهر لك BigQuery مدرجًا:
NAME TITLE
bigquery-json.googleapis.com BigQuery API
...
إذا لم تكن BigQuery API مفعّلة، يمكنك استخدام الأمر التالي في Cloud Shell لتفعيلها:
gcloud services enable bigquery-json.googleapis.com
4. مصادقة طلبات البيانات من واجهة برمجة التطبيقات
لإرسال طلبات إلى BigQuery API، عليك استخدام حساب الخدمة. ينتمي حساب الخدمة إلى مشروعك، وتستخدمه مكتبة برامج Google BigQuery Node.js لإرسال طلبات البيانات من واجهة برمجة التطبيقات BigQuery. مثل أي حساب مستخدم آخر، يتم تمثيل حساب الخدمة بعنوان بريد إلكتروني. في هذا القسم، ستستخدم حزمة تطوير البرامج (SDK) للسحابة الإلكترونية لإنشاء حساب خدمة، ثم إنشاء بيانات الاعتماد التي ستحتاج إلى المصادقة عليها باعتباره حساب الخدمة.
أولاً، عليك ضبط متغيّر بيئة باستخدام PROJECT_ID الذي ستستخدمه في هذا الدرس التطبيقي حول الترميز:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
بعد ذلك، يمكنك إنشاء حساب خدمة جديد للوصول إلى BigQuery API باستخدام:
gcloud iam service-accounts create my-bigquery-sa --display-name "my bigquery codelab service account"
بعد ذلك، أنشِئ بيانات اعتماد سيستخدمها رمز Node.js لتسجيل الدخول كحساب خدمة جديد. أنشئ بيانات الاعتماد هذه واحفظها كملف JSON "~/key.json" باستخدام الأمر التالي:
gcloud iam service-accounts keys create ~/key.json --iam-account my-bigquery-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
أخيرًا، اضبط متغيّر بيئة GOOGLE_APPLICATION_CREDENTIALS الذي تستخدمه مكتبة BigQuery API C# ضمن الخطوة التالية للعثور على بيانات الاعتماد. يجب ضبط متغيّر البيئة على المسار الكامل لملف JSON لبيانات الاعتماد الذي أنشأته. اضبط متغيّر البيئة باستخدام الأمر التالي:
export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"
يمكنك الاطّلاع على مزيد من المعلومات حول مصادقة BigQuery API.
5- إعداد التحكم في الوصول
تستخدم أداة BigQuery "إدارة الهوية وإمكانية الوصول" (IAM) لإدارة الوصول إلى الموارد. تتضمّن أداة BigQuery عددًا من الأدوار المحدَّدة مسبقًا (المستخدم ومالك البيانات ومُشاهد البيانات وما إلى ذلك) التي يمكنك تخصيصها لحساب الخدمة الذي أنشأته في الخطوة السابقة. يمكنك الاطّلاع على المزيد من المعلومات عن التحكّم في الوصول في مستندات BigQuery.
قبل أن تتمكّن من طلب البحث في مجموعات البيانات العامة، عليك التأكّد من أنّ حساب الخدمة يتضمّن دور bigquery.user على الأقل. في Cloud Shell، شغّل الأمر التالي لتعيين دور bigquery.user لحساب الخدمة:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member "serviceAccount:my-bigquery-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" --role "roles/bigquery.user"
يمكنك تشغيل الأمر التالي للتحقّق من منح دور المستخدم لحساب الخدمة:
gcloud projects get-iam-policy $GOOGLE_CLOUD_PROJECT
6- تثبيت مكتبة برامج BigQuery لنظام Node.js
أولاً، أنشئ مجلد "BigQueryDemo
" وانتقِل إليه:
mkdir BigQueryDemo
cd BigQueryDemo
بعد ذلك، أنشئ مشروع Node.js ستستخدمه لتشغيل نماذج مكتبة برامج BigQuery:
npm init -y
من المفترض أن يظهر لك مشروع Node.js الذي تم إنشاؤه:
{
"name": "BigQueryDemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
تثبيت مكتبة برامج BigQuery:
npm install --save @google-cloud/bigquery
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN BigQueryDemo@1.0.0 No description
npm WARN BigQueryDemo@1.0.0 No repository field.
+ @google-cloud/bigquery@2.1.0
added 69 packages from 105 contributors and audited 147 packages in 4.679s
found 0 vulnerabilities
أنت الآن جاهز لاستخدام مكتبة برامج BigQuery Node.js.
7. الاستعلام عن أعمال شكسبير
مجموعة البيانات العامة هي أي مجموعة بيانات يتم تخزينها في BigQuery وإتاحتها للجمهور العام. هناك العديد من مجموعات البيانات العامة الأخرى المتاحة لك لطلب البحث عنها، وتستضيف Google بعضها أيضًا، ولكن يتم استضافة الكثير منها بواسطة جهات خارجية. يمكنك قراءة المزيد في صفحة مجموعات البيانات العامة.
بالإضافة إلى مجموعات البيانات العامة، توفِّر أداة BigQuery عددًا محدودًا من نماذج الجداول التي يمكنك طلبها. يتم تضمين هذه الجداول في bigquery-public-data:samples dataset
. أحد هذه الجداول يسمى shakespeare.
ويحتوي على فهرس كلمات لأعمال شكسبير، مع تحديد عدد مرات ظهور كل كلمة في كل مجموعة.
في هذه الخطوة، ستقوم بالاستعلام عن جدول شيكسبير.
أولاً، افتح محرِّر الرموز من أعلى يسار Cloud Shell:
أنشئ ملف queryShakespeare.js
داخل المجلد BigQueryDemo
:
touch queryShakespeare.js
انتقِل إلى ملف queryShakespeare.js
وأدرِج الرمز التالي:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryShakespeare() {
// Queries a public Shakespeare dataset.
// Create a client
const bigqueryClient = new BigQuery();
// The SQL query to run
const sqlQuery = `SELECT word, word_count
FROM \`bigquery-public-data.samples.shakespeare\`
WHERE corpus = @corpus
AND word_count >= @min_word_count
ORDER BY word_count DESC`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
params: {corpus: 'romeoandjuliet', min_word_count: 250},
};
// Run the query
const [rows] = await bigqueryClient.query(options);
console.log('Rows:');
rows.forEach(row => console.log(row));
}
queryShakespeare();
}
main();
خذ دقيقة أو دقيقتين لدراسة التعليمة البرمجية ومعرفة كيفية الاستعلام عن الجدول.
مرة أخرى في Cloud Shell، شغِّل التطبيق:
node queryShakespeare.js
من المفترض أن تظهر لك قائمة بالكلمات ومواضع ورودها:
Rows:
{ word: 'the', word_count: 614 }
{ word: 'I', word_count: 577 }
{ word: 'and', word_count: 490 }
{ word: 'to', word_count: 486 }
{ word: 'a', word_count: 407 }
{ word: 'of', word_count: 367 }
{ word: 'my', word_count: 314 }
{ word: 'is', word_count: 307 }
...
8. الاستعلام عن مجموعة بيانات GitHub
للتعرّف أكثر على أداة BigQuery، عليك الآن إرسال طلب بحث في مجموعة بيانات GitHub العامة. يمكنك العثور على رسائل الالتزام الأكثر شيوعًا على GitHub. ستستخدم أيضًا واجهة مستخدم الويب لـ BigQuery لمعاينة وتشغيل طلبات البحث المخصصة.
لعرض البيانات، افتح مجموعة بيانات GitHub في واجهة مستخدم الويب في BigQuery:
للحصول على معاينة سريعة لشكل البيانات، انقر فوق علامة التبويب معاينة:
أنشئ ملف queryGitHub.js
داخل المجلد BigQueryDemo
:
touch queryGitHub.js
انتقِل إلى ملف queryGitHub.js
وأدرِج الرمز التالي:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryGitHub() {
// Queries a public GitHub dataset.
// Create a client
const bigqueryClient = new BigQuery();
// The SQL query to run
const sqlQuery = `SELECT subject AS subject, COUNT(*) AS num_duplicates
FROM \`bigquery-public-data.github_repos.commits\`
GROUP BY subject
ORDER BY num_duplicates
DESC LIMIT 10`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
};
// Run the query
const [rows] = await bigqueryClient.query(options);
console.log('Rows:');
rows.forEach(row => console.log(`${row.subject}: ${row.num_duplicates}`));
}
queryGitHub();
}
main();
خصِّص دقيقة أو دقيقتَين لدراسة الرمز البرمجي والتعرّف على الطريقة التي يتم بها البحث في الجدول عن رسائل الالتزام الأكثر شيوعًا.
مرة أخرى في Cloud Shell، شغِّل التطبيق:
node queryGitHub.js
من المفترض أن تظهر لك قائمة بالرسائل التي تم الالتزام بها ومواضع ورودها:
Rows:
Update README.md: 2572220
: 1985733
Initial commit: 1940228
Mirroring from Micro.blog.: 646772
update: 592520
Update data.json: 548730
Update data.js: 548354
...
9. التخزين المؤقت والإحصاءات
عند تشغيل استعلام، يخزن BigQuery النتائج في ذاكرة التخزين المؤقت. ونتيجةً لذلك، تستغرق طلبات البحث المتطابقة اللاحقة وقتًا أقل بكثير. يمكن تعطيل التخزين المؤقت باستخدام خيارات الاستعلام. يتتبع BigQuery أيضًا بعض الإحصائيات حول الاستعلامات مثل وقت الإنشاء ووقت الانتهاء وإجمالي وحدات البايت التي تمت معالجتها.
في هذه الخطوة، ستقوم بتعطيل التخزين المؤقت وعرض بعض الإحصائيات حول الاستعلامات.
انتقِل إلى ملف queryShakespeare.js
داخل مجلد "BigQueryDemo
" واستبدِل الرمز بما يلي:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryShakespeareDisableCache() {
// Queries the Shakespeare dataset with the cache disabled.
// Create a client
const bigqueryClient = new BigQuery();
const sqlQuery = `SELECT word, word_count
FROM \`bigquery-public-data.samples.shakespeare\`
WHERE corpus = @corpus
AND word_count >= @min_word_count
ORDER BY word_count DESC`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
params: {corpus: 'romeoandjuliet', min_word_count: 250},
useQueryCache: false,
};
// Run the query as a job
const [job] = await bigqueryClient.createQueryJob(options);
console.log(`Job ${job.id} started.`);
// Wait for the query to finish
const [rows] = await job.getQueryResults();
// Print the results
console.log('Rows:');
rows.forEach(row => console.log(row));
// Print job statistics
console.log('JOB STATISTICS:')
console.log(`Status: ${job.metadata.status.state}`);
console.log(`Creation time: ${job.metadata.statistics.creationTime}`);
console.log(`Start time: ${job.metadata.statistics.startTime}`);
console.log(`Statement type: ${job.metadata.statistics.query.statementType}`);
}
queryShakespeareDisableCache();
}
main();
بعض الأمور التي يجب ملاحظتها حول التعليمة البرمجية. أولاً، يتم إيقاف التخزين المؤقت من خلال ضبط UseQueryCache
على false
داخل الكائن options
. ثانيًا، قمت بالوصول إلى الإحصائيات حول الاستعلام من كائن الوظيفة.
مرة أخرى في Cloud Shell، شغِّل التطبيق:
node queryShakespeare.js
من المفترض أن تظهر لك قائمة بالرسائل التي تم الالتزام بها ومواضع ورودها. بالإضافة إلى ذلك، يُفترض أن ترى أيضًا بعض الإحصاءات حول طلب البحث:
Rows:
{ word: 'the', word_count: 614 }
{ word: 'I', word_count: 577 }
{ word: 'and', word_count: 490 }
{ word: 'to', word_count: 486 }
{ word: 'a', word_count: 407 }
{ word: 'of', word_count: 367 }
{ word: 'my', word_count: 314 }
{ word: 'is', word_count: 307 }
{ word: 'in', word_count: 291 }
{ word: 'you', word_count: 271 }
{ word: 'that', word_count: 270 }
{ word: 'me', word_count: 263 }
JOB STATISTICS:
Status: RUNNING
Creation time: 1554309220660
Start time: 1554309220793
Statement type: SELECT
10. تحميل البيانات في BigQuery
إذا كنت تريد إجراء طلبات بحث عن بياناتك، عليك أولاً تحميل بياناتك إلى BigQuery. يدعم BigQuery تحميل البيانات من العديد من المصادر مثل Google Cloud Storage أو خدمات Google الأخرى أو مصدر محلي قابل للقراءة. ويمكنك أيضًا بث بياناتك. يمكنك قراءة المزيد في صفحة تحميل البيانات إلى BigQuery.
في هذه الخطوة، سيتم تحميل ملف JSON مُخزَّن في Google Cloud Storage إلى جدول في BigQuery. يمكن العثور على ملف JSON في gs://cloud-samples-data/bigquery/us-states/us-states.json
.
إذا كان يهمّك معرفة محتوى ملف JSON، يمكنك استخدام أداة سطر أوامر gsutil
لتنزيل الملف في Cloud Shell:
gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .
Copying gs://cloud-samples-data/bigquery/us-states/us-states.json...
/ [1 files][ 2.0 KiB/ 2.0 KiB]
Operation completed over 1 objects/2.0 KiB.
يتضح لك أنّ الجدول يتضمّن قائمة الولايات الأمريكية، وأنّ كل ولاية هي عبارة عن كائن JSON في سطر منفصل:
less us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr": "AK"}
...
لتحميل ملف JSON هذا في BigQuery، أنشئ ملف createDataset.js
وملف loadBigQueryJSON.js
في المجلد BigQueryDemo
:
touch createDataset.js
touch loadBigQueryJSON.js
ثبِّت مكتبة برامج Node.js في Google Cloud Storage:
npm install --save @google-cloud/storage
انتقِل إلى ملف createDataset.js
وأدرِج الرمز التالي:
'use strict';
function main() {
// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
async function createDataset() {
const datasetId = "my_states_dataset3";
const bigqueryClient = new BigQuery();
// Specify the geographic location where the dataset should reside
const options = {
location: 'US',
};
// Create a new dataset
const [dataset] = await bigqueryClient.createDataset(datasetId, options);
console.log(`Dataset ${dataset.id} created.`);
}
createDataset();
}
main();
بعد ذلك، انتقِل إلى ملف loadBigQueryJSON.js
وأدرِج الرمز التالي:
'use strict';
function main() {
// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');
const datasetId = "my_states_dataset3";
const tableId = "my_states_table";
async function createTable(datasetId, tableId) {
// Creates a new table
// Create a client
const bigqueryClient = new BigQuery();
const options = {
location: 'US',
};
// Create a new table in the dataset
const [table] = await bigqueryClient
.dataset(datasetId)
.createTable(tableId, options);
console.log(`Table ${table.id} created.`);
}
async function loadJSONFromGCS(datasetId, tableId) {
// Import a GCS file into a table with manually defined schema.
// Instantiate clients
const bigqueryClient = new BigQuery();
const storageClient = new Storage();
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';
// Configure the load job.
const metadata = {
sourceFormat: 'NEWLINE_DELIMITED_JSON',
schema: {
fields: [
{name: 'name', type: 'STRING'},
{name: 'post_abbr', type: 'STRING'},
],
},
location: 'US',
};
// Load data from a Google Cloud Storage file into the table
const [job] = await bigqueryClient
.dataset(datasetId)
.table(tableId)
.load(storageClient.bucket(bucketName).file(filename), metadata);
// load() waits for the job to finish
console.log(`Job ${job.id} completed.`);
// Check the job's status for errors
const errors = job.status.errors;
if (errors && errors.length > 0) {
throw errors;
}
}
// createDataset(datasetId);
createTable(datasetId, tableId);
loadJSONFromGCS(datasetId, tableId);
}
main();
خصِّص دقيقة أو دقيقتَين لدراسة كيفية تحميل الرمز البرمجي لملف JSON وإنشاء جدول (باستخدام مخطط) في مجموعة بيانات.
مرة أخرى في Cloud Shell، شغِّل التطبيق:
node createDataset.js
node loadBigQueryJSON.js
يتم إنشاء مجموعة بيانات وجدول في BigQuery:
Table my_states_table created.
Job [JOB ID] completed.
للتأكّد من إنشاء مجموعة البيانات، يمكنك الانتقال إلى واجهة مستخدم الويب في BigQuery. يُفترض أن ترى مجموعة بيانات جديدة وجدولاً. إذا بدّلت إلى علامة التبويب معاينة في الجدول، يمكنك رؤية البيانات الفعلية:
11. تهانينا!
لقد تعلمت كيفية استخدام BigQuery باستخدام Node.js!
تَنظيم
لتجنُّب تحمُّل الرسوم المفروضة على حسابك على Google Cloud Platform مقابل الموارد المستخدَمة في عملية البدء السريع هذه:
- انتقِل إلى وحدة تحكُّم Cloud Platform.
- اختَر المشروع الذي تريد إيقافه، ثم انقر على "حذف". في الجزء العلوي: يؤدي هذا إلى تحديد موعد المشروع للحذف.
مزيد من المعلومات
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Node.js على Google Cloud Platform: https://cloud.google.com/nodejs/
- مكتبة برامج Node.js في Google BigQuery: https://github.com/googleapis/nodejs-bigquery
الترخيص
هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.